gpt4 book ai didi

java - ANTLR4 语法仅匹配解析器规则的第一部分

转载 作者:太空宇宙 更新时间:2023-11-04 06:11:58 27 4
gpt4 key购买 nike

我正在使用 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

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

我在这里遗漏了什么吗?这是我第一次尝试使用 Antler,所以可能会混淆 Lexxer 和 Parser 规则......

最佳答案

您的STR_EXT消耗了整个输入。该规则必须取消:ANTLR 的词法分析器将始终尝试匹配尽可能多的字符。

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

关于java - ANTLR4 语法仅匹配解析器规则的第一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590374/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com