antlr 左递归嵌套 bool 表达式

标签 antlr grammar left-recursion

我正在编写一个antlr语法,其中我希望能够有嵌套表达式,它可以是“简单”表达式或 bool 表达式(带有可选括号)。简单的表达式就是带有左侧和右侧的表达式,例如 a = 5

我希望能够支持这些类型的表达式:

a = 5
a = 5 OR b = 10
a = 5 OR (b = 10 AND c = 12)
(a = 5 AND b = 10) OR (c = 12 AND D = 13)

我的语法如下:

STRING: CHAR+;
fragment CHAR: ('a'..'z' | 'A'..'Z' | '0'..'9'); 

booleanOp: 'AND' | 'OR';
simpleExpr: STRING '=' STRING;
expr: simpleExpr | parenExpr | booleanExpr;
parenExpr: '(' expr ')';
booleanExpr: expr (booleanOp expr)+;

我收到一个错误,指出 exprbooleanExpr 相互左递归。我理解为什么会发生这种情况,但如果我希望能够相互嵌套 bool 表达式,我不太确定如何解决这个问题。

最佳答案

在 www.antlr.org 的主页上你可以看到这个示例语法:

grammar Expr;
  prog: (expr NEWLINE)* ;
  expr: expr ('*'|'/') expr
  | expr ('+'|'-') expr
  | INT 
  | '(' expr ')' ;

稍微编辑一下,这就是您所需要的。这是针对 ANTLR 4 的。您使用的是哪个版本?我确信每个版本的 ANTLR 都有一个表达式语法示例。

关于antlr 左递归嵌套 bool 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16469023/

相关文章:

nlp - 有人类可读的编程语言吗?

java - 涉及两个扩展的选择冲突 :

parsing - 左因式分解的自动语法转换;和左递归移除

antlr - 如何编写引用字符的词法分析器规则?

java - 我如何引用在 ANTLR 中多次调用同一规则?

antlr - 在 ANTRL 重写器语法的 StringTemplate 中使用 $ 作为分隔符

compiler-construction - F#中的属性语法系统

Antlr:意外行为

regex - 如何编写 nltk 语法来检查但不捕获某些文本

parsing - 如何最好地解析 PEG 语法中的逗号分隔列表