免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yuanquan08
打印 上一主题 下一主题

各位大虾,小弟有难啊! [复制链接]

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
21 [报告]
发表于 2013-12-24 03:37 |只看该作者
回复 18# Monox
  1. 先进行词法分析,把输入分解成一串标识符如 A, B, C and so on,三种二元操作符 interact, inside, or以及一种一元操作符 not,再就是左右括号的一个token流,然后对token流进行语法分析,构建语法树,最后将语法树进行解析就可以得到结果。
复制代码


感兴趣~
大牛,是不是能否提供一份 perl 代码呢?3Q~
   

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
22 [报告]
发表于 2013-12-24 09:49 |只看该作者
回复 21# rubyish


    我不是什么大牛,我到是对其他人按我这个思路用Perl来写很感兴趣,自己如果写的话真的想用C或者Haskell,不过有人说感兴趣我还是蛮高兴的,所以我决定有时间的时候(上班时间肯定是没空的,下班以后不太懒的时候就是有时间的时候)写三种实现,先是Haskell的实现,用parsec库来做,接着是用C结合Flex和Yacc来做,再是用纯C来做,最后再用纯Perl (5)来做,所以不知道到什么时候才能贴出最后的代码(当然我写完一个就会贴一个),不过要是其他人先贴出了上述三种方案中的某种代码,我就会略过那种方案,相应的会用其他方案进行补充,比如Perl 6的grammar实现,用ruby 实现等等等等。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
23 [报告]
发表于 2013-12-24 10:36 |只看该作者
Monox 发表于 2013-12-23 23:52
我真要按这种方式写代码的话也肯定不用Perl写,要么用C(用C的话多半我也不打算手写DFA,肯定会用Flex和YACC)

就楼主提供的表达式来说,用 Perl 编码来解析也是十分方便的。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
24 [报告]
发表于 2013-12-24 11:22 |只看该作者
回复 23# MMMIX

这个我知道,特别是使用Perl的扩展正则的递归结构匹配很容易实现,事实上上面已经有人贴出正则这种方案的代码了。只不过个人认为这种方案扩展性不好,调试起来麻烦,更关键的是我对用编译原理那一套来解决这个问题更感兴趣,所以提了一下这个方案看有没有人写。不过,编译原理那一套用哪种(通用)语言都是可以做的,但是相比Perl语言我现在更喜欢Haskell和C(对于C,准确来说是因为我现在的工作语言是C,而且我最近的业余个人小项目就是用C,Flex,YACC实现一个小的编译器),所以说对我来说Perl语言是最后选择,不过我对其他人提供用Perl进行词法分析和语法分析的脚本还是蛮感兴趣的。
   

论坛徽章:
0
25 [报告]
发表于 2013-12-24 11:33 |只看该作者
rubyish 发表于 2013-12-24 02:56
for not
biru:


map函数好强大的样子,学习中。。。

论坛徽章:
0
26 [报告]
发表于 2013-12-24 11:42 |只看该作者
本帖最后由 felonwan 于 2013-12-24 12:03 编辑
Monox 发表于 2013-12-24 11:22
回复 23# MMMIX

这个我知道,特别是使用Perl的扩展正则的递归结构匹配很容易实现,事实上上面已经有人贴 ...


这里面有个二叉树的数据结构,一层层生成二叉树来处理是通用自然的。(是叫二叉树么?不是学计算机的,不太清楚这个术语)
我的那个是用正则递归匹配最里层的括号、然后循环地消除所有当前的最里层括号。
相当于在不知道整个二叉树的情况下,直接循环匹配和处理当前二叉树某个最末端?

调试确实难,现在还有错误。

论坛徽章:
0
27 [报告]
发表于 2013-12-24 12:08 |只看该作者
起先我也 有尝试用二叉树来进行解析,可是没有成功。

论坛徽章:
0
28 [报告]
发表于 2013-12-24 12:11 |只看该作者
利用PERL的扩展的递归的方案,有出来中间状态数据,离最终我想要的结果还需要再处理才行。

论坛徽章:
0
29 [报告]
发表于 2013-12-24 13:00 |只看该作者
yuanquan08 发表于 2013-12-24 12:11
利用PERL的扩展的递归的方案,有出来中间状态数据,离最终我想要的结果还需要再处理才行。


你说的是19楼我的那个60多行的么?
中间输出是用来调试的,现在其实还有些问题,不是所有的情况都正确,调试完后这些中间输出注释掉就行了,最后输出稍微改下就可以是你想要的结果了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
30 [报告]
发表于 2013-12-24 13:28 |只看该作者
Monox 发表于 2013-12-24 11:22
回复 23# MMMIX

这个我知道,特别是使用Perl的扩展正则的递归结构匹配很容易实现,事实上上面已经有人贴 ...


我说的就是用 Perl 做词法解析然后生成语法树,最后遍历语法树给出最终的结果。楼主需要解析的表达式语法足够的简单,不论是用 Perl 还是 C 手工编码解析(而不是使用 Flex 或 YACC)都很简单,相比较而言 Perl 更方便一些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP