ANTLR4语法分析器问题

时间:2014-01-31 00:17:09

标签: java parsing antlr antlr4

我对ANTLR比较陌生,所以请耐心等待。

我有以下模拟语法来解析非常简单的一阶逻辑公式:

grammar graph;


/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/

input
: 
TRUE | FALSE | formula | EOF
;

formula
: 
(element)+ ST condition
;

element 
:
quantifier IN domain
;

condition
:
atom EQUALS (assignment | atom)
;

atom
:
variable DOT property
;

quantifier 
:
(FOREACH | EXISTS) variable
;

domain
:
(GRAPH_A | GRAPH_B)
;

variable
:   
(NODE | EDGE)
;

property
:
(COLOR | VALUE)
;

assignment
:
(COLORTYPE | NUMBER)
;


/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
COLORTYPE : ('a'..'z')+ ;

NUMBER : ('0'..'9')+ (DOT ('0'..'9')+)? ;

WS : [ \t\r\n]+ -> skip ;

EXISTS  : 'Exists' ;

FOREACH : 'Foreach' ;

TRUE : 'True' ;

FALSE : 'False' ;

ST : '->' ; 

NODE : 'node' ;

EDGE : 'edge' ;

IN : 'in' ;

GRAPH_A : 'GraphA' ;

GRAPH_B : 'GraphB' ;

COLOR : 'color' ;

VALUE : 'value' ;

EQUALS : '=' ;

DOT : '.' ; 

语法很简单。我能够使用

生成词法分析器和解析器类
java org.antlr.v4.Tool graph.g4

但是当我尝试解析以下表达式时

Exists node in GraphA -> node.color = 'red'

我最终得到以下错误:

第1:38行令牌识别错误:'''

第1:42行令牌识别错误:'''

没有规则r的方法或它有参数

rule'r'是什么意思?我如何理解问题的来源?任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

最后移动COLORTYPE;它也匹配关键字。 ANTLR解决了首先提到的规则的含糊之处。

答案 1 :(得分:2)

问题是COLORTYPE与输入red匹配,但您确实指定了'red'。您需要执行以下操作之一:

  1. 删除输入中red周围的引号。
  2. COLORTYPE规则中添加引号:

    COLORTYPE : '\'' [a-z]+ '\'';
    

答案 2 :(得分:1)

当我对你的语法进行以下更改时,它对我有用:

  1. 将COLORTYPE移至最后,因为正如其他人所说,它在您的关键字之前匹配。

  2. 将“条件”规则更改为:

    原子EQUALS QUOTE? (赋值|原子)引用?

  3. 最后添加:

    引用:'\'';

答案 3 :(得分:0)

我觉得我有点迟了,但是

  

"没有规则r的方法或它有参数"

这是因为你正在调用这样的东西

C:\>grun graph r -gui

你应该改为使用

C:\>grun graph input -gui