微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bison if 语句 - 在解析块语句之前设置符号表

如何解决Bison if 语句 - 在解析块语句之前设置符号表

在我的语言中,我能够在当前符号表范围内声明一个变量,并创建一个 if 语句,该语句将为它的语句生成一个新的符号表范围。

stmts : stmt { $$ = new Block(); $$->addStatement($1); }
      | stmts stmt { $1->addStatement($2); }
      | /*blank*/ { $$ = new Block(); }
      ;

stmt : vardecl
     | ifstmt
     ;

ifstmt : TIF TLPAREN exprBase TRPAREN TOPENBLOCK stmts TCLOSEBLOCK {
                                                                     semanticAnalyzerParser->enterScope("if statement scope");
                                                                     $$ = new IfStatement($3,$7);
                                                                   }
       ;

assign :  ident ident TASSIGN exprBase {
                                        Var* typeName = $1;
                                        Var* varName = $2;
                                        ExpressionBase* exprBase = $4;
                                        semanticAnalyzerParser->getScope()->registerVariable(typeName->identifier,varName->identifier,exprBase);
                                        $$ = new VarDecl(typeName,varName,exprBase);
       }
       ;

我想做的是在 bison 进入 if 语句块之前设置一个新的作用域。例如。 semanticAnalyzerParser->enterScope("if statement scope");,这样当声明变量的语法被识别时,它会用 semanticAnalyzerParser->getScope()->registerVariable(typeName->identifier,exprBase);

在正确的范围内声明它

但是,由于 bison 必须识别 if 语句的完整语法,因此它仅在解析完成后才创建作用域,从而将变量注册错误的作用域中。

如何在解析 stmts 语法的 ifstmt 部分之前执行代码,以便它可以设置正确的范围?我知道一种选择是之后遍历 AST 树,但我想避免这种情况,因为在野牛中创建的 AST 在很大程度上取决于语义分析中收集的信息。

解决方法

通常您会使用“嵌入式”操作来执行此操作:

ifstmt : TIF TLPAREN exprBase TRPAREN {
                 semanticAnalyzerParser->enterScope("if statement scope"); }
         TOPENBLOCK stmts TCLOSEBLOCK {
                 semanticAnalyzerParser->leaveScope("if statement scope");
                 $$ = new IfStatement($3,$7); }
   ;

嵌入的动作将在 ifstmt 的第一部分被识别后(直到 TRPAREN,TOPENBLOCK 作为前瞻),在正文 (stmts) 被解析之前执行。>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。