浏览代码

Add experimental literal ast inside programs

master
mtardy 4 年前
父节点
当前提交
8aa2318855
共有 1 个文件被更改,包括 19 次插入1 次删除
  1. +19
    -1
      parse.leg

+ 19
- 1
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));

正在加载...
取消
保存