+2006-08-10 Jürg Billeter <j@bitron.ch>
+
+ * 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 <j@bitron.ch>
* vala/valacodegenerator.vala: fix memory management in switch
%token PERCENT "%"
%token ABSTRACT "abstract"
+%token BASE "base"
%token BREAK "break"
%token CALLBACK "callback"
%token CASE "case"
%token STATIC "static"
%token STRUCT "struct"
%token SWITCH "switch"
+%token THIS "this"
%token VALA_TRUE "true"
%token TYPEOF "typeof"
%token USING "using"
%type <expression> member_access
%type <expression> invocation_expression
%type <expression> element_access
+%type <expression> this_access
+%type <expression> base_access
%type <expression> post_increment_expression
%type <expression> post_decrement_expression
%type <expression> object_creation_expression
| member_access
| invocation_expression
| element_access
+ | this_access
+ | base_access
| post_increment_expression
| post_decrement_expression
| object_creation_expression
}
;
+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
{
%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})
%%
"@"[[: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; }
"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; }
"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; }
}
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);
}
}
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);
}
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);