请教一下关于使用正则表达式做词法分析

2021-06-11 14:17:57 +08:00
 zxCoder

网上看到有一些例子是用正则表达式做词法分析的,每次就遍历所有 regex 串,看有没有匹配的,直到整个字符串匹配完

这种做法复杂度是不是比较大,如果是自己写一个 DFA,再进行状态转移,是不是效率会更高些,相当于每次从初始状态都能直接走确定的边,不需要每次遍历所有去尝试

暂时不考虑 flex/bison antlr 这些工具

511 次点击
所在节点    问与答
3 条回复
ch2
2021-06-11 17:13:57 +08:00
词法分析用正则表达式足够了
作为词法分析工具的时候,单个正则表达式模式串本身就很简单,毕竟不是让你去匹配什么复杂的 token
而且用到的正则表达式数量也不会太多,这种情况下额外的开销是可以接受的
而且代码可以写的很简单,跟 DFA 相比:可读性、可拓展性、通用性几乎每个方面都完胜,牺牲一点性能就能换来非常大的好处,这就是通用的词法分析工具用正则表达式的原因
ch2
2021-06-11 17:22:03 +08:00
比如说这个例子:
regexs=[
'\{|\}|\[|\]|\(|\)|,|;|\.|\?|\:'#界符
,'\+|-|\*|%|/|>|<|==|!=|='#操作符
,'[a-zA-Z_][a-zA-Z_0-9]*'#标识符
,'\".+?\"'#字符串
,'\'.{1}\''#字符
,'\d+'#整数
,'-?\d+\.\d+?'#浮点数
]
其中界符、操作符、字符匹配起来用时都是极小的常数,几个 cpu 周期就能判断出来。而不定长度的只有标识符、字符串、整数、浮点数
而且通常情况下,代码都是一行一行进行匹配分析的,这意味着源字符串跟模式串一样,也是非常小的数。这使得一行代码的词法分析匹配结果即使用暴力匹配,所有的情况都找一遍出来,也并不比用 DFA 慢多少
zxCoder
2021-06-11 18:51:15 +08:00
@ch2 懂了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782896

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX