这个问题是一个类似问题的后续问题与java代码 - 如何报告语法歧义在antlr4。我正在尝试将该代码移植到c,但是我在使用antlr模板时遇到了一些编译错误。
c中的主程序如下:
// TestA_Main.cpp
using namespace std;
using namespace antlr4;
using namespace atn;
int main(int argc, char **argv)
{
string filename = argv[0];
ifstream stream;
stream.open(filename);
ANTLRInputStream input(stream);
AmbigLexer lexer(&input);
CommonTokenStream tokens(&lexer);
AmbigParser parser(&tokens);
parser.addErrorListener(new DiagnosticErrorListener());
// the following line has an error on the call to getInterpreter
parser.getInterpreter().setPredictionMode(PredictionMode::LL_EXACT_AMBIG_DETECTION);
parser.stat();
}
我在上面运行了以下命令:
java org.antlr.v4.Tool -Dlanguage=Cpp Ambig.g4
g++ -std=gnu++0x -I. -I/antlr4_cpp/runtime/include -I/antlr4_cpp/runtime/include/atn TestA_Main.cpp
在调用getInterpreter时,我得到了以下编译错误:
TestA_Main.cpp: In function ‘int main(int, char**)’:
TestA_Main.cpp:27:27: error: no matching function for call to ‘AmbigParser::getInterpreter()’
parser.getInterpreter().setPredictionMode(PredictionMode::LL_EXACT_AMBIG_DETECTION);
^
In file included from /softwares/antlr4/antlr4_cpp/runtime/include/Lexer.h:8:0,
from /softwares/antlr4/antlr4_cpp/runtime/include/antlr4-runtime.h:32,
from TestA_Main.cpp:4:
/softwares/antlr4/antlr4_cpp/runtime/include/Recognizer.h:73:8: note: candidate: template<class T> T* antlr4::Recognizer::getInterpreter() const
T* getInterpreter() const {
^
/softwares/antlr4/antlr4_cpp/runtime/include/Recognizer.h:73:8: note: template argument deduction/substitution failed:
TestA_Main.cpp:27:27: note: couldn't deduce template parameter ‘T’
parser.getInterpreter().setPredictionMode(PredictionMode::LL_EXACT_AMBIG_DETECTION);
你能告诉我如何修复上面的代码吗?我用的是antlr-4.6
这是一个模板函数,您必须显式指定模板参数:
parser.getInterpreter<ParserATNSimulator>()->setPredictionMode(PredictionMode::SLL);
根据antlr4书(第159页),并使用语法Ambig. g4,语法歧义可以通过以下方式报告: 或等效代码形式: grun命令使用antlr-4.5.3为我正确报告歧义。但是当我使用代码表单时,我没有收到歧义报告。这是命令跟踪: TestA_Listener.java代码如下: 有人能指出应该如何修改上述java代码以打印歧义报告吗? 为了完整起见,下面是代码 Ambig.g4 : 语法阿姆比格;
使用上面的测试数据运行ANTLR4测试平台,输出为 我可以看到第一个标记是ID的<4>,值为'rrv0' 我已经尝试重新安排lexer项目顺序。我还尝试通过在语法规则中显式匹配来使用隐式lexer项(而不是通过显式lexer项)。我也试着做火柴。那些对我来说并不成功。
我试图使用从plsql antlr4语法文件生成的Java类解析存储在应用程序配置中的一些SQL。 在这个上下文中,我想知道如何正确使用这些类,以及如何利用grun(org.antlr.v4.gui.testrig)进行一些测试。 我在这里发现了一些元素,但它可能已经过时了,因为这篇文章 null 注sql_script是语法的顶层元素 另一方面,我想使用antlr4入门文档中的org.antlr
但我看不出这两个规则中有任何空字符串的可能性。还是我错了?这个代码有什么问题?
亲爱的Antlr4社区, 解析似乎很顺利: 但是,我得到以下错误消息: 错误是: [1]交换量子精确和正态分布的定义。但是交换在第一个输入中引入了一个错误: 因为在这种情况下,'6'只被视为一个正态分布,而不是一个全精确值。 [2]尝试为Quanteact(数量的花括号)创建一个上下文,这样lexer只在这个有限的上下文中提供Quanteact符号。但是我没有为此找到ANTLR4原语。 所以似乎什
我已经在分析模式下成功启动了我的应用程序,但我不确定如何从Jprofiler生成报告或指标。 我可以看到Live内存(所有对象、记录的对象编号。of.实例计数等)、堆遍历器等,但我不确定JProfiler对我的应用程序的结论或建议。 有人能帮忙吗?