Antlr4中的宏扩展

时间:2015-01-14 20:25:41

标签: antlr4

我们正在开发一种建模工具,用户可以在其中插入少量代码。用户可以向此代码添加宏,我们需要在解析最终代码之前进行扩展。例如,当我解析以下代码时......

FOR i := 6 TO 1 DO 
    j := 6;
    IF SM_MCP.State = oMcpApplication.UNDEFINED
    THEN
        Macro1(MsgNotInZeroPosition);
    END_IF;
END_FOR;

...我只是想在访问者函数中处理宏。结果将是:

FOR i := 6 TO 1 DO 
    j := 6;
    IF SM_MCP.State = oMcpApplication.UNDEFINED
    THEN
        <ClassName>.MessageQueue := MsgNotInZeroPosition;
    END_IF;
END_FOR;

(这只是一个组成的例子。)我试图创建一个简单的语法来解析宏并简单地复制它周围的一切。但是,由于某种原因,我无法让它正常工作。

我尝试了几种语法,它们看起来都是这样的:

grammar Macros;

source : (code macro )* code ;

macro : macro1 | macro2 | macro3 | macro4 ;
macro1 : Macro1  '(' parameters ')' ;
macro2 : Macro2  '(' parameters ')' ;
macro3 : Macro3  '(' parameters ')' ;
macro4 : Macro4  '(' parameters ')' ;

code : OTHER*  ;
parameters : OTHER*  ;

// Lexer rules

Macro1: 'Macro1';
Macro2: 'Macro2';
Macro3: 'Macro3';
Macro4: 'Macro4';

OTHER : . ;

我也尝试过非贪婪匹配,但大多数情况下,一切都以一个令牌结束,或者解析器崩溃了。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您的macro作品不应该使用宏标记:

macro : Macro1 | Macro2 | Macro3 | Macro4 ;

但宏观制作:

macro : macro1 | macro2 | macro3 | macro4 ;

当我更改它时,您的示例输入将按如下方式解析:

enter image description here