diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-10-03 15:53:51 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-10-03 17:34:59 +0300 |
commit | 65dc49e829ccc712c6b7f4114dcfeb7c0a0e90fb (patch) | |
tree | 40d759fd187226471e8b79d16395d9d6ba601903 | |
parent | 1026a8cc51d8c72a2237ce06467fd84fe3c303f9 (diff) | |
download | mailfromd-65dc49e829ccc712c6b7f4114dcfeb7c0a0e90fb.tar.gz mailfromd-65dc49e829ccc712c6b7f4114dcfeb7c0a0e90fb.tar.bz2 |
Implement explicit type casts: TYPE(expr)
* mfd/gram.y: (atom_expr: T_TYPECAST '(' expr ')'): New rule.
* mfd/lex.l: New token T_TYPECAST
-rw-r--r-- | mfd/gram.y | 10 | ||||
-rw-r--r-- | mfd/lex.l | 2 |
2 files changed, 9 insertions, 3 deletions
@@ -286,7 +286,7 @@ _create_alias(void *item, void *data) %} %error-verbose -%expect 53 +%expect 48 %union { struct literal *literal; @@ -414,7 +414,7 @@ _create_alias(void *item, void *data) %token <number> T_ARG "$n" T_NUMBER "number" T_BACKREF "back reference" %token <builtin> T_BUILTIN "builtin function" T_BUILTIN_PROC "builtin procedure" T_BUILTIN_P "builtin" %token <function> T_FUNCTION "function" T_FUNCTION_PROC "void function" T_FUNCTION_P "function operator" -%token <type> T_TYPE "data type" +%token <type> T_TYPE "data type" T_TYPECAST "typecast" %token <var> T_VARIABLE "variable" %token <string> T_SHARPREQR %token T_BOGUS @@ -1685,7 +1685,7 @@ common_expr: concat_expr ; concat_expr: simp_expr - | concat_expr simp_expr + | concat_expr simp_expr %prec '.' { if (($1->type == node_type_string || $1->type == node_type_strcat) @@ -1767,6 +1767,10 @@ atom_expr : funcall { $$ = $2; } + | T_TYPECAST '(' expr ')' + { + $$ = cast_to($1, $3); + } | atom | '-' simp_expr %prec T_UMINUS { @@ -524,6 +524,8 @@ func return keyword(T_FUNC); switch return keyword(T_SWITCH); case return keyword(T_CASE); default return keyword(T_DEFAULT); +string/[ \t]*\( { yylval.type = dtype_string; return T_TYPECAST; } +number/[ \t]*\( { yylval.type = dtype_number; return T_TYPECAST; } string { yylval.type = dtype_string; return T_TYPE; } number { yylval.type = dtype_number; return T_TYPE; } const return keyword(T_CONST); |