2012-06-07 127 views
1

我想解析一些任務,我只關心整個任務。不是關於任務內容的。分配由':='表示。 (編輯:其他的事情可能會前和分配後,)ANTLR解析任務

一些例子:

a := TRUE & FALSE; 
c := a ? 3 : 5; 
b := case 
      a : 1; 
      !a : 0; 
     esac; 

目前我做一個包含「案例」和其他任務分配之間的差異。對於簡單的作業,我嘗試了類似~('case' | 'esac' | ';')的東西,但之後antlr抱怨無法匹配的標記(如'=')。

assignment : 
    NAME ':='! expression ; 

expression : 
    (simple_expression | case_expression) ; 


simple_expression : 
    ((OPERATOR | NAME) & ~('case' | 'esac'))+ ';'! ; 

case_expression : 
    'case' .+ 'esac' ';'! ; 

我試着用下面的替換,因爲Eclipse的解釋似乎並不喜歡((OPERATOR | NAME) & ~('case' | 'esac'))+ ';'! ;因爲'and'的。

(~(OPERATOR | ~NAME | ('case' | 'esac')) | 
    ~(~OPERATOR | NAME | ('case' | 'esac')) | 
    ~(~OPERATOR | ~NAME | ('case' | 'esac'))) ';'! 

但這不起作用。我得到

「的錯誤(139):/AntlrTutorial/src/foo/NusmvInput.g:78:5:補集是空| --->〜(〜運算符|〜名稱|( '案件' |'esac')))EOC!;「

我該如何解析它?

回答

2

有一對夫婦的事情出錯的位置:

  • 你在你的語法使用&,而應該是與它周圍的報價:'&'
  • ,除非你知道自己在做什麼,請勿在解析器規則中使用~.(尤其不要使用.+!):僅在詞法分析規則中使用它們;
  • 創建詞法規則,而不是定義在你的語法規則'case''esac'(它是安全的使用文字記號在你的語法規則,如果沒有其他的詞法規則有可能匹配,但'case''esac'很像NAME他們可以在您的AST最終在這種情況下,不如自己明確定義它們在詞法分析器)

這裏有一個快速演示:

grammar T; 

options { 
    output=AST; 
} 

tokens { 
    ROOT; 
    CASES; 
    CASE; 
} 

parse 
: (assignment SCOL)* EOF -> ^(ROOT assignment*) 
; 

assignment 
: NAME ASSIGN^ expression 
; 

expression 
: ternary_expression 
; 

ternary_expression 
: or_expression (QMARK^ ternary_expression COL! ternary_expression)? 
; 

or_expression 
: unary_expression ((AND | OR)^ unary_expression)* 
; 

unary_expression 
: NOT^ atom 
| atom 
; 

atom 
: TRUE 
| FALSE 
| NUMBER 
| NAME 
| CASE single_case+ ESAC -> ^(CASES single_case+) 
| '(' expression ')'  -> expression 
; 

single_case 
: expression COL expression SCOL -> ^(CASE expression expression) 
; 

TRUE : 'TRUE'; 
FALSE : 'FALSE'; 
CASE : 'case'; 
ESAC : 'esac'; 
ASSIGN : ':='; 
AND : '&'; 
OR  : '|'; 
NOT : '!'; 
QMARK : '?'; 
COL : ':'; 
SCOL : ';'; 
NAME : ('a'..'z' | 'A'..'Z')+; 
NUMBER : ('0'..'9')+; 
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();}; 

將解析您的輸入:如下

a := TRUE & FALSE; 
c := a ? 3 : 5; 
b := case 
      a : 1; 
      !a : 0; 
     esac; 

enter image description here

+0

我還沒有完全理解詞法和語法分析器的機制,所以這就是我要的^^工作。您的解決方案肯定給了我一些見解,謝謝。 –