ANTLR4 语法只匹配解析器规则的第一部分
ANTLR4 Grammar only matching first part of parser rule
我正在使用 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 规则...
您的 STR_EXT
消耗了全部输入。该规则必须遵守:ANTLR 的词法分析器将始终尝试匹配尽可能多的字符。
我还看到 CONSTANT
可能会消耗整个输入。它必须去,或者至少被更改为消耗更少的字符。
我正在使用 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 规则...
您的 STR_EXT
消耗了全部输入。该规则必须遵守:ANTLR 的词法分析器将始终尝试匹配尽可能多的字符。
我还看到 CONSTANT
可能会消耗整个输入。它必须去,或者至少被更改为消耗更少的字符。