2011-11-11 43 views
2

希望這只是幫助我解決此問題的適量信息。如何在Antlr3中解析此解析模糊

鑑於以下ANTLR3語法

grammar mygrammar; 

program : statement* | function*; 

function : ID '(' args ')' '->' statement+ (','statement+) '.' ;  

args : arg (',' arg)*;  

arg  : ID ('->' expression)?; 

statement : assignment 
      | number 
      | string 
      ; 

assignment : ID '->' expression;  

string : UNICODE_STRING; 

number : HEX_NUMBER | INTEGER ('.' INTEGER)?; 


// ================================================================ 

HEX_NUMBER : '0x' HEX_DIGIT+; 

INTEGER : DIGIT+; 

fragment 
DIGIT : ('0'..'9'); 

這是導致在語法上的問題就行了。

my_function(x, y, z -> 42) -> 10001. 

ANTLRWorks凸顯10001後最後.以紅色爲與以下錯誤的問題。

我該如何讓此止損投擲org.antlr.runtime.EarlyExitException

我確定這是因爲我的number解析器規則和嘗試使用.作爲EOL分隔符之間的某些含糊之處。

+0

是否把'number'規則首先幫助? –

+0

@從此處,不,解析器規則可以按任何順序放置:這沒有什麼區別。這是詞法規則,其順序很重要。 –

+0

@Bart看到我的更新到我的問題,錯誤是與最後一個'.' –

回答

3

還有另一個含糊不清,也需要修復。變化:

program : statement* | function*; 

到:

program : (statement | function)*; 

(雖然2是不等價的,我猜你希望是後者)

而在你function規則,你現在定義至少有2個statement s:

function : ID '(' args ')' '->' statement (','statement)+ '.' ; 

而我猜你真正想要的至少一個:

function : ID '(' args ')' '->' statement (','statement)* '.' ; 

現在,你真正的問題:因爲你在一個解析器規則構建的花車,從你的輸入,10001.,解析器嘗試結束以構建它的number,而您希望它匹配INTEGER,然後是.,正如您自己在OP中所說的那樣。

爲了解決這個問題,您需要給解析器一點額外的預見,以便在這個歧義之外「看到」。做到這一點的實際匹配之前添加謂詞(INTEGER '.' INTEGER)=>說輸入:

number 
    : HEX_NUMBER 
    | (INTEGER '.' INTEGER)=> INTEGER '.' INTEGER 
    | INTEGER 
    ; 

現在你的輸入會生成以下分析樹:

enter image description here

+0

有沒有更好的方法來檢測浮動數字,而不是我的做法呢? –

+0

@JarrodRoberson,有很多種方式,但都有自己的缺點。最簡單的就是引入一個'FLOAT:DIGIT +'。' DIGIT +;'在你的詞法分析器中改變一個事實,即語句可以用'。'結尾。如果你想把''.''保存爲EOL,那麼你現在做的方式(包括我的建議)可能是解決它的最簡單的方法。 –

1

也許無關,但我很好奇無 - 少:

function : ID '(' args ')' '->' statement+ (','statement+) '.' ; 

如果這不是是:

function : ID '(' args ')' '->' statement (',' statement)* '.' ; 

我第一個想到的就需要在一個函數一個逗號定義,但第二個將需要一個逗號作爲語句分隔符。

另外,args的規則是否允許z -> 42正確?

+0

@Jarrod,錯誤,這不__解決問題與模糊的'.' ... –

+0

@BartKiers(和sarnold)感謝您的輸入,我真的想哼一聲ANTLR3,我有兩個Terrance Parr書籍,但關於詞法分析器和分析器規則的理論仍然非常不透明,我非常感謝幫助! –

+0

@JarrodRoberson,不客氣。另請參閱此前關於詞法分析器和解析器規則之間差異的問答:http://stackoverflow.com/questions/4297770/practical-difference-between-parser-rules-and-lexer-rules-in-antlr –