Строковый литерал токена генерирует исключение MismatchedTokenException с escape-последовательностью - PullRequest
1 голос
/ 17 октября 2011

В настоящее время я пытаюсь реализовать синтаксический анализатор Antlr.
Я получаю странное исключение MismatchedTokenException в токене, который идентифицирует строковые литералы после добавления поддержки escape-последовательности.

Ниже приведен пример анализатора Antlr, который вызывает проблему:

rule: STRING_LITERAL ;

STRING_LITERAL
  :
  '"' STRING_GUTS '"'
  ;

fragment
STRING_GUTS
  :
  ( ESC | ~('\\' | '"') )*
  ;

ESC
  :
  '\\'
  ( '\\' | '"' )
  ;

Вы видели какие-либо проблемы в этом коде?

Обратите внимание, что если я удаляю ESC из STRING_GUTS, синтаксический анализ строки работает хорошо ...

1 Ответ

2 голосов
/ 17 октября 2011

Вам нужно будет опубликовать ввод, с которым вы получаете эту ошибку, версию ANTLR, которую вы используете, и способ выполнения ваших тестов, потому что я не вижу проблем с этой грамматикой, так каквы можете увидеть:

Tg

grammar T;

rule
  :  STRING_LITERAL {System.out.println("parsed : " + $STRING_LITERAL.text);}
  ;

STRING_LITERAL 
  :  '"' STRING_GUTS '"'
  ;

fragment
STRING_GUTS
  :  (ESC | ~('\\' | '"'))*
  ;

// also a fragment rule perhaps?
ESC
  :  '\\' ('\\' | '"')
  ;

Main.java

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    String src = "\"a\\\"b\\\\c\"";
    TLexer lexer = new TLexer(new ANTLRStringStream(src));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    System.out.println("src    : " + src);
    parser.rule();
  }
}

Если я сгенерирую лексер и парсер из вашей грамматики (1), скомпилируйте все java-Исходные файлы (2) и запуск класса Main (3):

java -cp antlr-3.3.jar org.antlr.Tool T.g    # 1
javac -cp antlr-3.3.jar *.java               # 2
java -cp .;antlr-3.3.jar Main                # 3

На консоль выводится следующее:

src    : "a\"b\\c"
parsed : "a\"b\\c"

Т.е.: вход src анализируется какожидается.

Если у вас возникли проблемы с интерпретатором ANTLRWorks: не используйте его, он немного глючит.Либо используйте отладчик ANTLRWorks, либо используйте пользовательский класс, как я делал выше.

...