我对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'是什么意思?我如何理解问题的来源?任何帮助将不胜感激!
答案 0 :(得分:2)
最后移动COLORTYPE;它也匹配关键字。 ANTLR解决了首先提到的规则的含糊之处。
答案 1 :(得分:2)
问题是COLORTYPE
与输入red
匹配,但您确实指定了'red'
。您需要执行以下操作之一:
red
周围的引号。在COLORTYPE
规则中添加引号:
COLORTYPE : '\'' [a-z]+ '\'';
答案 2 :(得分:1)
当我对你的语法进行以下更改时,它对我有用:
将COLORTYPE移至最后,因为正如其他人所说,它在您的关键字之前匹配。
将“条件”规则更改为:
原子EQUALS QUOTE? (赋值|原子)引用?
最后添加:
引用:'\'';
答案 3 :(得分:0)
我觉得我有点迟了,但是
"没有规则r的方法或它有参数"
这是因为你正在调用这样的东西
C:\>grun graph r -gui
你应该改为使用
C:\>grun graph input -gui