[英]Implementing Multiple Return Types in BISON Semantic Rules
我正在BISON中構建一個AST,並創建了用於處理構建樹的類。 我使用了一些繼承的類來存儲不同的信息(AddExprNode存儲一個op(即“+”),LiteralNode存儲一個文字“1.49”等)這些繼承自超類ASTNode。
我已經為我正在構建我的解析器(Micro。)的語言提供了一個語法文件。當我收到一個文字,變量或完整表達式作為主要的返回類型時,我遇到了一個問題。
primary : _OPAREN expr _CPAREN {
$<node>$ = $2;
};
| id {
$<var_node>$ = new VarRefNode($1, ASTNodeType::VAR_REF);
};
| _INTLITERAL {
$<lit_node>$ = new LiteralNode(LiteralType::isINT, $1, ASTNodeType::LITERAL);
//$$->printNode();
};
| _FLOATLITERAL {
$<lit_node>$ = new LiteralNode(LiteralType::isFLOAT, $1, ASTNodeType::LITERAL);
};
這是我的聯合聲明和類型定義:
%type <s> id str var_type any_type
%type <node> expr_prefix factor factor_prefix postfix_expr expr primary expr_list expr_list_tail call_expr
%type <add_node> addop
%type <mul_node> mulop
%type <var_node> primary
%type <lit_node> primary
%type <s_table> decl var_decl param_decl_tail param_decl_list
%type <s_entry> string_decl param_decl
%type <str_list> id_list id_tail
%type <st_list> func_declarations if_stmt stmt stmt_list func_body func_decl else_part loop_stmt while_stmt
%union{
SymbolTableEntry * s_entry;
char * s;
SymbolTable * s_table;
std::vector<SymbolTable *> * st_list;
std::vector<char *> * str_list;
ASTNode * node;
AddExprNode * add_node;
MulExprNode * mul_node;
VarRefNode * var_node;
LiteralNode * lit_node;
}
如上所示,BISON不允許您根據您在規則中遇到的令牌,使單個規則(如主要規則)的返回類型($$)不同。
有沒有辦法實現這個目標? 我的google-fu和閱讀BISON手冊的能力似乎讓我失望了。
ASTNode * node; AddExprNode * add_node; MulExprNode * mul_node; VarRefNode * var_node; LiteralNode * lit_node;
ASTNode *
類型的變量可以存儲指向ASTNode
的任何子類的實例的指針。 所以你可以擺脫上面的所有foo_node
定義,只需保留ASTNode * node;
定義並存儲該節點中的所有節點。
這樣,您的primary
規則的類型可以只是node
並且沒有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.