Antlr 在ANTL4中匹配相同类型的多个表达式

Antlr 在ANTL4中匹配相同类型的多个表达式,antlr,antlr4,Antlr,Antlr4,假设我们想使用一个添加多个参数的函数,那么如何构造ANTLR4语法来同时收集和传递所有子表达式呢 下面是一个语法示例来说明这一点,注意“+”的所有术语都被收集并立即传递到表达式中,而“*”的所有术语都是递归计算的 grammar calc; stats: exp*; exp : INT ('+' INT)+ | exp ('*' exp)+ | INT ; INT: [0-9]+; WS: [ \n]+ -> skip; 注意:上面的语法通过在“+

假设我们想使用一个添加多个参数的函数,那么如何构造ANTLR4语法来同时收集和传递所有子表达式呢

下面是一个语法示例来说明这一点,注意“+”的所有术语都被收集并立即传递到表达式中,而“*”的所有术语都是递归计算的

grammar calc;

stats: exp*;

exp
    : INT ('+' INT)+
    | exp ('*' exp)+
    | INT
    ;

INT: [0-9]+;
WS: [ \n]+ -> skip;

注意:上面的语法通过在“+”运算符周围放置INT(而不是在“*”周围放置exp)来作弊

下面是表达式
1*2+2*2+3*3
的(我认为)目标解析树的paintbrushed图:

下面的语法应该(几乎)生成您绘制的解析树。这是管理n元运算符和优先级的一种相当常见的方法

exp : add ;
add : mult ('+' mult)* ;
mult : term ('*' term)* ;
term : ( '(' exp ')' ) | INT ;

“希望这有帮助

恐怕你的问题不够清楚,我们无法提供帮助。看起来您知道如何实现您的目标(“+”解析树)。你能解释一下你想得到什么以及障碍是什么吗?也许一个具有代表性的示例表达式和所需的解析树会有所帮助。添加了更多的上下文和图表(特别是上面图表中的“+”解析树不能只接受表达式数字,因此2+2可以工作,但2+(2*2)不会)对此100%满意,因为它强制构造表达式以指定运算符优先级。在上面的例子中,通过简单地用“+”和“*”渲染行来指定和更改优先级是非常简单的。我认为您已经搞定了描述,因此出现了这个问题: