字符串文字标记使用转义序列标记生成MismatchedTokenException

时间:2011-10-16 22:22:38

标签: antlr antlr3

我目前正在尝试实现一个Antlr解析器 我在添加转义序列支持后标识字符串文字的标记中获得了奇怪的MismatchedTokenException。

以下是导致问题的Antlr解析器示例:

rule: STRING_LITERAL ;

STRING_LITERAL
  :
  '"' STRING_GUTS '"'
  ;

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

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

您是否在此代码中看到任何问题?

请注意,如果我从STRING_GUTS中删除ESC,则字符串解析工作正常......

1 个答案:

答案 0 :(得分:2)

你必须发布你得到这个错误的输入,你正在使用的ANTLR版本,以及你运行测试的方式,因为我发现这个语法没有问题,因为你可以看到:

T.G

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的调试器,要么像我上面那样使用自定义类。