У меня есть лексическое правило (Integer), которое использует некоторые фрагменты. В правиле парсера (синтаксическом анализе) я хочу переписать свое дерево по-разному, в зависимости от того, какой фрагмент сгенерировал рассматриваемый токен. Я составил небольшую грамматику, чтобы продемонстрировать, что я пытаюсь сделать:
grammar subrange;
options {
output=AST;
}
tokens {
NumberNode;
DecimalNode;
BinaryNode;
HexNode;
OctalNode;
}
parse
: Integer+ -> ^(NumberNode Integer)+
;
Integer
: DECIMAL_LITERAL
| BINARY_LITERAL
| HEX_LITERAL
| OCTAL_LITERAL
;
fragment BINARY_LITERAL
: '2#' ('0' | '1')+
;
fragment HEX_LITERAL
: ('16#' | '0' ('x'|'X')) HEX_DIGIT+
;
fragment HEX_DIGIT
: (DIGIT|'a'..'f'|'A'..'F')
;
fragment DECIMAL_LITERAL
: ('0' | '1'..'9' DIGIT*)
;
fragment OCTAL_LITERAL
: '8#' ('0'..'7')+
;
fragment DIGIT
: '0'..'9'
;
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();};
Я хочу, чтобы правило parse переписывало DECIMAL_LITERAL под воображаемым DecimalNode, но BINARY_LITERAL под BinaryNode (а не все под NumberNode).
Я пытаюсь сделать это, изменив тип токена внутри лексического правила, чтобы затем я мог соответствующим образом переписать внутри правила синтаксического анализа.
Я думаю, что смогу сделать это с помощью действия, но я не смог понять, как найти возвращенный токен, чтобы изменить его тип. http://www.antlr.org/wiki/display/ANTLR3/Special+symbols+in+actions, похоже, указывает на то, что $ tokenref должен работать, но он вообще не переводится.
Или есть другой способ добиться этого?
Заранее спасибо.
DECIMAL_LITERAL -> DecimalNode
иBINARY_LITERAL -> BinaryNode
. А как насчетHEX_LITERAL
иOCTAL_LITERAL
? Я также вижу воображаемые токены узлов для этих двух, но вы их не упоминаете. - person Bart Kiers   schedule 18.07.2012