3

我正在尝试制定一个将重写为嵌套树(类似于二叉树)的规则。

例如:

a + b + c + d;

会解析为像( ( (a + b) + c) + d). 基本上每个根节点都会有三个子节点(LHS '+' RHS),其中 LHS 可能是更多嵌套节点。

我尝试了一些类似的事情:

rule: lhs '+' ID;
lhs: ID | rule;

rule
    : rule '+' ID
    | ID '+' ID;

(有一些树重写)但他们都给了我一个关于它是左递归的错误。我不确定如何在没有某种递归的情况下解决这个问题。

编辑:我最近的尝试在右侧递归,这与我想要的相反:

rule:
ID (op='+' rule)?
-> {op == null}? ID
-> ^(BinaryExpression<node=MyBinaryExpression> ID $op rule)

(a + (b + (c + d) ) )

4

2 回答 2

2

以下语法:

grammar T;

options {
  output=AST;
}

tokens {
  BinaryExpression;
}

parse
 : expr ';' EOF -> expr
 ;

expr
 : (atom -> atom) (ADD a=atom -> ^(BinaryExpression $expr ADD $a))*
 ;

atom
 : ID
 | NUM
 | '(' expr ')'
 ;

ADD   : '+';
NUM   : '0'..'9'+;
ID    : 'a'..'z'+;
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();};

解析您的输入"a + b + c + d;"如下:

在此处输入图像描述

于 2012-06-27T21:21:25.647 回答
0

你试过了吗

rule: ID '+' rule | ID;

?

于 2012-06-27T02:46:36.750 回答