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

问题描述:

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

简单的语法

// 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。 Java工具可以从http://www.antlr.org/download/index.html下载(我选择了antlr-4.7-complete.jar)。

让我们产生的词法和语法分析器

实际输出

  • 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,并且我遵循的教程(上面的链接)没有关于我处于的情况的任何详细信息。

+0

难道你会把JavaScript与Java混淆吗? – lumio

+0

从表面上看,使用Java工具生成JavaScript可能看起来很奇怪,但根据[Antlr - 如何创建词法分析器或解析器](https://github.com/antlr/antlr4/blob/master/doc /javascript-target.md#how-to-create-a-javascript-lexer-or-parser)在继续阅读输入并最终使用其语法树的下一步之前,我需要创建词法分析器和分析器。 – ChiefOfGxBxL

+0

你最终得到ANTLR的错误吗?你的方法是完全正确的,所以我认为可能会导致ANTLR中止这一代。作为一个测试,尝试一个不同的目标(例如C++)来查看JS目标是否存在导致问题的东西。 –

该问题已通过重新尝试Antlr工具(Java/.jar),但是在Windows上设置为CLASSPATH的设置是正确的。

Getting started for Windows文档后,必须将CLASSPATH环境变量设置为包含Jar文件的路径。我原来是用System Properties > Environment Variables这个窗口做的,但由于某种原因,它没有被注册(我重新检查了错别字,但仍然没有发现问题)。

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

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