From 031af2cdb37d08f49112a5d7d0ed2148f3b64b58 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrg=20Billeter?= Date: Thu, 10 Aug 2006 20:48:38 +0000 Subject: [PATCH] support hexadecimal and octal integer literals, support hexadecimal escape MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2006-08-10 Jürg Billeter * vala/scanner.l: support hexadecimal and octal integer literals, support hexadecimal escape sequences, support BASE and THIS * vala/parser.y: use BASE and THIS keywords * vala/valasemanticanalyzer.vala: don't use new base keyword as variable name * vala/valacodegenerator.vala: simplify code * vala/valainterfacewriter.vala: obey base keyword svn path=/trunk/; revision=99 --- vala/ChangeLog | 10 ++++++++++ vala/vala/parser.y | 24 ++++++++++++++++++++++++ vala/vala/scanner.l | 35 ++++++++++++++++++++++++----------- vala/vala/valacodegenerator.vala | 8 +++----- vala/vala/valainterfacewriter.vala | 5 +++-- vala/vala/valasemanticanalyzer.vala | 4 ++-- 6 files changed, 66 insertions(+), 20 deletions(-) diff --git a/vala/ChangeLog b/vala/ChangeLog index 7e9f942..b427c7f 100644 --- a/vala/ChangeLog +++ b/vala/ChangeLog @@ -1,5 +1,15 @@ 2006-08-10 Jürg Billeter + * vala/scanner.l: support hexadecimal and octal integer literals, + support hexadecimal escape sequences, support BASE and THIS + * vala/parser.y: use BASE and THIS keywords + * vala/valasemanticanalyzer.vala: don't use new base keyword as variable + name + * vala/valacodegenerator.vala: simplify code + * vala/valainterfacewriter.vala: obey base keyword + +2006-08-10 Jürg Billeter + * vala/valacodegenerator.vala: fix memory management in switch statements * tests/test-020.vala: extend switch statement test diff --git a/vala/vala/parser.y b/vala/vala/parser.y index 591387b..1c82cd4 100644 --- a/vala/vala/parser.y +++ b/vala/vala/parser.y @@ -150,6 +150,7 @@ static void yyerror (YYLTYPE *locp, ValaParser *parser, const char *msg); %token PERCENT "%" %token ABSTRACT "abstract" +%token BASE "base" %token BREAK "break" %token CALLBACK "callback" %token CASE "case" @@ -184,6 +185,7 @@ static void yyerror (YYLTYPE *locp, ValaParser *parser, const char *msg); %token STATIC "static" %token STRUCT "struct" %token SWITCH "switch" +%token THIS "this" %token VALA_TRUE "true" %token TYPEOF "typeof" %token USING "using" @@ -213,6 +215,8 @@ static void yyerror (YYLTYPE *locp, ValaParser *parser, const char *msg); %type member_access %type invocation_expression %type element_access +%type this_access +%type base_access %type post_increment_expression %type post_decrement_expression %type object_creation_expression @@ -526,6 +530,8 @@ primary_expression | member_access | invocation_expression | element_access + | this_access + | base_access | post_increment_expression | post_decrement_expression | object_creation_expression @@ -613,6 +619,24 @@ element_access } ; +this_access + : THIS + { + ValaSourceReference *src = src(@1); + $$ = VALA_EXPRESSION (vala_member_access_new (NULL, "this", src)); + g_object_unref (src); + } + ; + +base_access + : BASE + { + ValaSourceReference *src = src(@1); + $$ = VALA_EXPRESSION (vala_member_access_new (NULL, "base", src)); + g_object_unref (src); + } + ; + post_increment_expression : primary_expression OP_INC { diff --git a/vala/vala/scanner.l b/vala/vala/scanner.l index dd00b34..c6e6d87 100644 --- a/vala/vala/scanner.l +++ b/vala/vala/scanner.l @@ -40,13 +40,24 @@ static gboolean file_comment = FALSE; %x IN_COMMENT -space [ \t\n]* -ident [[:alnum:]_]+ -literal_integer [[:digit:]]+ -literal_real [[:digit:]]+"."[[:digit:]]* -literal_character \'([^\'\\]|\\[\'\"\?\\abfnrtv])*\' -literal_string \"([^\"\\]|\\[\'\"\?\\abfnrtv])*\" -literal ({literal_integer}|{literal_real}|{literal_character}|{literal_string}) +space [ \t\n]* +ident [[:alnum:]_]+ +decimal_integer_literal (0|[1-9][[:digit:]]*) +real_literal [[:digit:]]+"."[[:digit:]]* +hex_digit [[:digit:]A-fa-f] +octal_digit [0-7] +octal_integer_literal 0{octal_digit}+ +hexadecimal_integer_literal 0x{hex_digit}+ +single_character [^\'\\] +single_string_literal_character [^\"\\] +simple_escape_sequence \\[\'\"\?\\abfnrtv] +hexadecimal_escape_sequence \\x{hex_digit}{hex_digit}?{hex_digit}?{hex_digit}? +character ({single_character}|{simple_escape_sequence}) +string_literal_character ({single_string_literal_character}|{simple_escape_sequence}) +character_literal \'{character}*\' +string_literal \"{string_literal_character}*\" +integer_literal ({decimal_integer_literal}|{hexadecimal_integer_literal}|{octal_integer_literal}) +literal ({integer_literal}|{real_literal}|{character_literal}|{string_literal}) %% @@ -115,6 +126,7 @@ literal ({literal_integer}|{literal_real}|{literal_character}|{literal_string} "@"[[:alnum:]_]+ { uploc; yylval->str = g_strdup (yytext + 1); return IDENTIFIER; } "abstract" { uploc; return ABSTRACT; } +"base" { uploc; return BASE; } "break" { uploc; return BREAK; } "callback" { uploc; return CALLBACK; } "case" { uploc; return CASE; } @@ -149,6 +161,7 @@ literal ({literal_integer}|{literal_real}|{literal_character}|{literal_string} "struct" { uploc; return STRUCT; } "switch" { uploc; return SWITCH; } "return" { uploc; return RETURN; } +"this" { uploc; return THIS; } "true" { uploc; return VALA_TRUE; } "typeof" { uploc; return TYPEOF; } "using" { uploc; return USING; } @@ -157,11 +170,11 @@ literal ({literal_integer}|{literal_real}|{literal_character}|{literal_string} "weak" { uploc; return WEAK; } "while" { uploc; return WHILE; } -{literal_real} { uploc; yylval->str = g_strdup (yytext); return REAL_LITERAL; } -{literal_integer} { uploc; yylval->str = g_strdup (yytext); return INTEGER_LITERAL; } +{real_literal} { uploc; yylval->str = g_strdup (yytext); return REAL_LITERAL; } +{integer_literal} { uploc; yylval->str = g_strdup (yytext); return INTEGER_LITERAL; } -{literal_character} { uploc; yylval->str = g_strdup (yytext); return CHARACTER_LITERAL; } -{literal_string} { uploc; yylval->str = g_strdup (yytext); return STRING_LITERAL; } +{character_literal} { uploc; yylval->str = g_strdup (yytext); return CHARACTER_LITERAL; } +{string_literal} { uploc; yylval->str = g_strdup (yytext); return STRING_LITERAL; } {ident} { uploc; yylval->str = g_strdup (yytext); return IDENTIFIER; } diff --git a/vala/vala/valacodegenerator.vala b/vala/vala/valacodegenerator.vala index 0a6a007..ec5b679 100644 --- a/vala/vala/valacodegenerator.vala +++ b/vala/vala/valacodegenerator.vala @@ -2075,11 +2075,9 @@ public class Vala.CodeGenerator : CodeVisitor { } public override void visit_postfix_expression (PostfixExpression! expr) { - if (expr.increment) { - expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, (CCodeExpression) expr.inner.ccodenode); - } else { - expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_DECREMENT, (CCodeExpression) expr.inner.ccodenode); - } + var op = expr.increment ? CCodeUnaryOperator.POSTFIX_INCREMENT : CCodeUnaryOperator.POSTFIX_DECREMENT; + + expr.ccodenode = new CCodeUnaryExpression (op, (CCodeExpression) expr.inner.ccodenode); visit_expression (expr); } diff --git a/vala/vala/valainterfacewriter.vala b/vala/vala/valainterfacewriter.vala index 5494cd2..0f030da 100644 --- a/vala/vala/valainterfacewriter.vala +++ b/vala/vala/valainterfacewriter.vala @@ -254,8 +254,9 @@ public class Vala.InterfaceWriter : CodeVisitor { } write_string (" "); - if (f.name == "callback" || f.name == "flags" || - f.name == "in" || f.name == "out") { + if (f.name == "base" || f.name == "callback" || + f.name == "flags" || f.name == "in" || + f.name == "out") { write_string ("@"); } write_identifier (f.name); diff --git a/vala/vala/valasemanticanalyzer.vala b/vala/vala/valasemanticanalyzer.vala index f7db01c..0c4ad2f 100644 --- a/vala/vala/valasemanticanalyzer.vala +++ b/vala/vala/valasemanticanalyzer.vala @@ -585,8 +585,8 @@ public class Vala.SemanticAnalyzer : CodeVisitor { } if (expr.inner is MemberAccess) { - var base = (MemberAccess) expr.inner; - base_symbol = base.symbol_reference; + var base_expr = (MemberAccess) expr.inner; + base_symbol = base_expr.symbol_reference; if (base_symbol.node is Namespace || base_symbol.node is DataType) { expr.symbol_reference = base_symbol.lookup (expr.member_name); -- 2.7.4