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

C++ 运行时确定bison/yacc的非终结符号的类型,c++,bison,flex-lexer,yacc,C++,Bison,Flex Lexer,Yacc,我想解析这样的字符串“!x.z”和“x.y>1”, “x.z”的类型是bool,“x.y”的类型是int,但“x.z”或“x.y”的类型是在运行时确定的 x为对象名称,z为属性名称,y为属性名称,属性名称类型由其他代码注册 我可以使用函数createxpr创建一个Expr*,Expr是IntExpr和BoolExpr的基类 CreteExpr根据登记的信息包装IntExpr或BoolExpr Expr* CreateExpr(string obj, string attr) { typ

我想解析这样的字符串“!x.z”和“x.y>1”,
“x.z”的类型是bool,“x.y”的类型是int,但“x.z”或“x.y”的类型是在运行时确定的

x为对象名称,z为属性名称,y为属性名称,属性名称类型由其他代码注册

我可以使用函数createxpr创建一个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); }
int_expr:obj_attr_expr{$=dynamica_cast($1);}
bool_epxr:int_expr'>'int_expr{$$=new morerar($1,$3);}
| '!' bool_expr{$$=newnotexpr($2);}
|obj_attr_expr{$$=dynamica_cast($1);}
|obj_attr_expr>int_expr{$$=new Greater(dynamica_cast($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返回给语法分析器,但我想将此函数移动到语法分析器

在语法中这样编码表达式的类型通常不是一个好主意。只需定义一个
expr
规则,让类型检查器负责区分不同的类型。运行时不需要它。您在编译时就已经拥有了它,然后将它扔掉了。