C++ 在C+中使用ANTLR3+;程序

C++ 在C+中使用ANTLR3+;程序,c++,parsing,expression,antlr,antlr3,C++,Parsing,Expression,Antlr,Antlr3,我目前正在开发一个应用程序,它将字符串(单个变量“x”的函数)作为输入并输出该函数的导数。程序的后半部分目前不是问题,我唯一遇到的问题是从字符串中“读取”函数。我正在使用ANTLRv3 for C来尝试实现这个目标,但我似乎无法让它工作。目前我缺少“antlr3.h”头文件,我似乎在任何地方都找不到。我的第二个问题是调用生成的解析器,它的C(++)代码是什么(下面是ANTLR代码)?我如何让它工作 提前感谢, 领带 语法表达; 选择权{ 语言=C; } @标题{ #ifndef PI #定义PI

我目前正在开发一个应用程序,它将字符串(单个变量“x”的函数)作为输入并输出该函数的导数。程序的后半部分目前不是问题,我唯一遇到的问题是从字符串中“读取”函数。我正在使用ANTLRv3 for C来尝试实现这个目标,但我似乎无法让它工作。目前我缺少“antlr3.h”头文件,我似乎在任何地方都找不到。我的第二个问题是调用生成的解析器,它的C(++)代码是什么(下面是ANTLR代码)?我如何让它工作

提前感谢,

领带

语法表达;
选择权{
语言=C;
}
@标题{
#ifndef PI
#定义PI 3.1415926535897
#endif//PI
#ifndef E
#定义E 2.7182818284590
#endif//E
#包括“ExpressionTree.h”
#包括
#包括}
解析返回[Functor*func]
:e=addExp EOF{func=$e.func;}
;
addExp返回[funcor*func]
@init{std::vector addList;
std::vector opList;}
:e1=multExp{addList.push_back($e1.func);}(o=('+'|'-'))e2=multExp{opList.push_back($o.text='+');addList.push_back($e2.func);})*
{
if(addList.size()==1){
func=addList[0];
}否则{
函子*current=addList[0];

对于(int i=0;i,antlr3.h文件是ANTLR运行时的主头文件。您可以从中获取此运行时,但此时此页面不可用

对于调用:ANTLR为每个解析器规则生成一个函数,您可以单独调用。通常,您设置解析器和词法分析器,然后调用解析器顶级规则,在您的情况下可能是parse()

我调用了MySQL语言的解析器,因此:

_input = antlr3StringStreamNew((pANTLR3_UINT8)_text, _input_encoding, _text_length, (pANTLR3_UINT8)"mysql-script");
_input->setUcaseLA(_input, ANTLR3_TRUE); // Make input case-insensitive. String literals must all be upper case in the grammar!

_lexer = MySQLLexerNew(_input);
_tokens = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(_lexer));
_parser = MySQLParserNew(_tokens);

_ast = _parser->query(_parser);

ANTLR3_UINT32 error_count = _parser->pParser->rec->getNumberOfSyntaxErrors(_parser->pParser->rec);
if (error_count > 0)
  log_debug3("%i errors found\n", error_count);
区分大小写取决于您的解析器。请尝试一下

_input = antlr3StringStreamNew((pANTLR3_UINT8)_text, _input_encoding, _text_length, (pANTLR3_UINT8)"mysql-script");
_input->setUcaseLA(_input, ANTLR3_TRUE); // Make input case-insensitive. String literals must all be upper case in the grammar!

_lexer = MySQLLexerNew(_input);
_tokens = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(_lexer));
_parser = MySQLParserNew(_tokens);

_ast = _parser->query(_parser);

ANTLR3_UINT32 error_count = _parser->pParser->rec->getNumberOfSyntaxErrors(_parser->pParser->rec);
if (error_count > 0)
  log_debug3("%i errors found\n", error_count);