2011-05-03 51 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