这是我的树语法:

grammar t;
options{
  output = AST;
}
type
  :
  'NVARCHAR' -> "VARCHAR"
  ;


ANTLR3 3.1.3说:

syntax error: antlr: t.g:12:5: unexpected token: 'NVARCHAR'


怎么了我从this article那里拿走的。

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'
  ;


这会更改令牌的texttype



如您所见,在两个演示中,token=VARCHAR都被打印到控制台:

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

10-05 23:03
查看更多