免费注册 查看新帖 |

Chinaunix

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

[算法] 简单正则表达式的语法树生成应该使用什么算法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-19 15:45 |只看该作者 |倒序浏览
最近在学编译原理,想自己写一个简单的正则表达式引擎。

包含的运算符号有+、*、|、(、)、

其语义与普通正则表达式相同。

我现在卡在第一步,就是语法树的生成。

请问,应该如何生成一个表达式?

论坛徽章:
0
2 [报告]
发表于 2008-06-19 18:13 |只看该作者
用状态机,regex --> NFA --> DFA
编译原理的书上应该有算法

论坛徽章:
0
3 [报告]
发表于 2008-06-19 21:30 |只看该作者
原帖由 prc 于 2008-6-19 18:13 发表
用状态机,regex --> NFA --> DFA
编译原理的书上应该有算法

嗯,应该是这样.

也可以这样regex--> 语法树 --> (NFA) -->DFA
NFA完全可以跳过.

但问题是,我不知道该如何生成语法树.

或者说,不知道如何从regex-->NFA.书上介绍的Tomposon算法,我完全理解.但具体如何做呢?

论坛徽章:
0
4 [报告]
发表于 2008-06-20 10:02 |只看该作者
都理解算法了,那就设计一下存储结构,把伪代码变成c代码就可以了吧

论坛徽章:
0
5 [报告]
发表于 2008-06-20 11:47 |只看该作者
可以看一下lex,我也想做一个

论坛徽章:
0
6 [报告]
发表于 2008-06-20 12:47 |只看该作者
可能是我没讲清楚....

我理解了Tompson算法,但龙书上讲述的Tompson算法只是说如何从语法分析树中得到NFA,却没有说明如何构造该分析树.

所以我的问题就是如何从正则表达式转换到分析树.

我尝试过使用自顶向下的超前预则法进行语法树的生成.

但由于正则表达式的文法具有左递归.而改写文法,使其不再具有左递归的时候,却无法生成语法树.

不知道有什么解决的方法呢?

论坛徽章:
0
7 [报告]
发表于 2008-06-20 13:53 |只看该作者
可不可以先消除左递归,再使用自顶向下的超前预则法进行语法树的生成

论坛徽章:
0
8 [报告]
发表于 2008-06-20 15:07 |只看该作者
原帖由 tyz 于 2008-6-20 13:53 发表
可不可以先消除左递归,再使用自顶向下的超前预则法进行语法树的生成


左递归应该可以消除,但文法改写后,语法树的生成比较困难。

论坛徽章:
0
9 [报告]
发表于 2008-06-20 19:31 |只看该作者
好像NFA不能做语法分析吧,DFA可以
NFA可以转化成等价的DFA呀

论坛徽章:
0
10 [报告]
发表于 2008-06-20 20:02 |只看该作者
转成NFA一般认为是比较简单的步骤,直接翻译你要的语法就行。比如假设字符集只有一个字符 a ,简单NFA就是(e是正则表达式,E是非空正则表达式,epsilon是空串):
e -- epsilon
e -- E
E -- ae
e -- (E)
e -- E+
e -- E*
e -- E|E
把这个NFA转成DFA以后直接coding就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP