antlr生成词法分析器,但不生成解析器

时间:2017-07-15 01:11:10

标签: javascript antlr antlr4 lexer

我试图使用Antlr v4为简单的自定义语法生成词法分析器和解析器。问题是,当我运行Antlr .jar实用程序时,它会生成一个Lexer文件,但也不会生成Parser文件,我认为应该这样。

简单语法

// Define a grammar called Hello
grammar Hello;
r  : 'hello' ID ;         // match keyword hello followed by an identifier
ID : [a-z]+ ;             // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

Antlr工具
遵循这些说明:https://github.com/antlr/antlr4/blob/master/doc/tool-options.md。可以从http://www.antlr.org/download/index.html下载Java工具(我选择了antlr-4.7-complete.jar)。

让我们生成词法分析器和解析器antlr.jar -o outDir -Dlangage=JavaScript -visitor -listener test.g4

实际输出

  • HelloLexer.js
  • HelloLexer.tokens

所需的输出

  • HelloLexer.js
  • HelloParser.js
  • HelloListener.js
  • HelloVisitor.js

我喜欢解析器,因为一旦我输入了lexed,我想解析并生成一个我可以遍历的树,如本教程所示:

 var input = "your text to parse here"
 var chars = new antlr4.InputStream(input);
 var lexer = new MyGrammarLexer.MyGrammarLexer(chars);
 var tokens  = new antlr4.CommonTokenStream(lexer);
 var parser = new MyGrammarParser.MyGrammarParser(tokens);
 // ^ [!] notice here how I don't have an analogous "HelloParser.js" to run my tokens through!
 parser.buildParseTrees = true;
 var tree = parser.MyStartRule();

https://github.com/antlr/antlr4/blob/master/doc/javascript-target.md#how-do-i-run-the-generated-lexer-andor-parser

如何让Antlr工具生成我想要的HelloParser.js文件?现在它只生成Lexer,我所遵循的教程(上面的链接)没有我所处境况的详细信息。

1 个答案:

答案 0 :(得分:1)

通过重新尝试Antlr工具(Java / .jar)解决了这个问题,但是确定正确设置了Windows上的CLASSPATH

Getting started for Windows doc之后,必须将CLASSPATH环境变量设置为包含Jar文件的路径。我最初使用System Properties > Environment Variables窗口执行此操作,但出于某种原因,它未被注册(我已经重新检查了拼写错误,仍然没有看到问题)。

下次我手动运行命令SET CLASSPATH=.;C:\Javalib\antlr-4.5.3-complete.jar;%CLASSPATH%,现在正在生成词法分析器解析器。

所以问题是如果CLASSPATH设置不正确,Java工具会无声地失败。没有任何警告或错误,很难诊断出错误。