add field specifiers
[ccc.git] / parse.y
diff --git a/parse.y b/parse.y
index 9c24ef0..c79a1ec 100644 (file)
--- a/parse.y
+++ b/parse.y
@@ -26,8 +26,8 @@ int yywrap()
 
 //%define parse.error verbose
 %token ASSIGN BCLOSE BINAND BINOR BOOL BOPEN CCLOSE CHAR COMMA CONS COPEN
-%token DIVIDE ELSE IDENT IF INTEGER INVERSE MINUS MODULO NIL PLUS POWER RETURN
-%token SEMICOLON TIMES VAR WHILE
+%token DIVIDE DOT ELSE IDENT IF INTEGER INVERSE MINUS MODULO NIL PLUS POWER
+%token RETURN SEMICOLON TIMES VAR WHILE
 
 %parse-param { struct ast **result }
 
@@ -92,6 +92,10 @@ stmt
        | RETURN SEMICOLON { $$ = ast_return(NULL); }
        ;
 
+field
+       : { $$ = NULL; }
+       | field DOT IDENT { $$ = ast_cons($3, $1); }
+
 expr
        : expr BINOR expr { $$ = ast_binop($1, binor, $3); }
        | expr BINAND expr { $$ = ast_binop($1, binand, $3); }
@@ -109,12 +113,12 @@ expr
        | expr MODULO expr { $$ = ast_binop($1, modulo, $3); }
        | expr POWER expr { $$ = ast_binop($1, power, $3); }
        | MINUS expr { $$ = ast_unop(negate, $2); }
-       | INVERSE expr { $$ = ast_unop(inverse, $2); }
+       | INVERSE expr %prec TIMES { $$ = ast_unop(inverse, $2); }
        | BOPEN expr BCLOSE { $$ = $2; }
        | IDENT BOPEN fargs BCLOSE { $$ = ast_funcall($1, ast_list($3)); }
        | INTEGER
        | BOOL
        | CHAR
-       | IDENT
+       | IDENT field { $$ = ast_ident($1, ast_list($2)); }
        | NIL { $$ = ast_nil(); }
        ;