2011-03-15 28 views
1

我正在使用flex爲自定義語言生成詞法分析器。我遇到的問題是,只要我找到一個錯誤的標記......我無法告訴其他標記是否遵循這個標記。例如如何識別輸入字符串中的多個詞法錯誤(使用flex)?

int v1,v2; 
v1=10;v2=20; 
v1=v2+1v; 
print(v1); 
~return; 

這裏,代幣的流將是ID,<,>,ID,<;> ......的語言指定每個令牌由空格分隔。因此,在1之後看到v應該會產生錯誤,並且掃描器必須打印該錯誤。在那之後,有更多的合法令牌和另一個非法令牌(〜return)。我如何處理其餘的合法令牌並打印第二個錯誤。 我使用flex作爲掃描生成器。當我發現沒有任何詞法匹配的正則表達式匹配時,我會調用一個打印適當消息的錯誤例程。

如何在調用此例程後恢復處理?

+0

很好的問題......我想看看生成的詞法分析器,看看是否有保留任何變量跟蹤掃描儀的位置或開始在指定位置掃描的方法... – 2011-03-15 21:34:15

回答

1

這是一個黑客,但它是我能想出的。 The Flex manual 說你有權訪問YY_BUFFER_STATE

可能能夠使用該文件中的當前位置,從YY_BUFFER_STATE成員yy_input_file得到,連同yyrestart(FILE * F)恢復只是錯誤後點解析。

同樣,似乎必須有更好的解決方案。

2

如果語法上有意義,則將空格放入語法中。如果不是,因爲它似乎沒有在這裏,只是忽略規則。在需要分離令牌的地方,空白僅在句法上顯着。在int a;

例如,COBOL的規則是一個句點後面必須跟一個空格,除了PICTURE字符串。實施規則比忽略它更難,所以我忽略了它。它通過了FIPS認證,從來沒有人注意到,編譯器在生產中使用了大約十年。

注意處理非法字符的最好方法是解析器錯誤。這樣分析器就可以應用它的錯誤恢復策略。在詞彙層面,您可以打印並忽略它們。

在法/柔性,這只是相當於具有最終規則,上面寫着:

. return yytext[0];