在ANTLR中是否可以在所有情况下都消除左递归? [英] Can left recursion be eliminated in all cases in ANTLR?

查看:80
本文介绍了在ANTLR中是否可以在所有情况下都消除左递归?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

说我有以下内容

语法#1

expr:
    expr AND expr
    | expr OR expr
    | primary 
;

并变成了这个.

语法#2

expr:
    andExpr
    | primary
;
andExpr: orExpr AND orExpr;
orExpr: ... OR ...;

但我仍然不知道这将如何解决问题?在语法#1中,我可以表达

but I still don't see how this would solve the problem? In Grammar #1 I can express

true and false and true and true or false
true or false and true

我可以使用#1语法保持这种链接.但是我没有看到如何使用语法#2来实现这一目标?

I can keep chaining like this with Grammar #1. But I am not seeing how to achieve this using grammar #2?

推荐答案

您可以这样写:

grammar Test;

parse
 : expr EOF
 ;

expr
 : or_expr
 ;

or_expr
 : and_expr (OR and_expr)*
 ;

and_expr
 : primary (AND primary)*
 ;

primary
 : TRUE
 | FALSE
 | '(' expr ')'
 ;

TRUE  : 'true';
FALSE : 'false';
AND   : 'and';
OR    : 'or';

SPACES
 : [ \t\r\n] -> skip
 ;

这将使AND表达式的优先级高于OR表达式.

This will keep AND expressions have a higher precedence than OR expressions.

这样解析输入: true和((false或true)以及true或false)会产生以下解析树:

Parsing input like this: true and ((false or true) and true or false) results in the following parse tree:

这篇关于在ANTLR中是否可以在所有情况下都消除左递归?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆