【问题标题】:ANTLR4 Grammar only matching first part of parser ruleANTLR4 语法仅匹配解析器规则的第一部分
【发布时间】:2015-04-19 20:28:35
【问题描述】:

我正在使用 ANTLR 4 来尝试解析任务定义。任务定义如下所示:

task = { priority = 10; };

我的语法文件如下所示:

grammar TaskGrammar;

/* Parser rules */

task : 'task' ASSIGNMENT_OP block EOF;

logical_entity : (TRUE | FALSE) # LogicalConst
               | IDENTIFIER     # LogicalVariable
               ;

numeric_entity : DECIMAL              # NumericConst
               | IDENTIFIER           # NumericVariable
               ;

block : LBRACE (statement)* RBRACE SEMICOLON;

assignment : IDENTIFIER ASSIGNMENT_OP DECIMAL SEMICOLON
            | IDENTIFIER ASSIGNMENT_OP block SEMICOLON
            | IDENTIFIER ASSIGNMENT_OP QUOTED_STRING SEMICOLON
            | IDENTIFIER ASSIGNMENT_OP CONSTANT SEMICOLON;

functionCall : IDENTIFIER LPAREN (parameter)*? RPAREN SEMICOLON;

parameter : DECIMAL
            | QUOTED_STRING;

statement : assignment
            | functionCall;

/* Lexxer rules */

IF   : 'if' ;
THEN : 'then';

AND : 'and' ;
OR  : 'or' ;

TRUE  : 'true' ;
FALSE : 'false' ;

MULT  : '*' ;
DIV   : '/' ;
PLUS  : '+' ;
MINUS : '-' ;

GT : '>' ;
GE : '>=' ;
LT : '<' ;
LE : '<=' ;
EQ : '==' ;

ASSIGNMENT_OP : '=' ;

LPAREN : '(' ;
RPAREN : ')' ;

LBRACE : '{' ;
RBRACE : '}' ;

SEMICOLON : ';' ;

// DECIMAL, IDENTIFIER, COMMENTS, WS are set using regular expressions

DECIMAL : '-'?[0-9]+('.'[0-9]+)? ;

IDENTIFIER : [a-zA-Z_][a-zA-Z_0-9]* ;

Value: STR_EXT | QUOTED_STRING | SINGLE_QUOTED
;

STR_EXT
  :
  [a-zA-Z0-9_/\.,\-:=~+!?$&^*\[\]@|]+;

Comment
    :
    '#' ~[\r\n]*;

CONSTANT : StringCharacters;

QUOTED_STRING
  :
  '"' StringCharacters? '"'
  ;

fragment
StringCharacters
    :   (~["\\] | EscapeSequence)+
    ;
fragment
EscapeSequence
    :   '\\' [btnfr"'\\]?
    ;
SINGLE_QUOTED
:
'\'' ~['\\]* '\'';

// COMMENT and WS are stripped from the output token stream by sending
// to a different channel 'skip'

COMMENT : '//' .+? ('\n'|EOF) -> skip ;

WS : [ \r\t\u000C\n]+ -> skip ;

此语法在 ANTLR 中编译得很好,但在尝试使用解析器时,我收到以下错误:

line 1:0 mismatched input 'task = { priority = 10; return = AND; };' expecting 'task'
org.antlr.v4.runtime.InputMismatchException

解析器似乎无法识别定义的块部分,但我不太明白为什么。据我所知,块解析规则定义应该匹配。我希望有一个 TaskContext,其子 BlockContext 包含一个 AssignmentContext。我得到了 TaskContext,但它有上述异常。

我在这里遗漏了什么吗?这是我第一次尝试使用 Antler,所以可能对 Lexxer 和 Parser 规则感到困惑......

【问题讨论】:

  • 任务不应该是任务:'task' ASSIGNMENT_OP block EOF; ?
  • 是的,试过了,得到了一个稍微不同的异常,改为“预期任务”。
  • 问题可能出在您的词法分析器规则中,也许是 IDENTIFIER。包含所有内容会很有帮助。
  • 嗨@MarcQ。我已经更新了问题以包含所有语法。谢谢。

标签: java parsing antlr antlr4


【解决方案1】:

您的STR_EXT 会占用整个输入。必须遵守这条规则:ANTLR 的词法分析器将始终尝试匹配尽可能多的字符。

我还看到CONSTANT 可能会消耗整个输入。它必须去,或者至少被改变以消耗更少的字符。

【讨论】:

  • 嗨,谢谢。刚刚完全删除了该规则,但仍然遇到相同的异常:line 1:0 mismatched input 'task = { priority = 10; };' expecting 'task' org.antlr.v4.runtime.InputMismatchException
  • @euantorano 现在 CONSTANT 匹配所有内容。
  • 刚把CONSTANT改成CONSTANT : [A-Z]+;,还是一样的错误。
  • 刚刚删除了SINGLE_QUOTEValue,现在一切正常,非常感谢!
  • 是的,我重新生成了解析器,它现在似乎可以工作了。感谢您的帮助,一旦您有了一些规则,这些语法就会变得非常混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多