|
|
道语言宏系统傅利民(phoolimin 2009-03-22 道语言支持比较好的宏系统,它可以被用来定义新的语法。 道语言的宏比较象BNF形式的语法表示。 道宏里,由一组语法标记来定义需要应用宏的语法模式, 并由另一组语法标记需要转换到的道语言基本语法模式。 当道解释器编译道代码时,它将用宏的语法模式去匹配代码, 并将匹配的代码转换成目标遵循道语言基本语法的代码。
syntax{
源语法模式 }as{ 目标语法模式 } 下面的控制符号可用来标记语法模式:
下面的特殊前缀可用来定义语法模式里的语法变量:
普通道语言运算符也可被用到语法模式里。 当括号被用语法模式里时,它们应该被合理配对。 要使用不配对的括号,把它们放到单引号里,如'(', '[', '{'等。 对于在源和目标语法模式里的同名语法变量, 它们最好是出现在具有类似结构的分组和重复模式里。 这样语法变换将有确定的行为。 当源语法模式被匹配到某段代码时,相应于语法变量的代码将被提取出来, 然后,目标语法模式被扫描,被提取出来的代码将在对应的语法变量处展开。 展开的结果将被用来替换被源模式匹配的代码部分。 道语言的早期版本曾支持过do-end, else-end, routine-end和class-end等形式 的语法结构。但从2007年的一次发布起不再对它们作核心支持, 不过,还是可以使用下面的宏作支持:
# Syntax transformation macros
syntax{ # if do elif else end if $EXP_1 do \[ $BL_1 \] \{ elif $EXP_2 do \[ $BL_2 \] \} \[ else \[ $BL_3 \] \] end }as{ # if(){}elif(){}else{} if( 1 ){ if( $EXP_1 ){ \[ $BL_1 \] } \{ elif( $EXP_2 ){ \[ $BL_2 \] } \} \[ else{ \[ $BL_3 \] } \] } } syntax{ if $EXP break }as{ if( $EXP ){ break } } syntax{ if $EXP skip }as{ if( $EXP ){ skip } } syntax{ if $EXP_1 $ID \{ $EXP_2 \} ; }as{ if( $EXP_1 ){ $ID \{ $EXP_2 \} } } syntax{ # while do end while $EXP do \[ $BL \] end }as{ # while(){} while( $EXP ){ \[ $BL \] } } syntax{ # for in do end for $EXP_1 in $EXP_2 \{ ; $EXP_3 in $EXP_4 \} do \[ $BL_1 \] end }as{ # for( in ){} for( $EXP_1 in $EXP_2 \{ ; $EXP_3 in $EXP_4 \} ){ \[ $BL_1 \] } } syntax{ # for ; ; do end for \[ $EXP_1 \]; \[ $EXP_2 \]; \[ $EXP_3 \] do \[ $BL_1 \] end }as{ # for( ; ; ){} for( \[ $EXP_1 \]; \[ $EXP_2 \]; \[ $EXP_3 \] ){ \[ $BL_1 \] } } syntax{ # switch do end switch $EXP do \[ $BL \] end }as{ # switch(){} switch( $EXP ){ \[ $BL \] } } # routine definition syntax{ routine $ID1 \{ :: $ID2 \} ( \[ $BL1 \] ) \( ; \) \! \( { $BL2 } \) \! \[ $BL3 \] end }as{ routine $ID1 \{ :: $ID2 \} ( \[ $BL1 \] ){ \[ $BL3 \] } } # class definition syntax{ class $ID1 \{ :: $ID2 \} \[ ( \[ $BL1 \] ) \] \[ : $ID3 \{ :: $ID4 \} \[ ( \[ $BL2 \] ) \] \{ , $ID5 \{ :: $ID6 \} \[ ( \[ $BL3 \] ) \] \} \] \( { $BL5 } \) \! \[ $BL4 \] end }as{ class $ID1 \{ :: $ID2 \} \[ ( \[ $BL1 \] ) \] \[ : $ID3 \{ :: $ID4 \} \[ ( \[ $BL2 \] ) \] \{ , $ID5 \{ :: $ID6 \} \[ ( \[ $BL3 \] ) \] \} \] { \[ $BL4 \] } } syntax{ # try rescue do rescue end try \[ $BL_1 \] \{ rescue $BL_2 do \[ $BL_3 \] \} \[ rescue \[ $BL_4 \] \] end }as{ # try{} rescue(){} rescue{} if( 1 ){ try{ \[ $BL_1 \] } \{ rescue( $BL_2 ){ \[ $BL_3 \] } \} \[ rescue{ \[ $BL_4 \] } \] } } syntax{ if $EXP retry }as{ if( $EXP ){ retry } }
view count 412 times
created at 2009-02-20, 15:39 GMT modified at 2009-03-22, 17:01 GMT |
fu: Fixed and updated There was a minor bug in storing returned value in the DaoVmProcess structure. Now it is fixed and up ... (Sep.07,23:43) klabim: ... Ok, I found it. It can be so easy by reading the documentation :- ). I have overseen the keyword glob ... (Aug.21,18:09) klabim: returning a string from function to c++ code! Hi, I run in some trouble while calling a dao function from the c++ code. The dao function should re ... (Sep.07,19:44) klabim: sharing vars between scripts Hi, how can I share a variable between 2 scripts in an embedded environment? For example: script 1: ... (Aug.21,17:55) |