Antlr语法文件的一些常用配置选项
.-noscript-blocked { border: 1px solid red !important; background: white url("chrome://noscript/skin/icon32.png") no-repeat left top !important; opacity: 0.6 !important; }
- 要想在生成的cpp代码中添加一些预定义的头文件,可以使用Header语法定义,示意如下
header {
#include <iostream> // if you want to use some cout's in the actions
ANTLR_USING_NAMESPACE(std)
ANTLR_USING_NAMESPACE(antlr)
// Global header ends here
}
注意 该定义只能被添加到生成的hpp文件中,而不会添加到生成的cpp文件中。
- 有时我们需要在Antlr生成的cpp中添加自定义的函数过程,可以使用花括号包含自定义的函数和过程,但是注意该定义需要放在具体parser或者Lexer之前。如下例示意
//
//
{
void XXXParser::AddTableName(RefAST t)
{
vTables.push_back(t->getText());
cout << "Found " << getTokenName(t->getType())
<< " '" << t->getText()
//<< "' at line " << t->getLine()//<< t->getLine()
<< endl;
}
}
class XXXParser extends Parser;
table_name :
(t:qualified_name)
{
AddTableName(#t);
}
| (tq:qualified_local_table_name)
{
AddTableName(#tq);
}
;
- 要想使用TokenStreamRewriteEngine时,我们需要设置noConstructors开关为true,这样Antlr则不会生成默认的构造函数,否则编译代码会有问题
- 在生成c++代码时,要想添加Parser的方法定义时,需要在Parser定义后添加具体的方法定义,生成头文件时,这部分代码会被放到头文件中,实例如下:
class DmlSQL2Parser extends Parser;
options {
importVocab = DmlSQL2Lex;
exportVocab = DmlSQL2; // Export vocabulary
k = 2; // Lookahead
defaultErrorHandler = false; // Automatic error handling
codeGenMakeSwitchThreshold=4; // Code optimization
codeGenBitsetTestThreshold=8; // Code optimization
buildAST = true; // Automatic AST building
noConstructors = true;
}{
//use antlr add below hpp define
private:
TokenStreamRewriteEngine& engine;
public:
DmlSQL2Parser(TokenStreamRewriteEngine& lexer)
: LLkParser(lexer,1), engine(lexer)
{
}
public:
vector<FieldEntity> vColumns;
vector<TableEntity> vTables;
vector<ValueEntity> vValues;
void Reset();
private:
void AddTable(string szTableName, string szTableAlias);
void AddColumn(string szTableName, string szColumnName , string szColumnAlias);
void AddValue(string szTableName, string szColumnName, string szValue);
void ProcessSQL();
}