gpt4 book ai didi

parsing - 来自 antlr 2.7.6 的虚假不确定性警告

转载 作者:行者123 更新时间:2023-12-02 15:08:17 26 4
gpt4 key购买 nike

我正在尝试使用 antlr 2.7.6 创建一个简单的表达式解析器,但在编译过程中收到一些不确定性警告。生成的 java 源似乎完全按照我想要的方式工作,但我想知道是否可以抑制此警告,或者我是否在语法中做错了什么。

解析器将在已经依赖于这个旧的 antlr 版本的项目中使用,因此升级到 3.4 可能不是一个选择。语法本身与 this answer 中的语法类似。 .

这是编译期间的输出:

Using Antlr grammar: expr.g
ANTLR Parser Generator Version 2.7.6 (2005-12-22) 1989-2005
expr.g:15: warning:nondeterminism upon
expr.g:15: k==1:OR
expr.g:15: between alt 1 and exit branch of block
expr.g:19: warning:nondeterminism upon
expr.g:19: k==1:AND
expr.g:19: between alt 1 and exit branch of block

这是显示问题的简化语法:

header {
package net.jhorstmann.i18n.tools;

import net.jhorstmann.i18n.tools.*;
import net.jhorstmann.i18n.tools.expr.*;
}

class ExprParser extends Parser;

expression returns [Expression r = null]
: r=or_expr
;

or_expr returns [Expression r = null] { Expression e = null; }
: r=and_expr (OR e=and_expr { r = new OrExpression(r, e); })*
;

and_expr returns [Expression r = null] { Expression e = null; }
: r=prim_expr (AND e=prim_expr { r = new AndExpression(r, e); })*
;

prim_expr returns [Expression r = null] { Expression e = null; }
: b:BOOL { r = new ConstantExpression(Integer.parseInt(b.getText())); }
| NOT e=expression { r = new NotExpression(e); }
| OPEN e=expression CLOSE { r = e; }
;

class ExprLexer extends Lexer;

options {
k=2;
}

WS : (' ' | '\t')+ { $setType(Token.SKIP); };
BOOL : '0' | '1';
NOT : '!';
OPEN : '(';
CLOSE : ')';
OR : '|' '|';
AND : '&' '&';

最佳答案

奇怪的是,ANTLR 3 对于这样的语法没有任何问题。

由于它警告“ block 的退出分支”,请尝试使用文件结束标记 (EOF) 来锚定您的条目规则:

expression returns [Expression r = null]
: r=or_expr EOF
;

编辑

我会包含一个一元否定表达式,如下所示:

expression
: or_expr EOF
;

or_expr
: and_expr (OR and_expr)*
;

and_expr
: unary_expr (AND unary_expr)*
;

unary_expr
: NOT prim_expr
| prim_expr
;

prim_expr
: BOOL
| OPEN or_expr CLOSE
;

关于parsing - 来自 antlr 2.7.6 的虚假不确定性警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9344066/

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