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 : [ 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'。您需要执行以下操作之一:

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

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

move colortype last;它也与关键字匹配。Antlr首先将歧义解析为提到的规则。

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

  1. 将色谱转移到最后,因为正如其他人所提到的,它在您的关键字之前匹配。

  2. 将您的"条件"规则更改为:

    原子等于报价?(分配|原子)报价?

  3. 最后添加此内容:

    Quote:''';

我认为我有点晚了,但是

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

这是因为您称之为这样的东西

C:>grun graph r -gui

您应该使用

C:>grun graph input -gui

相关内容

  • 没有找到相关文章

最新更新