Bison if 语句 - 在解析块语句之前设置符号 table
Bison if statements - setting symbol table prior to parsing block statements
在我的语言中,我能够在当前符号 table 范围内声明一个变量,并创建一个 if 语句,该语句将为它的语句生成一个新的符号 table 范围。
stmts : stmt { $$ = new Block(); $$->addStatement(); }
| stmts stmt { ->addStatement(); }
| /*blank*/ { $$ = new Block(); }
;
stmt : vardecl
| ifstmt
;
ifstmt : TIF TLPAREN exprBase TRPAREN TOPENBLOCK stmts TCLOSEBLOCK {
semanticAnalyzerParser->enterScope("if statement scope");
$$ = new IfStatement(, );
}
;
assign : ident ident TASSIGN exprBase {
Var* typeName = ;
Var* varName = ;
ExpressionBase* exprBase = ;
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, varName->identifier, exprBase);
声明它
但是,由于bison必须识别if语句的完整语法,它只是在解析完成后才创建范围,从而将变量注册到错误的范围。
如何在解析 ifstmt
语法的 stmts
部分之前执行代码,以便设置正确的范围?我知道一种选择是之后遍历 AST 树,但我想避免这种情况,因为在 bison 中创建的 AST 很大程度上取决于语义分析中收集的信息。
通常您会使用“嵌入式”操作来执行此操作:
ifstmt : TIF TLPAREN exprBase TRPAREN {
semanticAnalyzerParser->enterScope("if statement scope"); }
TOPENBLOCK stmts TCLOSEBLOCK {
semanticAnalyzerParser->leaveScope("if statement scope");
$$ = new IfStatement(, ); }
;
在 ifstmt
的第一部分被识别后(直到 TRPAREN,TOPENBLOCK 作为先行),在主体 (stmts
) 被解析之前,嵌入的动作将被执行。
在我的语言中,我能够在当前符号 table 范围内声明一个变量,并创建一个 if 语句,该语句将为它的语句生成一个新的符号 table 范围。
stmts : stmt { $$ = new Block(); $$->addStatement(); }
| stmts stmt { ->addStatement(); }
| /*blank*/ { $$ = new Block(); }
;
stmt : vardecl
| ifstmt
;
ifstmt : TIF TLPAREN exprBase TRPAREN TOPENBLOCK stmts TCLOSEBLOCK {
semanticAnalyzerParser->enterScope("if statement scope");
$$ = new IfStatement(, );
}
;
assign : ident ident TASSIGN exprBase {
Var* typeName = ;
Var* varName = ;
ExpressionBase* exprBase = ;
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, varName->identifier, exprBase);
但是,由于bison必须识别if语句的完整语法,它只是在解析完成后才创建范围,从而将变量注册到错误的范围。
如何在解析 ifstmt
语法的 stmts
部分之前执行代码,以便设置正确的范围?我知道一种选择是之后遍历 AST 树,但我想避免这种情况,因为在 bison 中创建的 AST 很大程度上取决于语义分析中收集的信息。
通常您会使用“嵌入式”操作来执行此操作:
ifstmt : TIF TLPAREN exprBase TRPAREN {
semanticAnalyzerParser->enterScope("if statement scope"); }
TOPENBLOCK stmts TCLOSEBLOCK {
semanticAnalyzerParser->leaveScope("if statement scope");
$$ = new IfStatement(, ); }
;
在 ifstmt
的第一部分被识别后(直到 TRPAREN,TOPENBLOCK 作为先行),在主体 (stmts
) 被解析之前,嵌入的动作将被执行。