|
|
道语言宏系统傅利民(phoolimin 道语言支持比较好的宏系统,它可以被用来定义新的语法。 道语言的宏比较象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 739 times
created at 2009-02-20, 15:39 GMT modified at 2009-03-22, 17:01 GMT |
fu: ... I forgot to say something about the plan for the whole new year in my previous reply. Well, besides w ... (Jan.19,01:40) fu: ... Happy new dragon year (which will start from this sunday)! Actually, it was a busy month (I wish th ... (Jan.18,22:46) ybabel: What's the plan for the new year ? Hello 'vry budy :- ) happy new year (when is the new year for you Fu ?) I saw you come back and comm ... (Jan.18,18:59) |