免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2119 | 回复: 5
打印 上一主题 下一主题

关于perl表达式的问题,请知道。有点难度哦! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-15 11:34 |只看该作者 |倒序浏览
本帖最后由 yyx_attach 于 2011-09-15 11:46 编辑

相关定义部分:
  1. $lc=qr/\{/;
  2. $rc=qr/\}/;
  3. $ls=qr/\[/;
  4. $rs=qr/\]/;
  5. $noc=qr/[^$lc$rc]/;
  6. $lcrc=qr/$lc|$rc/;

  7. $eq=qr/\=\=/;
  8. $ne=qr/\!\=/;
  9. $lt=qr/\</;
  10. $gt=qr/\>/;
  11. $le=qr/\<\=/;
  12. $ge=qr/\>\=/;
  13. $eval=qr/$eq|$ne|$lt|$gt|$le|$ge/;
  14. $mod = qr/\=|\+\+|\-\-|\+\=|\-\=|\/\=|\%\=|\*\=|\&=|\|\=|\^\=/;
  15. $op = qr/\+|\-|\*|\%|\/|\^|\&[^\&]|\|[^\|]/;


  16. $and=qr/&&/;
  17. $or=qr/\|\|/;
  18. $andor=qr/$and|$or/;
  19. $lb=qr/\(/;
  20. $rb=qr/\)/;

  21. $lcom=qr/\/\*/;
  22. $rcom=qr/\*\//;
  23. $pointer=qr/\.|\-\>/;
  24. $array=qr/$ls\ *[\w\_\s\+\-\>\*\%\^\&\|\\]*\ *$rs/;

  25. $noquotes=qr/^[\'|\"]*/;

  26. $pack=qr/\_\_PACK[0-9]+\_\_/;
  27. $vartypA=qr/\ *(extern)?\ *(const)?\ *(unsigned\s+|signed\s+)?(void|int|char|long|short|float|u_char|struct(\ [\w]+)?|[\w]*?)\ *\**?\ */;
  28. $vartypB=qr/\ *$lb\ *$vartypA\ *$rb/;
  29. $vartype=qr/$vartypA|$vartypB/;
  30. $typecast=qr/\**\ *$lb\ *\**\ *(unsigned\s|signed\s)?[\w\_]+\ *\**\ *$rb/;
  31. $lva=qr/[\w\_]+$array?/;
  32. #$lval=qr/\**\ *$typecast?\ *(\&|\-|\~|\!|\*)?\ *((\s*$lva(?:$pointer$lva)*\s*)|($lb\s*$lva(?:$pointer$lva)*\s*$rb))/;

  33. #MAY 20 2011 : (&){1}
  34. $lval1=qr/\ *$typecast?\ *((\ *(((&){1})|\-|\~|\!)?\**\ *$lva\**(?:$pointer$lva)*\s*)|($lb\ *(((&){1})|\-|\~|\!)?\**\ *$lva(?:\**|$pointer$lva)*\ *$rb))\ */;
  35. $lval=qr/\**(((&){1})|\-|\~|\!)?(\**$lval1|$lb\**$lval1$rb(?:$pointer$lva)*)\ */;
  36. $lval2=qr/\**($lb\**$pack+$rb)(?:$pointer$pack)*/;


  37. #$funcdef=qr/(?<vartype>$vartype)+\ +\**(?<funcname>[^\(]+?)\ *$lb\ *(?<params>(\s*$lval\s*\,?\s*)*)\ *$rb/;
  38. $funcdef=qr/(?<vartype>$vartype)+\ +\**(?<funcname>[\w]+?)\ *$lb\ *(?<params>(\s*$vartype?($lval|($lb(\s*[\w]+\s*\**,?)+$rb))\s*\,?\s*)*)\ *$rb/;
  39. $funcdec=qr/(?<vartype>$vartype)+\ +((\ *$lval\ *)|($lb\ *$lval\ *$rb))\ *$lb\ *(?<params>(\s*$vartype?\s*[\w\_\*]\s*\,?\s*)*)\ *$rb\s*;/;

  40. $funccall=qr/(?<funcdectype>\s*$vartype\s*)??((?<vartype>$vartype)?\s*(?<ret>$lval)\s*\=\s*(?<before>.*?))?(?<funcname>[\w\_]+)+?\ *$lb(?<params>(\ *$lval\ *(,|$op)?\ *)*)$rb\s*((?<after>.*?);)?/;
  41. $noBracFuncCall=qr/(?<funcname>return|exit)\s*(?<params>$rval)/;
  42. $innerfunccall=qr/[\w\_]+\ *$lb(?:\ *$lval\ *,?\ *)*$rb/;
  43. $funccalllite=qr/\ *$vartype?\ *$lval?\ *\=?\ *[\w\_]+\ *$lb(?:\ *(?:$lval|$innerfunccall)\ *,?\ *)*$rb\ *;\ */;
  44. $printf=qr/^(MCM_)?[^s]*printf/;

  45. $rval=qr/\-?$lval|$funccall/;
  46. $lvalop=qr/$lval(\ *($op){1}\ *$rval)+/;
  47. #$expr=qr/$lval\ *$eval\ *$rval/;
  48. $expr=qr/[\w\_]+\ *$eval\ *[\w\_]+/;

  49. $set=qr/(?<vartype>$vartype?)(?<set>(?<lval>$lval)\ *(?<eval>$mod)\ *(?<rval>$rval)?)\ *(?<rest>\ *(?<op>$op)\ *(?<rval>$rval))*\ *;/;
  50. $set2=qr/(?<vartype>$vartype)(?<set>(?<lval>$lval)\ *\=\ *(?<rval>$lc(\ *$lval,?\ *)*$rc))\ *;/;
复制代码
如果$_="int a=0;"当执行下列语句时,可以正确进行下去。
  1. if (!/$set|$set2/){print "parseSet1: no rval!! returning..\n"; return;} #skip exprs with no rval
复制代码
但,当$_=“int a;"时,执行上述语句时,直接return出去了。如果我想当当$_=“int a;"时,不return出去,继续执行下面的语句应该怎么改啊?
       请各位大哥指导?

论坛徽章:
0
2 [报告]
发表于 2011-09-15 11:48 |只看该作者
{:3_198:}好复杂!

论坛徽章:
0
3 [报告]
发表于 2011-09-15 11:52 |只看该作者
回复 1# yyx_attach


做 Lexer ??

if (!/$set|$set2/){
   print "parseSet1: no rval!! returning..\n";
   ###   return;
   &do_something_else();
} else

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2011-09-15 12:13 |只看该作者
好乱啊,写 parser 就用 Regexp::Grammars

论坛徽章:
0
5 [报告]
发表于 2011-09-15 12:17 |只看该作者
回复 3# Kitaisky

是做语法分析, &do_something_else();的形式我觉得不是很好,因为我只想排除int a;uhcar a;也就是定义完没有赋值的这种情况,
else可能很多种情况都包含进去了。是这样吗?

论坛徽章:
0
6 [报告]
发表于 2011-09-15 14:31 |只看该作者
在多提供一些代码,这些代码说明不了什么。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP