当前位置: 首页 > 知识库问答 >
问题:

ANTLR4语法解析器问题

邵文乐
2023-03-14

我对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没有方法或者它有参数

规则'r'的意思是什么?我怎么能理解问题的原因呢?任何帮助都将不胜感激!

共有1个答案

喻嘉泽
2023-03-14

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

>

  • 删除输入中red周围的引号。
  • colortype规则添加引号:

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

  •  类似资料:
    • 我在ANTLR4中有以下语法 一切都很好.我在语法1中哪里错了?

    • 我有一个利用CharsAsTokens人造lexer的无扫描解析器语法,它为ANTLR4到4.6版本生成了一个可用的Java解析器类。但是,当更新到ANTLR 4.7.2到4.9.3-Snapshot时,该工具会生成代码,从相同的语法文件产生数十个编译错误,如下所述。 我这里的问题很简单:是否不再支持无扫描解析器语法,或者必须在4.7和更高版本中以不同的方式指定基于字符的终端? 更新: 不幸的是,

    • 我正在通过自定义语法处理输入文件,提取标记,并在中返回它们。在ANTLR 3中,我能够通过调用解析器上的方法来解析文件,并获得类似于。 这在ANTLR 4中似乎不起作用。我参考了这本书,似乎我必须调用开始解析,但我在解析器中没有看到任何方法。 我使用ANTLRWorks 2生成我的词法分析器和解析器文件。我没有生成侦听器类。

    • 我对我的解析器规则使用返回,这适用于除第一个以外的所有解析器规则。如果我的语法中的第一个解析器规则使用返回声明,ANTLR4抱怨如下: 匹配规则时需要ARG_ACTION

    • 亲爱的Antlr4社区, 解析似乎很顺利: 但是,我得到以下错误消息: 错误是: [1]交换量子精确和正态分布的定义。但是交换在第一个输入中引入了一个错误: 因为在这种情况下,'6'只被视为一个正态分布,而不是一个全精确值。 [2]尝试为Quanteact(数量的花括号)创建一个上下文,这样lexer只在这个有限的上下文中提供Quanteact符号。但是我没有为此找到ANTLR4原语。 所以似乎什

    • 我只剩下一个问题:我不知道如何处理RegEx文本的转角情况,如下所示: 被解释为RegEx文本,因为lexer规则始终处于活动状态。 我想要的是合并这个逻辑(C#代码。我需要JavaScript,但我不知道如何修改它):