我正在开发一个类的项目,我们必须在其中构建一个解析器。我们目前正处于在yacc中构建解析器的阶段。目前令我困惑的是我读过你需要为每个非终端分配一个类型。在某些情况下,虽然我会有类似的东西:
...
%union {
Type dataType;
int integerConstant;
bool boolConstant;
char *stringConstant;
double doubleConstant;
char identifier[MaxIdentLen+1]; // +1 for terminating null
Decl *decl;
List<Decl*> *declList;
}
%token <identifier> T_Identifier
%token <stringConstant> T_StringConstant
%token <integerConstant> T_IntConstant
%token <doubleConstant> T_DoubleConstant
%token <boolConstant> T_BoolConstant
...
%%
...
Expr : /* some rules */
| Constant { /* Need to figure out what to do here */ }
| /* some more rules */
;
Constant : T_IntConstant { $$=$1 }
| T_DoubleConstant { $$=$1 }
| T_BoolConstant { $$=$1 }
| T_StringConstant { $$=$1 }
| T_Null { $$=$1 }
...
如何将类型赋予expr,因为它有时不能是整数或双数,或者bool等?
答案 0 :(得分:4)
您可以通过
在规则中添加类型TypesConstant : T_IntConstant { $<integerConstant>$=$1 }
| T_DoubleConstant { $<doubleConstant>$=$1 }
| ...
有关详细信息,请参阅http://www.gnu.org/software/bison/manual/html_node/Action-Types.html#Action-Types。