aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-10-03 15:53:51 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2009-10-03 17:34:59 +0300
commit65dc49e829ccc712c6b7f4114dcfeb7c0a0e90fb (patch)
tree40d759fd187226471e8b79d16395d9d6ba601903
parent1026a8cc51d8c72a2237ce06467fd84fe3c303f9 (diff)
downloadmailfromd-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.y10
-rw-r--r--mfd/lex.l2
2 files changed, 9 insertions, 3 deletions
diff --git a/mfd/gram.y b/mfd/gram.y
index 32d79f57..55a5e765 100644
--- a/mfd/gram.y
+++ b/mfd/gram.y
@@ -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
{
diff --git a/mfd/lex.l b/mfd/lex.l
index 96802bbe..f45753e5 100644
--- a/mfd/lex.l
+++ b/mfd/lex.l
@@ -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);

Return to:

Send suggestions and report system problems to the System administrator.