2013-05-10 123 views
7

我有ANTLR 4以下語法:ANTLR 4詞法分析器記號

grammar Pattern; 

//parser rules 
parse : string LBRACK CHAR DASH CHAR RBRACK ; 
string : (CHAR | DASH)+ ; 

//lexer rules 
DASH : '-' ; 
LBRACK : '[' ; 
RBRACK : ']' ; 
CHAR : [A-Za-z0-9] ; 

而且我試圖解析以下字符串

ab-cd[0-9] 

代碼解析出的ab-cd左側將在我的應用程序中被視爲文字字符串。然後它將[0-9]解析爲一個字符集,在這種情況下將轉換爲任何數字。我的語法適用於我,除非我不喜歡將(CHAR | DASH)+作爲解析器規則,因爲它僅僅被視爲令牌。我寧願詞法分析器創建STRING令牌,給我下面的標記:

"ab-cd" "[" "0" "-" "9" "]" 

,而不是這些

"ab" "-" "cd" "[" "0" "-" "9" "]" 

我已經看過其他的例子,但一直沒能弄明白。通常,其他示例的引號圍繞這些字符串文字,或者有空格來幫助分隔輸入。我想避免這兩種情況。這可以用詞法規則來實現還是需要像解析器規則那樣繼續處理它呢?

回答

7

在ANTLR 4中,您可以爲此使用詞法分析模式。

STRING : [a-z-]+; 
LBRACK : '[' -> pushMode(CharSet); 

mode CharSet; 

DASH : '-'; 
NUMBER : [0-9]+; 
RBRACK : ']' -> popMode; 

解析[字符後,詞法分析器將在模式CharSet操作直到達到]字符並執行popMode命令。

+0

感謝您的洞察。設置這樣的subtokenizers聽起來像是一個完美的解決方案。儘管聲明'只有在詞法分析器語法中才允許詞法模式「,我卻遇到了一個錯誤。我可以將我的語法聲明爲'詞法分析器語法IdPattern;',但是我不能使用分析器規則。我錯過了什麼? – Charles 2013-05-10 19:48:48

+1

您需要爲您的詞法分析器使用「詞法分析器語法」,併爲分析器使用單獨的「分析器語法」(在單獨的文件中)。 – 2013-05-10 19:51:18

+0

這是一個可以幫助他人的鏈接:http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle 2016-08-19 03:59:16

相關問題