Дерево определений переменных с инициализацией и без нее - PullRequest
1 голос
/ 30 августа 2011

мой язык для анализа содержит такие выражения, как

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'

, но я не могу найти правило перезаписи, чтобы сделатьчто.

1 Ответ

1 голос
/ 30 августа 2011

Это не так легко сделать, как вы установили свои правила.

Вот как это возможно возможно возможно:

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:

enter image description here

для ввода:

public var a, b = 42, c;

И производит:

enter image description here

для ввода:

var a, b = 42, c;
...