Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有UTF8标记的ANTLR4语法与Java解析器一起工作,而与JS解析器一起失败_Javascript_Java_Utf 8_Antlr4 - Fatal编程技术网

Javascript 带有UTF8标记的ANTLR4语法与Java解析器一起工作,而与JS解析器一起失败

Javascript 带有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

我的javascript解析器遇到了一个问题。 我用Java从以下语法生成的解析器可以很好地使用UTF-8。 以下是我的语法:

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);
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...