Для начала я хотел бы извиниться, если я не совсем точен в этом вопросе.
grammar Test;
@parser::header {#pragma warning disable 3021}
@lexer::header {#pragma warning disable 3021}
prog : expression? EOF;
expression : TEXT #text
| shift_left #shiftLeft
| shift_right #shiftRight
| upper_case #upperCase
| lower_case #lowerCase
| substring #ssubstring
| expression CONCANTENATE expression #concatenate
;
substring : SUBSTRING OBRACKET expression COMMA NUMBER COMMA NUMBER CBRACKET;
shift_left : SHIFT_LEFT OBRACKET expression COMMA NUMBER CBRACKET;
shift_right : SHIFT_RIGHT OBRACKET expression COMMA NUMBER CBRACKET;
upper_case : UPPER OBRACKET expression CBRACKET;
lower_case : LOWER OBRACKET expression CBRACKET;
compileUnit
: EOF
;
/*
* Lexer Rules
*/
fragment L : ('L'|'l') ;
fragment E : ('E'|'e') ;
fragment F : ('F'|'f') ;
fragment T : ('T'|'t') ;
fragment U : ('U'|'u') ;
fragment P : ('P'|'p') ;
fragment R : ('R'|'r') ;
fragment O : ('O'|'o') ;
fragment W : ('W'|'w') ;
fragment I : ('I'|'i') ;
fragment G : ('G'|'g') ;
fragment H : ('H'|'h') ;
fragment S : ('S'|'s') ;
fragment B : ('B'|'b') ;
fragment N : ('N'|'n') ;
COMMA : ',';
OBRACKET : '(';
CBRACKET : ')';
CONCANTENATE : '+';
NUMBER : [1-9] (DIGIT)*;
DIGIT : [0-9];
SHIFT_RIGHT : R I G H T;
UPPER : U P P E R;
LOWER : L O W E R;
SUBSTRING : S U B S T R I N G;
SHIFT_LEFT : L E F T;
TEXT : '"' .*? '"';
WHITESPACE : (' '|'\t'|'\r'|'\n')+ -> skip ;
WS
: ' ' -> channel(HIDDEN)
;
То, чего я хочу достичь, - это оценить дерево (или, другими словами, - иметь возможность на самом деледелать простые операции).Вся идея грамматики заключается в выполнении простых операций над строками.Сама проблема в том, что я не знаю, как на самом деле пройти по дереву и оценить его выражения.Мне будет намного проще привести пример здесь:
"upper (left (" text "), 2)" <- эта операция является вложенной операцией, которая должна: 1. сдвигать "текст"на 2 слева (не имеет значения, что он делает на самом деле).2. Вернуть смещенное значение «вверх».3. Предполагается, что верхнее выражение собирает все, что произведено функцией left (), и выполняет свою работу, в этом случае переносит «text» в верхний регистр.</p>
Это целое «вложенное выражение» вызывает проблему.Я реализовал свой собственный класс посетителя, и у меня есть куча методов для переопределения, например, выражение, подстрока, shiftright и т. Д. - все они взяты из грамматики, но я понятия не имею, как их использовать в случае, с которыми я сталкиваюсь, какие методыиспользовать, чтобы я мог на самом деле использовать грамматику.