如何用树语法中的文本重写令牌?

| 这是我的树语法:
grammar t;
options{
  output = AST;
}
type
  :
  \'NVARCHAR\' -> \"VARCHAR\"
  ;
ANTLR3 3.1.3说:
syntax error: antlr: t.g:12:5: unexpected token: \'NVARCHAR\'
这怎么了我从这篇文章中学到了。 ps。稍后我将使用此语法,以使它脱离AST。检索到AST之后,我将遍历它,并将每个令牌的文本添加到某个字符串缓冲区中。上面重写的想法是替换某些令牌。我正在做语言到语言的映射(具体来说是从SQL到SQL的方言)。     
已邀请:
        请注意,第一句话Terence开头为:““关于语义规则规范语言的一些不错的主意...”。那就是第一个例子:一个想法。这是无效的语法。 您至少有两个选择: 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
。 如您所见,在两个演示中,, 9都被打印到控制台上: bart @ hades:〜/编程/ ANTLR / Demos / T $ java -cp antlr-3.3.jar org.antlr.Tool T.g bart @ hades:〜/编程/ ANTLR / Demos / T $ javac -cp antlr-3.3.jar * .java bart @ hades:〜/编程/ ANTLR / Demos / T $ java -cp。:antlr-3.3.jar TParser 令牌= VARCHAR     
        在antlr4中,可以通过
type
动作来替换文本和类型:
OldTokenType: 
    (\'Token1\' | \'Token2\' | \'Token3\' ) {setText(\"New Token\");} 
    -> type(NewTokenType); 
    

要回复问题请先登录注册