Javascript 带有UTF8标记的ANTLR4语法与Java解析器一起工作,而与JS解析器一起失败
我的javascript解析器遇到了一个问题。 我用Java从以下语法生成的解析器可以很好地使用UTF-8。 以下是我的语法: LabeledWims.g4Javascript 带有UTF8标记的ANTLR4语法与Java解析器一起工作,而与JS解析器一起失败,javascript,java,utf-8,antlr4,Javascript,Java,Utf 8,Antlr4,我的javascript解析器遇到了一个问题。 我用Java从以下语法生成的解析器可以很好地使用UTF-8。 以下是我的语法: LabeledWims.g4 我使用以下工具生成了Java解析器: CharStream input = CharStreams.fromFileName(inputFile); LabeledWimsLexer lexer = new LabeledWimsLexer(input); CommonTokenStream tokens = new
我使用以下工具生成了Java解析器:
CharStream input = CharStreams.fromFileName(inputFile);
LabeledWimsLexer lexer = new LabeledWimsLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
LabeledWimsParser parser = new LabeledWimsParser(tokens);
ParseTree tree = parser.wims(); // begin parsing at init rule
System.out.println(tree.toStringTree(parser)+"\n"); // print LISP-style tree
EvalVisitor eval = new EvalVisitor();
eval.visit(tree);
antlr4-无侦听器-访问者LabeledWims.g4
然后,我在主Java类中使用以下命令调用解析器:
CharStream input = CharStreams.fromFileName(inputFile);
LabeledWimsLexer lexer = new LabeledWimsLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
LabeledWimsParser parser = new LabeledWimsParser(tokens);
ParseTree tree = parser.wims(); // begin parsing at init rule
System.out.println(tree.toStringTree(parser)+"\n"); // print LISP-style tree
EvalVisitor eval = new EvalVisitor();
eval.visit(tree);
如您所见,我使用CharStream类在源代码中允许UTF-8字符
它生成以下格式良好的LISP树:
(wims (title \title { (string Un pr é bis) }) \n (language...
(每个UTF-8字符生成一个令牌,但目前并不重要)
然后我想用Javascript做同样的事情。由于graddle的args'-Dlanguage=Javascript'、'LabeledWims.g4'、'-o'、'static/generated Parser'
并使用以下命令调用JS脚本中的解析器:
var lexer = new TodoLexer.LabeledWimsLexer(chars);
var tokens = new antlr4.CommonTokenStream(lexer);
console.log("Parsed: "+ tokens);
var parser = new TodoParser.LabeledWimsParser(tokens);
parser.buildParseTrees = true;
var tree = parser.wims();
var extractor = new MyWimsListener();
antlr4.tree.ParseTreeWalker.DEFAULT.walk(extractor, tree);
但LISP树生成的避免UTF-8字符如下:
(wims (title \title { (string Un pr bis) }) \n (language...
正如你所看到的,“埃”从树上消失了。我在浏览器和textarea以及终端中的node.js脚本中进行了尝试,结果是一样的。我无法确定这个问题的根源。我将非常感谢你的帮助
Chris完全支持Unicode是一项相对较新的功能,JS目标可能尚未实现。感谢您的回答。我会有耐心的:-)我发现我在旧版本的ANTLR上使用了。事实上,我用来在javascript中生成lexer和parser的build.gradle配置提到了依赖项{runtime'org.antlr:antlr4:4.5'},我已经通过运行时'org.antlr:antl4:4.7.2'对其进行了更改,它工作得非常好。尽管如此,每个UTF字符都会生成一个单独的令牌,但我将对此进行研究。完全Unicode支持是一个相对较新的功能,JS目标可能尚未实现。感谢您的回答。我会有耐心的:-)我发现我在旧版本的ANTLR上使用了。事实上,我用来在javascript中生成lexer和parser的build.gradle配置提到了依赖项{runtime'org.antlr:antlr4:4.5'},我已经通过运行时'org.antlr:antl4:4.7.2'对其进行了更改,它工作得非常好。尽管如此,每个UTF字符生成一个单独的令牌,但我将对此进行研究。
(wims (title \title { (string Un pr bis) }) \n (language...