From 8aa23188554297314947528d50abc9bc9014d6d2 Mon Sep 17 00:00:00 2001 From: mtardy Date: Wed, 12 Aug 2020 23:51:33 +0200 Subject: [PATCH] Add experimental literal ast inside programs --- parse.leg | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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));