我目前正在尝试实现一个Antlr解析器 我在添加转义序列支持后标识字符串文字的标记中获得了奇怪的MismatchedTokenException。
以下是导致问题的Antlr解析器示例:
rule: STRING_LITERAL ;
STRING_LITERAL
:
'"' STRING_GUTS '"'
;
fragment
STRING_GUTS
:
( ESC | ~('\\' | '"') )*
;
ESC
:
'\\'
( '\\' | '"' )
;
您是否在此代码中看到任何问题?
请注意,如果我从STRING_GUTS中删除ESC,则字符串解析工作正常......
答案 0 :(得分:2)
你必须发布你得到这个错误的输入,你正在使用的ANTLR版本,以及你运行测试的方式,因为我发现这个语法没有问题,因为你可以看到:
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
: '\\' ('\\' | '"')
;
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的调试器,要么像我上面那样使用自定义类。