2011-03-04 60 views
2

我正在創建一個語法,我不得不擺脫左遞歸,並且它似乎適用於除添加運算符之外的所有內容。爲什麼我的語法適用於*, - ,/等運算符,而不是+?

這裏是我的語法的相關部分:

SUBTRACT: '-'; 
PLUS: '+'; 
DIVIDE: '/'; 
MULTIPLY: '*'; 

expr: 
     (
     IDENTIFIER 
     | INTEGER 
     | STRING 
     | TRUE 
     | FALSE 
    ) 
     (
     PLUS expr 
     | SUBTRACT expr 
     | MULTIPLY expr 
     | DIVIDE expr 
     | LESS_THAN expr 
     | LESS_THAN_OR_EQUAL expr 
     | EQUALS expr 
    )* 
     ; 

INTEGER: ('0'..'9')*; 
IDENTIFIER: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*; 

然後,當我嘗試做一些像

x*1 

它工作的很好。然而,當我嘗試做一些像

x+1 

我得到一個錯誤說:

MismatchedTokenException異常:不匹配的輸入 '+' 期待 '\ u001C'

我一直在這一段時間,但不明白爲什麼它與*, - 和/,但不是+。我擁有完全相同的代碼。

編輯:如果我重新排序並將SUBTRACT放在PLUS之上,+符號現在可以工作,但是 - 符號不會。爲什麼antlr會關心這樣的東西的順序?

+0

什麼是IDENTIFIER,INTEGER等定義爲? – dappawit 2011-03-04 02:05:18

+0

你的INTEGER表達式是否包含一個'+'? – SingleNegationElimination 2011-03-04 02:08:51

+0

哎呀,我剛剛添加了INTEGER和IDENTIFIER的問題。我相信我現在有所有相關的東西。 INTEGER規則中沒有+。 – guy 2011-03-04 02:12:59

回答

0

我固定它通過使一個新的規則對於部分在端部,我從除去左遞歸製成:

expr: 
     (
     IDENTIFIER 
     | INTEGER 
     | STRING 
     | TRUE 
     | FALSE 
    ) lr* 
     ; 

lr:   PLUS expr 
     | SUBTRACT expr 
     | MULTIPLY expr 
     | DIVIDE expr 
     | LESS_THAN expr 
     | LESS_THAN_OR_EQUAL expr 
     | EQUALS expr; 
+0

這不是要走的路:表達式'2 * 3 + 4'被解析爲'(2 *(3 + 4))'(即'+'現在優先於'*')。 – 2011-03-04 08:22:12

1

避免左遞歸(在表達式文法)通常是這樣完成的:

grammar Expr; 

parse 
    : expr EOF 
    ; 

expr 
    : equalityExpr 
    ; 

equalityExpr 
    : relationalExpr (('==' | '!=') relationalExpr)* 
    ; 

relationalExpr 
    : additionExpr (('>=' | '<=' | '>' | '<') additionExpr)* 
    ; 

additionExpr 
    : multiplyExpr (('+'| '-') multiplyExpr)* 
    ; 

multiplyExpr 
    : atom (('*' | '/') atom)* 
    ; 

atom 
    : IDENTIFIER 
    | INTEGER 
    | STRING 
    | TRUE 
    | FALSE 
    | '(' expr ')' 
    ; 

// ... lexer rules ... 

例如,輸入A+B+C將如下解析:

enter image description here

也看到這個相關的答案:ANTLR: Is there a simple example?

+0

這是如何匹配A + B + C? – 2011-07-07 11:17:40

+0

@Wouter,看我的編輯。 – 2011-07-07 11:27:15

+0

謝謝。我首先會誤讀一些東西,最終導致用我自己的語法找到並解決錯誤,所以謝謝! – 2011-07-08 09:10:33

相關問題