Java ANTLR4语法分析器问题
我对ANTLR比较陌生,所以请容忍我 我有以下语法模拟,用于解析非常简单的一阶逻辑公式:Java ANTLR4语法分析器问题,java,parsing,antlr,antlr4,Java,Parsing,Antlr,Antlr4,我对ANTLR比较陌生,所以请容忍我 我有以下语法模拟,用于解析非常简单的一阶逻辑公式: grammar graph; /*------------------------------------------------------------------ * PARSER RULES *------------------------------------------------------------------*/ input : TRUE | FALSE | formula |
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”的含义是什么?我怎样才能理解问题的根源?任何帮助都将不胜感激 最后移动颜色类型;它还匹配关键字。ANTLR解决了前面提到的规则的歧义。将COLORTYPE移到最后;它还匹配关键字。ANTLR解决了前面提到的规则的歧义。问题是
颜色类型
匹配输入红色
,但您实际指定了红色
。您需要执行以下操作之一:
红色
周围的引号COLORTYPE
规则中:
COLORTYPE : '\'' [a-z]+ '\'';
问题是
COLORTYPE
与输入的red
匹配,但实际上您指定了'red'
。您需要执行以下操作之一:
红色
周围的引号COLORTYPE
规则中:
COLORTYPE : '\'' [a-z]+ '\'';
当我对您的语法进行以下更改时,它对我有效:
当我对您的语法进行以下更改时,它对我有效:
我想我晚了一点,但是 “规则r没有方法或它有参数” 这是因为您正在调用这样的东西而生成的
C:\>grun graph r -gui
你应该改用
C:\>grun graph input -gui
我想我晚了一点,但是 “规则r没有方法或它有参数” 这是因为您正在调用这样的东西而生成的
C:\>grun graph r -gui
你应该改用
C:\>grun graph input -gui
请注意,错误指向
“”“
,即输入中的单个引号。您的lexer/parser规则中没有任何东西可以处理带引号的字符串,即“red”
。这将是一个答案,除非我对ANTLR4了解不够,无法告诉您如何解决这个问题。您可以将输入更改为Exists node in GraphA->node.color=red
,而不使用“red”周围的引号,这应该可以解析;应该能够解析“red”不是真的。它将解析红色
,但不会解析红色
。规则中的引号是ANTLR元字符。如果我尝试=red
,那么我的结果是没有规则r的方法,或者它有参数
,注意错误指向'
,即输入中的单个引号。您的lexer/parser规则中没有任何东西可以处理带引号的字符串,即“red”
。这将是一个答案,除非我对ANTLR4了解不够,无法告诉您如何解决这个问题。您可以将输入更改为Exists node in GraphA->node.color=red
,而不使用“red”周围的引号,这应该可以解析;应该能够解析“red”不是真的。它将解析红色
,但不会解析红色
。规则中的引号是ANTLR元字符。如果我尝试=red
,那么我只会得到规则r没有方法,或者它有参数
,好吧,你需要移动它,但你也需要意识到你没有在任何地方匹配一个引号。可能会想要这个不?查看Sam的条目。好吧,你需要移动它,但你也需要意识到你在任何地方都没有匹配一个报价。可能会想要这个不?见山姆的条目。