2012-06-07 53 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

我还没有完全理解词法和语法分析器的机制,所以这就是我要的^^工作。您的解决方案肯定给了我一些见解,谢谢。 –