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();
    }