いくつかのフラグメントを使用する字句規則(整数)があります。パーサールール(解析)では、問題のトークンを生成したフラグメントに応じて、ツリーを別の方法で書き直したいと思います。私が試みていることを示すために、小さな文法を作成しました。
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();};
解析ルールで、架空のDecimalNodeではDECIMAL_LITERALを、BinaryNodeではBINARY_LITERAL(NumberNodeの下のすべてではなく)を書き換えたいと思います。
字句ルール内のトークンタイプを変更してこれを実行しようとしています。これにより、解析ルール内でそれに応じて書き換えることができます。
アクションでこれを行うことができるはずですが、タイプを変更するために返されたトークンを見つける方法を理解できませんでした。http://www.antlr.org/wiki/display/ANTLR3/Special+symbols+in+actionsは、$ tokenrefが機能するはずであることを示しているようですが、まったく翻訳されていません。
または、これを達成する別の方法はありますか?
前もって感謝します。