- 论坛徽章:
- 0
|
支持LZ。
5月份的时候,我也用antlr来着,不过我是做cga解释器,也算是一种脚本语言吧,遇到了一些问题解决不了,最后只能自己写。正好在这里问问LZ。
CGA有一套独特的语法规则,但是和L-system很像,我只用到了一种形式的。
形式大概是这样的:
n:predecessor:condition~successor:prob..~successor:prob
下面是几个具体的语句:
1 : footprint : 20>scope.area>10 ~ S( Y, random(0,20) ) low : 0.3 ~S( Y, random(20,40) ) high : 0.7
表示:当footprint元素的scope面积在10~20之间时,对footprint进行操作,有30%的可能将footprint沿Y轴拉伸0~20中的一个随机值并产生一个叫做low元素,有70%的可能将footprint沿Y轴拉伸20~40中的一个随机值并产生一个叫做high元素。S是CGA的一个操作,scope.area和random都是python函数,不仅仅有random,还可以是其它任何自定义的python函数
3 : facade : scope.size.x>5 ~ Subdiv(X, 1, 1r, 1r, 1){ T(Z,0.5) S( ZD, focc('occlusion', scope.shape.f , S(0.5,1.0) ) ) stone | wall | Repeat( YS, 3 ) {window} | stone2 }
表示:当facade的scope.size.x>5时,对facade元素执行操作,沿X轴分成4份,对第1份执行T和S操作并产生一个叫stone的元素,第2份产生一个叫wall的元素,第3份继续操作,沿Y分成三份,每一份都产生一个叫window的元素,第四份产生一个叫stone2的元素。focc和S(0.5,1.0)都是python函数。
我用antlr制作的解释器问题就出在这里了,它无法区分CGA的S操作和python的S函数。其实这个人很好区分,一看是在CGA操作的参数中出现的,那一定是python函数;可是就是不知道这个规则在antlr中该怎么写。 |
|