我想解析这样的字符串“!x.z”和“ x.y> 1”,
“ x.z”的类型为bool,“ x.y”的类型为int,但“ x.z”或“ x.y”的类型在运行时确定;
x是OBJ_NAME,z是y,而y是ATTR_NAME,则ATTR_NAME的类型已由其他代码注册;
我可以使用CreateExpr函数创建一个Expr *,Expr是IntExpr和BoolExpr的基类, CreteExpr根据已注册的信息创建IntExpr或BoolExpr;
Expr* CreateExpr(string obj, string attr)
{
type = queryType(obj, attr);
if(type == INT) return IntExpr(...);
if(type == BOOL) return BoolExpr(...);
}
我想要这样的语法:
int_expr : obj_attr_expr { $$ = dynamica_cast<IntExpr*>($1); }
bool_epxr : int_expr '>' int_expr { $$ = new Greater($1, $3); }
| '!' bool_expr { $$ = new NotExpr($2); }
| obj_attr_expr { $$ = dynamica_cast<BoolExpr*>($1); }
| obj_attr_expr > int_expr { $$ = new Greater(dynamica_cast<IntExpr*>($1), $3); }
obj_attr_expr : OBJ_NAME '.' ATTR_NAME { $$ = CreateExpr($1, $3); }
实际上,这是错误的语法,因为它不能确定obj_attr_expr是int_expr还是bool_expr。
有解决办法吗?
现在,我解析“ OBJ_NAME'。”词法分析器中的“ ATTR_NAME”,然后将int_expr或bool_expr返回到语法分析器,但是我想将此函数移至语法分析器。