我想为动态类型语言创建一个解析器。
在我的野牛文件中,我有一个规则,runtimetyped
它是变量名或函数调用。
runtimetyped : T_ID { $$ = create_identifier($1); }
| call { $$ = $1; }
;
我还想在编译时做一些基本的类型检查。fe我不想允许这样的事情
x = "string" + 42 <= true;
在源代码中,我想创建一个编译时错误。
但是像
s = "string";
i = 42;
b = true;
x = s + i <= b;
应该会产生运行时错误。
我的方法是在语法中有不同的表达方式:
expression : bool_expression
| math_expression
| string_expression
;
并且其中任何一个expressions
都是由terms
,等建立的factors
。
afactor
也可以总是runtimetyped
导致reduce/reduce
错误的 a。
math_factor : numeric_literal { $$ = $1; }
| runtimetyped { $$ = $1; }
| T_LPAREN math_expression T_RPAREN { $$ = $2; }
;
bool_factor : T_BOOL { $$ = create_bool($1); }
| runtimetyped { $$ = $1; }
| compare { $$ = $1; }
| T_LPAREN bool_expression T_RPAREN { $$ = $2; }
;
string_expression : T_STRING { $$ = $1; }
| runtimetyped { $$ = $1; }
| string_expression T_STROP string_expression { $$ = create_expression($2, $1, $3); }
;
我用它运行它bison -v parser.y
。
谁能给我一个关于如何解决这个冲突和/或究竟是什么产生冲突的提示。
提前致谢。