我对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 : [ trn]+ -> 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 : '.' ;
语法非常简单。我能够用
生成lexer和parser类java org.antlr.v4.Tool graph.g4
但是当我尝试解析以下表达式
时Exists node in GraphA -> node.color = 'red'
我最终遇到以下错误:
行1:38令牌识别错误,''''
行1:42令牌识别错误:'''
没有规则r的方法或它具有参数
规则" r"的含义是什么?我怎么能了解问题到底是在哪里?任何帮助将不胜感激!
问题是COLORTYPE
匹配输入red
,但实际上指定了'red'
。您需要执行以下操作之一:
- 输入中
red
周围的引号。 -
向您的
COLORTYPE
规则添加引号:COLORTYPE : ''' [a-z]+ ''';
move colortype last;它也与关键字匹配。Antlr首先将歧义解析为提到的规则。
当我对您的语法进行以下更改时,它对我有用:
-
将色谱转移到最后,因为正如其他人所提到的,它在您的关键字之前匹配。
-
将您的"条件"规则更改为:
原子等于报价?(分配|原子)报价?
-
最后添加此内容:
Quote:''';
我认为我有点晚了,但是
"规则r或没有参数的方法"
这是因为您称之为这样的东西
C:>grun graph r -gui
您应该使用
C:>grun graph input -gui