Обратите внимание, что первое предложение Теренса начинается с: "только что было несколько классных идей о языке спецификации семантических правил ..." .Вот что такое первый пример: идея.Это недопустимый синтаксис.
Для вас есть (как минимум) два варианта:
1.немедленно переписать текст в токене
grammar T;
options{
output=AST;
}
@parser::members {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream("NVARCHAR"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.type();
}
}
type
: NVARCHAR {System.out.println("token=" + $NVARCHAR.text);}
;
NVARCHAR
: 'NVARCHAR' {setText("VARCHAR");}
;
Но это только корректирует text
, а не type
токена, который остается типом NVARCHAR
.
2.используйте воображаемый токен:
grammar T;
options{
output=AST;
}
tokens {
VARCHAR='VARCHAR';
}
@parser::members {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream("NVARCHAR"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.type();
}
}
type
: NVARCHAR -> VARCHAR
;
NVARCHAR
: 'NVARCHAR'
;
, который меняет text
и type
токена.
Как видите, с обоимидемки, token=VARCHAR
выводится на консоль:
bart@hades:~/Programming/ANTLR/Demos/T$ java -cp antlr-3.3.jar org.antlr.Tool T.g
bart@hades:~/Programming/ANTLR/Demos/T$ javac -cp antlr-3.3.jar *.java
bart@hades:~/Programming/ANTLR/Demos/T$ java -cp .:antlr-3.3.jar TParser
token=VARCHAR