2015-06-29 27 views
-1

我一个解析器柔性&野牛的工作这是应该分析其具有具有不同的语法不同部分的源代码柔性+野牛,切片。有不同的语法

想起PHP中,这仅仅是“愚蠢的”转储一切,直到它找到一个 <?php,那么它进入实际分析的东西,当它找到一个?>它可以追溯到倾销语法部分。

因此,虽然我是“倾销”一节中,扫描仪只提供原始字符串。有意义的令牌(WHILE,OPENPARENTHESIS,标识符等)应该只在句法章节中提供和\开始句法部分。

我发现,你可以给不同的柔性规则"start conditions", 这样我就可以基本上不同的扫描仪之间像

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

这真的是我需要在这里切换。

我的问题是,语法部分的到底能不能用正则表达式来描述,所以这个决定不能在扫描仪内完成,它必须由分析器进行。我基本上希望它回到“在规则之间”的转储模式。所以,我要像做

CODEELEMENT: FOR OPEN STATEMENT SEMICOLON BOOL SEMICOLON STATEMENT CLOSE <<GO TO DUMP MODE>> ELEMENT 

你大概就知道,这应该成为这样的事情在C for循环的规则,但“身”(元素)应该被读作为转储再次(这将只提供一个字符,除非你分组多个字符再次与{和})

我知道野牛可以执行代码“在规则之间”,我试图声明一个全局变量)“dumpmode”,把{dumpmode = true;}放入这样的规则中

CODEELEMENT: FOR OPEN STATEMENT SEMICOLON BOOL SEMICOLON STATEMENT CLOSE {dumpmode = true;} ELEMENT 

,把

if(dumpmode) 
{ 
    BEGIN(dump); 
    dumpmode = false; 
} 

中的柔性规则前(这类似于页我在上面链接的示例)

但是,这并不工作,它实际上是有意义的 - AFAIK野牛已经需要最后一个元素令牌来决定使用规则(所以令牌到来之前的代码不会被执行),但此令牌只能通过转储模式,这是不是在活跃的过程中这一点产生。

你知道一个办法吗?在规则之间切换来自野牛代码的flexer的开始条件?也许我需要打破野牛规则除了像

CODEELEMENT: FOR1 FOR2 
    ; 
FOR1: FOR OPEN STATEMENT SEMICOLON BOOL SEMICOLON STATEMENT CLOSE {dumpmode = true;} 
    ; 
FOR2: ELEMENT 
    ; 

,但我不认为这种做法将与IF-THEN-ELSE结构...

回答