Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ANTLR4语法分析器问题_Java_Parsing_Antlr_Antlr4 - Fatal编程技术网

Java ANTLR4语法分析器问题

Java ANTLR4语法分析器问题,java,parsing,antlr,antlr4,Java,Parsing,Antlr,Antlr4,我对ANTLR比较陌生,所以请容忍我 我有以下语法模拟,用于解析非常简单的一阶逻辑公式: grammar graph; /*------------------------------------------------------------------ * PARSER RULES *------------------------------------------------------------------*/ input : TRUE | FALSE | formula |

我对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”的含义是什么?我怎样才能理解问题的根源?任何帮助都将不胜感激

最后移动颜色类型;它还匹配关键字。ANTLR解决了前面提到的规则的歧义。

将COLORTYPE移到最后;它还匹配关键字。ANTLR解决了前面提到的规则的歧义。

问题是
颜色类型
匹配输入
红色
,但您实际指定了
红色
。您需要执行以下操作之一:

  • 删除输入中
    红色
    周围的引号
  • 将引号添加到您的
    COLORTYPE
    规则中:

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

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

  • 删除输入中
    红色
    周围的引号
  • 将引号添加到您的
    COLORTYPE
    规则中:

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

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

  • 将COLORTYPE移到末尾,因为正如其他人所提到的,它在关键字之前匹配

  • 将“条件”规则更改为:

    原子等于报价?(作业|原子)报价

  • 在末尾添加以下内容:

    引号:“\”


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

  • 将COLORTYPE移到末尾,因为正如其他人所提到的,它在关键字之前匹配

  • 将“条件”规则更改为:

    原子等于报价?(作业|原子)报价

  • 在末尾添加以下内容:

    引号:“\”


  • 我想我晚了一点,但是

    “规则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的条目。好吧,你需要移动它,但你也需要意识到你在任何地方都没有匹配一个报价。可能会想要这个不?见山姆的条目。