2015-04-23 48 views
0

我有一個很大的文本文檔,裏面有一些純文本和類的定義。我想要的是使用flex/bison將類定義從純文本中分離出來。如何用flex/bison跳過不必要的文本序列?

我想下一個提示:

test.l 
... 
"class" : { return CLASS;} 
"aligned": { return ALIGNED;} 
"extends": { return EXTENDS;} 
... 
.* {return UNKNOWN;} 

test.y 
DocText : plainText 
| classDefinitions 
| plainText classDefinitions DocText 
{ printf (" parsed iso doc!\n");}; 

plainText: UNKNOWN | UNKNOWN plainText; 

這是行不通的。任何人都可以請給我一些關於如何解決這個問題的建議。 PS:對不起,我的英文不好。

+0

歡迎使用Stackoverflow!爲了讓你知道,「flex」標籤指的是Adobe Flex;對於你的問題,「flex-lexer」標籤更好。 – Brian

回答

1
  1. 不要在flex模式中使用冒號(除非要匹配冒號)。該模式

    "class": 
    

    將只匹配

    class: 
    
  2. 的Flex總是選擇最長的可能匹配。如果多個規則匹配最長可能的匹配,它只會更喜歡早期的規則。所以,如果你有

    class { return CLASS; } 
    .* { return LINE; } 
    

    和輸入

    class something 
    

    的Flex將匹配整條生產線的線。 class規則只會被選中僅包含單詞class(不含空格)的行。

所以你需要在你的令牌識別中更精確一些。通常,即使對於簡單的應用程序,您也需要正確處理(幾乎)所有令牌,包括字符串文字和註釋。 (在這種情況下,您可以將許多關鍵字作爲標識符進行匹配,因爲您只關注幾個關鍵字,但這只是一個小小的簡化。)