2012-01-13 126 views
0

我的語法中的一些關鍵字(字符串常量)包含大寫字母 在ANTLR語法中使用不同的關鍵字關鍵字

PREV_VALUE : 'PreviousValue'; 

這會導致奇怪的解析行爲:含有相同的大寫字母(「P」,「V」)被解析不正確其他標記。

這裏的詞法語法的簡化版本:

lexer grammar ExpressionLexer; 

COMMA : ','; 
LPAREN : '('; 
RPAREN : ')'; 
LBRACK : '['; 
RBRACK : ']'; 
PLUS : '+'; 
MINUS : '-'; 
MULT : '*'; 
DIV : '/'; 
PREV_VALUE : 'PreviousValue'; 
fragment DIGIT : ('0'..'9'); 
fragment LETTER : ('a'..'z'|'A'..'Z'|'_'); 
fragment TAB : ('\t') ; 
fragment NEWLINE : ('\r'|'\n') ; 
fragment SPACE : (' ') ; 

當我試圖解析這種表達:

var expression = "P"; //Capital 'P' which included to the keyword 'PreviousValue' 
var stringReader = new StringReader(expression); 
var input = new ANTLRReaderStream(stringReader); 
var expressionLexer = new ExpressionLexer(input); 
var tokens = new CommonTokenStream(expressionLexer); 

tokens._tokens集合包含一個價值

[0] = {[@0,1:1='<EOF>',<-1>,1:1]} 

這是不正確。

如果我改變expression到 'P'(小寫字母) tokens._tokens集合包含兩個值

[0] = {[@0,0:0='p',<0>,1:0]} 
[1] = {[@1,1:1='<EOF>',<-1>,1:1]} 

這是正確的。

當字符串PREV_VALUE : 'PreviousValue';從語法中刪除時,兩個表達式都被正確解析。

是否可以在關鍵字中使用不同的大小寫? 在ANTLR語法中有沒有使用這樣的關鍵字的例子?

+0

對不起,我編輯了我的初始文章。希望清除它。 – 2012-01-13 22:24:02

回答

1

我很難相信p令牌是基於您發佈的語法創建的。在他們面前有fragment的Lexer規則不會產生令牌:這些規則只能被其他詞法分析規則使用。

一個簡單的演示展示了這一點:

lexer grammar ExpressionLexer; 

@lexer::members { 
    public static void main(String[] args) throws Exception { 
    ExpressionLexer lexer = new ExpressionLexer(new ANTLRStringStream(args[0])); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    tokens.fill(); // remove this line when using ANTLR 3.2 or an older version 
    System.out.println(tokens); 
    } 
} 

COMMA : ','; 
LPAREN : '('; 
RPAREN : ')'; 
LBRACK : '['; 
RBRACK : ']'; 
PLUS : '+'; 
MINUS : '-'; 
MULT : '*'; 
DIV : '/'; 
PREV_VALUE : 'PreviousValue'; 
fragment DIGIT : ('0'..'9'); 
fragment LETTER : ('a'..'z'|'A'..'Z'|'_'); 
fragment TAB : ('\t') ; 
fragment NEWLINE : ('\r'|'\n') ; 
fragment SPACE : (' ') ; 

現在生成的詞法分析器和編譯.java源文件:

java -cp antlr-3.3.jar org.antlr.Tool ExpressionLexer.g 
javac -cp antlr-3.3.jar *.java

,並運行一些測試:

java -cp .:antlr-3.3.jar ExpressionLexer p 
line 1:0 no viable alternative at character 'p'

這是正確,因爲沒有(非片段)規則開始於或匹配"p"

java -cp .:antlr-3.3.jar ExpressionLexer P 
line 1:1 mismatched character '' expecting 'r'

這是正確的,因爲這與"P"開始只(非片段)規則期望一個"r"成爲下一個字符(它是不存在的)。

+0

謝謝你的好解釋!現在我看到了我的錯誤。我需要做的就是爲單詞添加新的詞法分析器規則(無片段)以生成正確的令牌。 – 2012-01-14 10:49:35

+0

不客氣@VillaF。 – 2012-01-14 10:59:14