2011-05-03 36 views
1

我必须解析多个文件,每种情况下都有不同的规则。那就是:我在处理文件时需要一些规则才能工作,并在之后被禁用。Lex:多个文件,不同的规则

我可以简单的使用一个全局变量来跟踪程序的状态,并有我的规则决定自己的身体是否做任何有用与否,像这里面:

%{ 
    static int state; 
%} 

%% 
{something} { 
    if (state == SOMETHING_STATE) ... 
} 

{something_else} { 
    if (state == SOMETHING_ELSE_STATE) ... 
} 
%% 

我猜有尽管如此,更好的方法是做到这一点。在那儿?

回答

1

你要开始的状态 - 基本上法有一个内置state变量,你可以注释规则,只在某些国家

射击
%s state1 
%s state2 
%s state3 

%% 

<state1>{something} { // this rule matches only in state1 
         // change to state2 
         BEGIN(state2); } 

<state1,state3>{something_else} { // this rule matches in state1 or state 3 } 

{more_stuff}  { // this rule matches in all states } 

您可以在此找到文档中任何法或弯曲的书,或在online flex documentation

1

假设您使用的是Flex之类的东西,而不是原始的lex,则可以使用start states。当你解析某些改变你解析的方式时,你输入一个状态来做解析,然后用这个状态标记适当的规则。当你解析什么标志着状态的结束,你去做另:

{state_signal} { BEGIN(STATE2); } 

<STATE2>{something} { handle_something(); } 

<STATE2>{state3_signal} { BEGIN(STATE3); } 

<STATE3>{something} {handle_something2(); } 
<STATE3>{whatever} { BEGIN(START); } 
+0

原lex有启动状态。 Flex添加了一些附加功能,如独占状态。 – 2011-05-04 16:47:23

0

使用Flex和Yacc你也可以建立diferent个人解析器和调整makefile文件,以便将它们编译成一个可执行文件。我相信你只使用Flex,但这也应该是可能的。

我不能确切地知道如何做到这一点,但我已经在很久以前就已经做到了,所以如果你环顾四周,你会找到一个方法。基本上,您必须使用不同的前缀(-P)编译每个解析器,并且这将生成不同的命名解析函数和不同的全局变量以供解析器使用。

+0

http://stackoverflow.com/q/2480895/735948如果您想要了解更多解决方案。 – 2011-05-03 11:47:43

相关问题