2015-10-23 32 views
0

這個語法(* .g4):定義在ANTLR V4爲雙類型的規則

ID : [a-zA-Z]+; 
INT : [0-9]; 
DBL : INT+ (PT INT+)?;  
PT : '.'; 
... 

prog: stat+; 
stat: expr NEWLINE    # printExpr 
    | ID EQL expr NEWLINE  # assign 
    | 'clear'     # clear 
    | NEWLINE     # blank 
    ; 

expr: expr op=(MUL|DIV) expr # MulDiv 
    | expr op=(ADD|SUB) expr # AddSub 
    | DBL      # double 
    | ID      # id 
    | LBR expr RBR    # parens 
    ; 

我ANTLR的和Java文件編譯沒有問題,但與該輸入運行:

193.2 
a =5.2 
b= 6 
c= a+b*2.2 
c 

存在與b=6線3一個問題:在3輸入 '6' 上訪問沒有可行的替代,接着一個NullPointerException()

我假設在我的expr規則中可能會有一些不明確的地方。

我在做什麼錯?

+0

提示:6.1正在工作。但不是6也是雙倍(6.0)? – user1511417

回答

0

發現問題了! 定義我以前DBL作爲

dbl : INT+ PT INT+ 
    | PT INT+ 
    | INT+ 
    ; 

的伎倆。

+0

仍然不知道爲什麼。 lowecase和uppercase規則有什麼區別?我應該在一個新問題中提出這個問題 – user1511417

+1

大寫規則稱爲詞法規則。小寫規則稱爲解析器規則。 ANTLR首先通過使用Lexer規則將輸入分割成令牌。然後在第二遍中,它使用解析器規則的定義(由解析器規則和詞法分析器標記組成)來解析文件。 - 請參閱以下鏈接瞭解更多信息:https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Lexer+Rules https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Parser+Rules –