簡體   English   中英

在BISON語義規則中實現多種返回類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM