我试图从命令行运行ANTLR C语法文件(DummyC.g)来解析C源文件和头文件(啊).当我使用antlr.jar文件运行它时,它会生成解析器和词法分析器文件.但是当我编译测试文件Main.java时.它给出了缺少ANTLR包的错误,如下所示.
C:\ antlr-2.7.6\test> javac Main.java
Main.java:1:package org.antlr.tool不存在import org.antlr.tool.;
^ Main.java:2:包org.antlr.runtime不存在import org.antlr.runtime.;
^ Main.java:3:包org.antlr.runtime.tree不存在import org.antlr.runtime.tree.;
^ Main.java:4:包org.antlr.stringtemplate不存在import org.antlr.stringtemplate.;
^ Main.java:8:找不到符号符号:class CommonTree location:class Main CommonTree tree = DummyCParser.start("ah");
Main.java
import org.antlr.tool.*;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;
public class Main {
public static void main(String[] args) throws Exception {
CommonTree tree = DummyCParser.start("a.h");
DOTTreeGenerator gen = new DOTTreeGenerator();
StringTemplate st = gen.toDOT(tree);
System.out.println(st);
}
}
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?
Antlr是否适合解析文本解析后没有EOF的流中的数据?根据我的观察,词法分析器在收到下一个令牌的第一个字符之前不会发出当前令牌.最重要的是 - 在收到下一个规则的第一个标记之前,解析器似乎不会发出规则.这是我尝试过的简单语法:
fox: 'quick' 'brown' 'fox' '\r'? '\n' ;
Run Code Online (Sandbox Code Playgroud)
然后我使用生成的解析器与UnbufferedCharStream和UnbufferedTokenStream:
CharStream input = new UnbufferedCharStream(is);
MyLexer lex = new MyLexer(input);
lex.setTokenFactory(new CommonTokenFactory(true));
TokenStream tokens = new UnbufferedTokenStream(lex);
MyParser parser = new MyParser(tokens);
MyParser.FoxContext fox = parser.fox();
Run Code Online (Sandbox Code Playgroud)
当流" 快速 "时 - 没有任何反应.
当' b '进来时 - 进入规则' 狐狸 '
然后' roun ' - 什么都没有(2个令牌在流中 - 没有人知道它们!)
只有在' f '之后,听众才会访问第一个令牌:' quick '
然后 - ' 牛 ' 没什么
在新行(unix):访问令牌' 棕色 '
现在,流具有所有数据(4个令牌),但只能识别2个令牌.
我发现为了通过系统推送这些令牌,流可以发出2个令牌,即语法已知的任何令牌.它可能是2个额外的新行,或者说' 狐狸 '和' 棕色 '.只有这样才能访问令牌" 狐狸 "和" \n ",解析器退出规则" …