运行时确定bison / yacc的非终结符的类型

时间:2018-07-26 14:22:40

标签: c++ bison flex-lexer yacc

我想解析这样的字符串“!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返回到语法分析器,但是我想将此函数移至语法分析器。

0 个答案:

没有答案