diff --git a/parse.leg b/parse.leg index f28e85d..4333b28 100644 --- a/parse.leg +++ b/parse.leg @@ -23,7 +23,8 @@ _DO(setMemberBitor) _DO(setMemberBitxor) _DO(setMemberBitand) _DO(setMemberShleft) _DO(setMemberShright) \ _DO(setIndexAdd) _DO(setIndexSub) _DO(setIndexMul) _DO(setIndexDiv) _DO(setIndexMod) \ _DO(setIndexBitor) _DO(setIndexBitxor) _DO(setIndexBitand) _DO(setIndexShleft) _DO(setIndexShright) \ - _DO(return) _DO(break) _DO(continue) + _DO(return) _DO(break) _DO(continue) \ + _DO(literal) typedef enum { t_UNDEFINED=0, @@ -429,6 +430,13 @@ oop newContinue(void) return obj; } +oop newLiteral(oop exp) +{ + oop obj = newObject(literal_proto); + map_set(obj, value_symbol, exp); + return obj; +} + // this always creates the key in "object" oop newVariable(oop object, oop key, oop value) { @@ -473,6 +481,8 @@ void error(char *text) exit(1); } +oop eval(oop scope, oop ast); + %} start = - ( e:stmt { yylval = e } @@ -653,6 +663,8 @@ value = n:NUMBER { $$ = n } | NULL { $$ = null } | i:IDENT { $$ = newGetVariable(i) } | LPAREN i:exp RPAREN { $$ = i } + | BACKTICK e:exp { $$ = newLiteral(e) } + | AT e:exp { $$ = eval(globals, e) } STRING = SQUOTE < (!SQUOTE char)* > SQUOTE { $$ = makeString(unescape(yytext)) } | DQUOTE < (!DQUOTE char)* > DQUOTE { $$ = makeString(unescape(yytext)) } @@ -743,6 +755,8 @@ COLON = ':' - SEMICOLON = ';' - COMMA = ',' - DOT = '.' - +BACKTICK= '`' - +AT = '@' - LCB = '{' - RCB = '}' - LBRAC = '[' - @@ -911,6 +925,10 @@ oop eval(oop scope, oop ast) } return map; } + case t_literal: { + oop obj = map_get(ast, value_symbol); + return obj; + } case t_declaration: { oop lhs = map_get(ast, lhs_symbol); oop rhs = eval(scope, map_get(ast, rhs_symbol));