DSL预处理器递归宏

时间:2015-01-29 13:14:38

标签: recursion c-preprocessor dsl

我使用特定于域的语言,其预处理器让人联想到C / C ++预处理器但有差异,我希望它能自我解释显示一些示例,如果不是,我可以详细说明规格

#define VAL value
#macro MACRONAME($var1,$var2) ( ($var1) + ($var2))

\字符允许包含换行符或包含换行符的宏文本。 e.g。

#define VAL $var=1\
$var=2

会将VAL预处理到

$var=1
$var=2

我大概试图生成以下内容

ADD 1 "SNA"
ADD 2 "FOO"
ADD 3 "BAR"
SHOW
$var_sna ASSIGN 1
$var_foo ASSIGN 2
$var_bar ASSIGN 3

基本上SHOW使用标题,显示UI,获取用户输入,然后将获取的用户输入分配给变量。

问题在于它容易出错,如果你不对指数进行三重检查,这会在屁股中咬你,而不是将你想到的值分配给你认为的变量,而你#&# 39;破坏你的样品。

我设法得到一些看起来像这个(这个预处理器允许嵌套评估)的东西

#macro MACROADD($index,$variable,$title,$inside) ADD $index $title\
$inside\
$variable ASSIGN

允许我写

MACROADD(1,$var_bar,"BAR",MACROADD(2,$var_foo,"FOO",MACROADD(3,$var_sna,"SNA","SHOW")))

扩展到我想要的。但它真的很难看,并且当线路​​的长度达到较大值时可能会中断(理想情况下我希望能够在c的原因下添加尽可能多的变量。有没有我失踪的伎俩?

1 个答案:

答案 0 :(得分:0)

我通过使我的周围功能具有幂等性来解决它(我不在乎我是否#34;在显示之前分配"在#34之后添加"在显示之后添加"以及访问全局)计数器。基本上,这个

ADD 1 "SNA"
$var_sna ASSIGN 1
ADD 2 "FOO"
$var_foo ASSIGN 2
ADD 3 "BAR"
$var_bar ASSIGN 3

SHOW

ADD 1 "SNA"    
$var_sna ASSIGN 1
ADD 2 "FOO"
$var_foo ASSIGN 2
ADD 3 "BAR"
$var_bar ASSIGN 3

也可以。为了生成索引,我可以访问一个全局变量并在每个变量上添加1" ADD ASSIGN"

#macro ADDASSIGN($variable,$title) ADD $title\
$variable ASSIGN $glob\
$glob=$glob+1

#macro STACK($inside,$element) $glob=1\
$element\
$inside\
$glob=1
$element

然后,我将不同步骤的定义放在一个定义中,因此我可以写:

#define RUN\
ADDASSIGN($var_sna,"HELLO THIS IS SNA")\
ADDASSIGN($var_foo,"HELLO FOO SPEAKING")\
ADDASSIGN($var_bar,"Meh, I AM BAR")\

STACK(SHOW,RUN) 

并且预处理器将生成正确的源代码,原始代码仅在一个地方包含定义,非常成功。