我要解析的语言包含
之类的语句public var a, b = 42, c;
即。 .g文件看起来像:
statements
: (introduction | expression ';'! | ... )+
;
introduction
: head single+ -> ^(head single)+
;
single
: Name ('='^ expression)?
;
head
: modifiers* v='var' -> ^(VARIABLE[$v] modifiers*)
;
生成这样的树很容易,但对我来说几乎没用(
) ----------statements----------
/ | \
variable variable variable
/ \ / \ / \
'public' 'a' 'public' '=' 'public' 'c'
/ \
'b' expr
我希望'='
位于中间节点之上:
----------statements----------
/ | \
variable '=' variable
/ \ / \ / \
'public' 'a' variable expr 'public' 'c'
/ \
'public' 'b'
但我无法找到重写规则。
答案 0 :(得分:1)
使用您设置规则的方式并不容易。
这是 可能的方式:
grammar T;
options {
output=AST;
ASTLabelType=CommonTree;
}
tokens {
STATEMENTS;
VARIABLE;
DEFAULT_MODIFIER;
}
declaration
: modifier 'var' name[$modifier.tree] (',' name[$modifier.tree])* ';' -> ^(STATEMENTS name+)
;
modifier
: 'public'
| 'private'
| /* nothing */ -> DEFAULT_MODIFIER
;
name [CommonTree mod]
: ID '=' expression -> ^('=' ^(VARIABLE {new CommonTree(mod)} ID) expression)
| ID -> ^(VARIABLE {new CommonTree(mod)} ID)
;
// other parser & lexer rules
产生以下AST:
输入:
public var a, b = 42, c;
并产生:
输入:
var a, b = 42, c;