4

我想從一個野牛語法構建一個AST。野牛正確生成解析器,但是當我嘗試解析示例代碼一些數學運算以下錯誤的打印:bisonC++多態性遺傳

[Fatal] calling `.get<Tag__::EXPR>()', but Tag INT is encountered. 

調試後,我發現這個問題是在expr非終端與以下生產:

expr: 
     ... 
    | operator 
     { 
     $$ = $1; 
     } 

而且operator有以下生產本身:

operator: 
    ... 
| INTEGER 
    { 
    $$ = new ast::expression::IntASTNode(std::stoi(d_scanner.matched())); 
    } 

我使用多態小號語義類型exproperator標有EXPR,對ExprASTNode作出響應類型witch是IntASTNode的基類,標記INT。我猜測野牛從標籤中獲取類型並在進行任何投射之前檢查標籤。有什麼辦法可以解決這個問題嗎?

回答

1

如果通過對被此分配:

operator: 
    ... 
     | INTEGER 
      { 
      $$(ast::expression::IntASTNode(std::stoi(d_scanner.matched()))); 
      } 

然後bisonc++,使該$$的語義值和從$$(expr)一間static_cast。有關bisonc++ manual的更多信息。