- 论坛徽章:
- 0
|
本帖最后由 yyx_attach 于 2011-09-15 11:46 编辑
相关定义部分:- $lc=qr/\{/;
- $rc=qr/\}/;
- $ls=qr/\[/;
- $rs=qr/\]/;
- $noc=qr/[^$lc$rc]/;
- $lcrc=qr/$lc|$rc/;
- $eq=qr/\=\=/;
- $ne=qr/\!\=/;
- $lt=qr/\</;
- $gt=qr/\>/;
- $le=qr/\<\=/;
- $ge=qr/\>\=/;
- $eval=qr/$eq|$ne|$lt|$gt|$le|$ge/;
- $mod = qr/\=|\+\+|\-\-|\+\=|\-\=|\/\=|\%\=|\*\=|\&=|\|\=|\^\=/;
- $op = qr/\+|\-|\*|\%|\/|\^|\&[^\&]|\|[^\|]/;
- $and=qr/&&/;
- $or=qr/\|\|/;
- $andor=qr/$and|$or/;
- $lb=qr/\(/;
- $rb=qr/\)/;
- $lcom=qr/\/\*/;
- $rcom=qr/\*\//;
- $pointer=qr/\.|\-\>/;
- $array=qr/$ls\ *[\w\_\s\+\-\>\*\%\^\&\|\\]*\ *$rs/;
- $noquotes=qr/^[\'|\"]*/;
- $pack=qr/\_\_PACK[0-9]+\_\_/;
- $vartypA=qr/\ *(extern)?\ *(const)?\ *(unsigned\s+|signed\s+)?(void|int|char|long|short|float|u_char|struct(\ [\w]+)?|[\w]*?)\ *\**?\ */;
- $vartypB=qr/\ *$lb\ *$vartypA\ *$rb/;
- $vartype=qr/$vartypA|$vartypB/;
- $typecast=qr/\**\ *$lb\ *\**\ *(unsigned\s|signed\s)?[\w\_]+\ *\**\ *$rb/;
- $lva=qr/[\w\_]+$array?/;
- #$lval=qr/\**\ *$typecast?\ *(\&|\-|\~|\!|\*)?\ *((\s*$lva(?:$pointer$lva)*\s*)|($lb\s*$lva(?:$pointer$lva)*\s*$rb))/;
- #MAY 20 2011 : (&){1}
- $lval1=qr/\ *$typecast?\ *((\ *(((&){1})|\-|\~|\!)?\**\ *$lva\**(?:$pointer$lva)*\s*)|($lb\ *(((&){1})|\-|\~|\!)?\**\ *$lva(?:\**|$pointer$lva)*\ *$rb))\ */;
- $lval=qr/\**(((&){1})|\-|\~|\!)?(\**$lval1|$lb\**$lval1$rb(?:$pointer$lva)*)\ */;
- $lval2=qr/\**($lb\**$pack+$rb)(?:$pointer$pack)*/;
- #$funcdef=qr/(?<vartype>$vartype)+\ +\**(?<funcname>[^\(]+?)\ *$lb\ *(?<params>(\s*$lval\s*\,?\s*)*)\ *$rb/;
- $funcdef=qr/(?<vartype>$vartype)+\ +\**(?<funcname>[\w]+?)\ *$lb\ *(?<params>(\s*$vartype?($lval|($lb(\s*[\w]+\s*\**,?)+$rb))\s*\,?\s*)*)\ *$rb/;
- $funcdec=qr/(?<vartype>$vartype)+\ +((\ *$lval\ *)|($lb\ *$lval\ *$rb))\ *$lb\ *(?<params>(\s*$vartype?\s*[\w\_\*]\s*\,?\s*)*)\ *$rb\s*;/;
- $funccall=qr/(?<funcdectype>\s*$vartype\s*)??((?<vartype>$vartype)?\s*(?<ret>$lval)\s*\=\s*(?<before>.*?))?(?<funcname>[\w\_]+)+?\ *$lb(?<params>(\ *$lval\ *(,|$op)?\ *)*)$rb\s*((?<after>.*?);)?/;
- $noBracFuncCall=qr/(?<funcname>return|exit)\s*(?<params>$rval)/;
- $innerfunccall=qr/[\w\_]+\ *$lb(?:\ *$lval\ *,?\ *)*$rb/;
- $funccalllite=qr/\ *$vartype?\ *$lval?\ *\=?\ *[\w\_]+\ *$lb(?:\ *(?:$lval|$innerfunccall)\ *,?\ *)*$rb\ *;\ */;
- $printf=qr/^(MCM_)?[^s]*printf/;
- $rval=qr/\-?$lval|$funccall/;
- $lvalop=qr/$lval(\ *($op){1}\ *$rval)+/;
- #$expr=qr/$lval\ *$eval\ *$rval/;
- $expr=qr/[\w\_]+\ *$eval\ *[\w\_]+/;
- $set=qr/(?<vartype>$vartype?)(?<set>(?<lval>$lval)\ *(?<eval>$mod)\ *(?<rval>$rval)?)\ *(?<rest>\ *(?<op>$op)\ *(?<rval>$rval))*\ *;/;
- $set2=qr/(?<vartype>$vartype)(?<set>(?<lval>$lval)\ *\=\ *(?<rval>$lc(\ *$lval,?\ *)*$rc))\ *;/;
复制代码 如果$_="int a=0;"当执行下列语句时,可以正确进行下去。- if (!/$set|$set2/){print "parseSet1: no rval!! returning..\n"; return;} #skip exprs with no rval
复制代码 但,当$_=“int a;"时,执行上述语句时,直接return出去了。如果我想当当$_=“int a;"时,不return出去,继续执行下面的语句应该怎么改啊?
请各位大哥指导? |
|