Antlr4中的宏扩展

Antlr4中的宏扩展,antlr4,Antlr4,我们正在开发一个建模工具,用户可以在其中的不同位置插入小块代码。用户可以将宏添加到此代码中,我们需要在解析最终代码之前展开宏。例如,当我解析以下代码时 FOR i := 6 TO 1 DO j := 6; IF SM_MCP.State = oMcpApplication.UNDEFINED THEN Macro1(MsgNotInZeroPosition); END_IF; END_FOR; 。。。我只想在visitor函数中处理宏。结果将是

我们正在开发一个建模工具,用户可以在其中的不同位置插入小块代码。用户可以将宏添加到此代码中,我们需要在解析最终代码之前展开宏。例如,当我解析以下代码时

FOR i := 6 TO 1 DO 
    j := 6;
    IF SM_MCP.State = oMcpApplication.UNDEFINED
    THEN
        Macro1(MsgNotInZeroPosition);
    END_IF;
END_FOR;
。。。我只想在visitor函数中处理宏。结果将是:

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

我也尝试过非贪婪匹配,但大多数情况下,所有东西都会在一个令牌中结束,或者解析器崩溃。有人能告诉我正确的方向吗?

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

macro : Macro1 | Macro2 | Macro3 | Macro4 ;
但是宏产品:

macro : macro1 | macro2 | macro3 | macro4 ;
当我改变这一点时,您的示例输入将被解析如下:


好消息。不过,我用正确的语法正确地做了。只是我在示例中犯了一个错误。我的错。@Tsjakka,检查我的编辑:当我在回答中提出修改时,它就像一个符咒。巴特,我很惊讶。很抱歉,我现在无法复制,因为我没有带笔记本电脑下班。星期一我会试试。我刚试过,结果也一样。一个充满希望的开始,谢谢你的帮助。现在,为了更进一步,我需要在一个令牌中获取代码和参数,而不是在单独的令牌中获取每个字符。此外,还有一些代码使用与宏同名的变量(但后面没有“(”)。关于如何防止解析器认为它是宏的任何提示?@Tsjakka,没问题。如果您还有任何问题,请随意创建一个新问题。小评论框不适合广泛的问答。
macro : macro1 | macro2 | macro3 | macro4 ;