2014-02-07 67 views
0

片段 EXEC:( 'E' 'X' 'E' 'C');詞法規則終止而不匹配終止符號

片段 CMD:( 'C' 'M' 'D');

片段 BEGIN:( 'B' 'E' 'G' 'I' 'N');

片段 END:( 'E' 'N' 'd');

片段 SEMICOLON: ';';

ExecCommand: EXEC Whitespace CMD Whitespace BEGIN WhiteSpace? SEMICOLON (options {greedy = false;}:。)* END Whitespace EXEC;

開始:BEGIN;

END:END;

Exec的:EXEC;

,將execCommand規則終止於第一個「E」分號之後的掃描,然後失敗,如果下一個字符不是「END」。掃描只能在'END'結束,而不是'ELSE'或任何其他以'E'開頭的字符串。

掃描循環具有用於_LA(1)== 'E' 而不是匹配( 'END')進行測試。

Exec時,開始和結束,也象徵規則。 ExecCommand規則是詞法分析器語法中的第一條規則,因此它應該具有優先權。

如何生成的規則,將接受的開始和結束的符號之間的任意文本,而不是終止,直到結束符號被發現的?

我嘗試以下,並沒有成功地產生: 的execCommand: EXEC空白CMD空白 BEGIN空白符? SEMICOLON (options {greedy = false;}:〜(END WHITEpace EXEC))* END WHITEpace EXEC;

回答

0

默認情況下,只有一個先行,所以非貪婪的循環,只要這個循環之後的第一個字符輸入發現(在「E」)終止。然後它試圖匹配'N'和'D'(按照END規則的指示),在你的情況下失敗。嘗試增加lookahead(參數k),看看是否有幫助。如果不是,你必須找到一個不同的方法。作爲一個附註:Exec和EXEC完全相同(除了它們的名字),所以要麼刪除EXEC(如果你需要解析器中的詞法分析器標記)或Exec(如果該詞法分析器標記專門用於你的詞法分析器類似於END和BEGIN