条件解析 - 有可能吗?

时间:2013-11-21 10:08:28

标签: gcc antlr3

我需要使用相同的语法实现2遍编译器。第一遍只使用很少的规则。第二遍使用完整的语法。我正在寻找标记每个传递中使用哪些规则,如ifdef ifndef(没有额外的“噪声规则”) 有没有一种简单的方法可以做到这一点?

第二个问题;有没有办法“陷阱”EOF并在文件末尾有“待机”状态,所以下一个文件(下一个pANTLR3_INPUT_STREAM)是前一个文件的顺利延续 实施它的最佳方法是什么?

感谢

1 个答案:

答案 0 :(得分:0)

您可以使用语义谓词来允许解析器遵循以下某些路径:

remove_partitioning:
    {SERVER_VERSION >= 50100}? => REMOVE_SYMBOL PARTITIONING_SYMBOL
;

我一直使用它来启用/禁用依赖于版本的语言功能。

SERVER_VERSION是我在@lexer :: includes部分中定义的宏:

#define SERVER_VERSION ((RecognitionContext*)RECOGNIZER->state->userp)->version

正如您所看到的,我使用识别器状态的用户指针来传递一个结构,该结构包含解析器和词法分析器的上下文信息。创建解析器时设置此值:

...
_lexer = MySQLLexerNew(_input);
_lexer->pLexer->rec->state->userp = &_context;
_tokens = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(_lexer));
_parser = MySQLParserNew(_tokens);
_parser->pParser->rec->state->userp = &_context;
...