1
我希望* addition_operator *的樹重寫不僅包含頂層節點的整個子樹,所以* hint_keywords *仍然在樹中。樹重寫 - 整個子樹不只是頂級節點應該成爲根
另外是如此複雜,因爲我想在樹中添加T_LEFT和T_RIGHT。
ANTLR 3.3
語法:
grammar Test;
options {
output = AST;
}
tokens {
T_LEFT;
T_RIGHT;
T_MARKER;
}
@lexer::header {
package com.spielwiese;
}
@header {
package com.spielwiese;
}
NUM : '0' .. '9' ('0' .. '9')*;
ASTERISK : '*';
PLUS : '+';
MINUS : '-';
WS : (' '|'\r'|'\t'|'\n') {skip();};
addition
:
(a=atom -> $a)
(
addition_operator b=atom
->
^(addition_operator
^(T_LEFT $addition)
^(T_RIGHT $b)
)
)+
;
atom
: NUM
| '(' addition ')' -> addition
;
addition_operator
: PLUS hints? -> ^(PLUS hints?)
| MINUS hints? -> ^(MINUS hints?)
;
hints
: '[' hint_keywords += hint_keyword (',' hint_keywords += hint_keyword)* ']'
->
$hint_keywords
;
hint_keyword
: 'FAST'
| 'SLOW'
| 'BIG'
| 'THIN'
;
至於我能看到的原因是RewriteRuleSubtreeStream#nextNode(),它使用adaptor.dupNode(樹)的實施,我想一個適配器。 dupTree(樹)。
給定的輸入
2 + [BIG] 3 - [FAST,THIN] 4
是:
+---------+
| - |
+---------+
| \
| \
T_LEFT T_RIGHT
| |
+---------+
| + | 4
+---------+
| \
T_LEFT T_RIGHT
| |
2 3
並且應該是
+---------+
| - |
+---------+
// | \
// | \
FAST THIN T_LEFT T_RIGHT
| |
+---------+
| + | 4
+---------+
/ | \
/ T_LEFT T_RIGHT
BIG | |
2 3
謝謝您的回答!它很好地解決了這個問題!但T_MARKER僅僅是更復雜子樹的一個例子。在你的解決方案中,你正在設置T_MARKER。我需要一個子樹的通用解決方案。 – ollins 2012-02-07 17:37:41
示例增強 – ollins 2012-02-07 18:20:14
不客氣@ollins。 – 2012-02-07 19:15:56