Как переписать токен с текстом в древовидную грамматику? - PullRequest
1 голос
/ 31 мая 2011

Это моя древовидная грамматика:

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

ANTLR3 3.1.3 говорит:

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

Что здесь не так?Я взял это из этой статьи .

пс.Я использую эту грамматику позже, чтобы извлечь из нее АСТ.Как только AST найден, я прохожу его и добавляю текст каждого токена в некоторый строковый буфер.Идея переписывания выше заключается в замене определенных токенов.Я делаю сопоставление между языками (точнее говоря, диалект SQL на SQL).

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Обратите внимание, что первое предложение Теренса начинается с: "только что было несколько классных идей о языке спецификации семантических правил ..." .Вот что такое первый пример: идея.Это недопустимый синтаксис.

Для вас есть (как минимум) два варианта:


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
1 голос
/ 09 декабря 2014

в antlr4, заменяя текст и тип, можно с помощью действия type:

OldTokenType: 
    ('Token1' | 'Token2' | 'Token3' ) {setText("New Token");} 
    -> type(NewTokenType); 
...