Возможно, я задаю глупый / базовый вопрос, но я был озадачен построением ANTLR AST.
То, что я хочу сделать, - это своего рода синтаксический анализатор булевых выражений, такой, что на родительских узлах у меня есть оператор и его оператор.операнды как дети.например, предложение
((ABC & D) | (E & (F | G)))
в идеале должно представлять
|
/ \
/ \
/ \
/ \
& &
/ \ / \
/ \ / \
/ D E |
/|\ / \
A B C / \
F G
Из следующей грамматики.
grammar Test;
options
{
language = 'Java';
output=AST;
}
exp : word (expRest^)? | '('! exp ')'! (expRest^)? ;
expRest : (('&'|'|'|'!'|'&!'|'|!')^) exp | (('~'^) digit+ exp);
word : letter letter* -> ^(letter letter*);
letter : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'a'|'b'|'c'|'d'|'e'|'f'|'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z'|'A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'I'|'J'|'K'|'L'|'M'|'N'|'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z';
digit : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
Проблема в том, что я получаю 'ABC' в виде списка (массива) узлов как потомков '&'.
Можно ли ограничить его одной строкой ???то есть 'ABC' или другими словами, возможно ли иметь несколько символов в корневом узле в AST ???Если да, то как мне этого добиться?
для справки, я хочу создать синтаксическое дерево «факторов риска и текущего экономического состояния»
PS У меня также естьпопробовал:
word : (letter letter*)^ ;
И просто для справки, я использую среду .NET.