Bison flex+;野牛,不同语法的部分

Bison flex+;野牛,不同语法的部分,bison,flex-lexer,Bison,Flex Lexer,我正在flex&bison中开发一个解析器,它应该解析具有不同语法的不同部分的源代码 想想php,它只是“愚蠢地”转储所有内容,直到找到一个 它返回到转储 因此,当我处于“转储”部分时,扫描仪应该只提供原始字符串。有意义的标记(WHILE、开括号、标识符等)只应在语法部分中提供,并且\启动语法部分 我发现你可以给灵活的规则不同, 所以我基本上可以在不同的扫描仪之间切换,比如 %x semantic %x dump %% <dump>"\\" { BEGIN(semant

我正在flex&bison中开发一个解析器,它应该解析具有不同语法的不同部分的源代码

想想php,它只是“愚蠢地”转储所有内容,直到找到一个
它返回到转储

因此,当我处于“转储”部分时,扫描仪应该只提供原始字符串。有意义的标记(WHILE、开括号、标识符等)只应在语法部分中提供,并且\启动语法部分

我发现你可以给灵活的规则不同, 所以我基本上可以在不同的扫描仪之间切换,比如

%x semantic
%x dump
%%
<dump>"\\"        { BEGIN(semantic); }
<dump>.           { (*yylval).stringvalue = yytext; return yy::parser::token::CHAR;}
<semantic>"while" {return yy::parser::token::WHILE;}

if(dumpmode)
{
    BEGIN(dump);
    dumpmode = false;
}
在flex规则前面(这类似于我上面链接的页面上的示例)

但这不起作用,而且它实际上是有意义的——AFAIK bison已经需要最终元素令牌来决定使用该规则(因此在令牌到来之前不会执行代码),但该令牌将仅由转储模式生成,而转储模式在该过程中不处于活动状态

你知道怎么做吗?在规则之间从bison代码切换flexer的启动条件?也许我需要打破野牛的规矩

CODEELEMENT: FOR1 FOR2
    ;
FOR1: FOR OPEN STATEMENT SEMICOLON BOOL SEMICOLON STATEMENT CLOSE {dumpmode = true;}
    ;
FOR2: ELEMENT
    ;
但是我认为这种方法不适用于if-then-else构造…

您是否尝试过这个函数,从Bison部分调用它

if(dumpmode)
{
    BEGIN(dump);
    dumpmode = false;
}
CODEELEMENT: FOR1 FOR2
    ;
FOR1: FOR OPEN STATEMENT SEMICOLON BOOL SEMICOLON STATEMENT CLOSE {dumpmode = true;}
    ;
FOR2: ELEMENT
    ;