gpt4 book ai didi

ANTLR 在输入 '' 处没有可行的替代方案

转载 作者:行者123 更新时间:2023-12-01 07:31:24 27 4
gpt4 key购买 nike

我仍然在学习 ANTLR 的道路上。我已经构建了一个语法,并且在大多数情况下它符合我的预期,但我需要它能够静默运行(没有输出到 stdout 或 stderr)。

语法

grammar MyPredicate;

options
{
output=AST;
}

parse : expression EOF
;

expression
: field WS? OPERATOR_BINARY WS? value
;

OPERATOR_BINARY
: '=' | '<' | '>' | '<=' | '>=' | '!=' | 'has'
;

value : VALUE_STRING
| VALUE_NUMERIC
| VALUE_BOOLEAN
;

VALUE_STRING
: '""'
| '"' (ESC_SEQ | ~('\\'|'"'))+ '"'
;

VALUE_NUMERIC
: ('0'..'9')+ ('.' ('0'..'9')+)?
;

VALUE_BOOLEAN
: 'true'
| 'false'
;

field : FIELD_NAME
;

FIELD_NAME
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;

ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
;

WS : (' ' | '\t' | '\r' | '\n') {skip();}
;

java
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class Main {
public static void main(String[] args) throws Exception {
MyPredicateParser parser = new MyPredicateParser(new CommonTokenStream(new MyPredicateLexer(new ANTLRStringStream(args[0]))));
MyPredicateParser.parse_return r = parser.parse();
parser.parse();

if ( r.tree!=null ) {
System.out.println(((Tree)r.tree).toStringTree());
((CommonTree)r.tree).sanityCheckParentAndChildIndexes();
}
}
}

输入
a = 1

输出
line 0:-1 mismatched input '<EOF>' expecting FIELD_NAME
a = 1 null

我不确定为什么会收到 EOF 错误。据我了解,我的语法解析正确,在评估“解析”解析器后出现错误,但该节点正在寻找 EOF。使用 ANTLR 3.2

最佳答案

问题是您正在调用 parse()在你的主课上两次。删除该行:

parser.parse();

只离开:
MyPredicateParser.parse_return r = parser.parse();

到位。

关于ANTLR 在输入 '<EOF>' 处没有可行的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3292501/

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