我们正在开发一种建模工具,用户可以在其中插入少量代码。用户可以向此代码添加宏,我们需要在解析最终代码之前进行扩展。例如,当我解析以下代码时......
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 : . ;
我也尝试过非贪婪匹配,但大多数情况下,一切都以一个令牌结束,或者解析器崩溃了。有人能指出我正确的方向吗?
答案 0 :(得分:1)
您的macro
作品不应该使用宏标记:
macro : Macro1 | Macro2 | Macro3 | Macro4 ;
但宏观制作:
macro : macro1 | macro2 | macro3 | macro4 ;
当我更改它时,您的示例输入将按如下方式解析: