网上看到有一些例子是用正则表达式做词法分析的,每次就遍历所有 regex 串,看有没有匹配的,直到整个字符串匹配完
这种做法复杂度是不是比较大,如果是自己写一个 DFA,再进行状态转移,是不是效率会更高些,相当于每次从初始状态都能直接走确定的边,不需要每次遍历所有去尝试
暂时不考虑 flex/bison antlr 这些工具
1
ch2 2021-06-11 17:13:57 +08:00
词法分析用正则表达式足够了
作为词法分析工具的时候,单个正则表达式模式串本身就很简单,毕竟不是让你去匹配什么复杂的 token 而且用到的正则表达式数量也不会太多,这种情况下额外的开销是可以接受的 而且代码可以写的很简单,跟 DFA 相比:可读性、可拓展性、通用性几乎每个方面都完胜,牺牲一点性能就能换来非常大的好处,这就是通用的词法分析工具用正则表达式的原因 |
2
ch2 2021-06-11 17:22:03 +08:00
比如说这个例子:
regexs=[ '\{|\}|\[|\]|\(|\)|,|;|\.|\?|\:'#界符 ,'\+|-|\*|%|/|>|<|==|!=|='#操作符 ,'[a-zA-Z_][a-zA-Z_0-9]*'#标识符 ,'\".+?\"'#字符串 ,'\'.{1}\''#字符 ,'\d+'#整数 ,'-?\d+\.\d+?'#浮点数 ] 其中界符、操作符、字符匹配起来用时都是极小的常数,几个 cpu 周期就能判断出来。而不定长度的只有标识符、字符串、整数、浮点数 而且通常情况下,代码都是一行一行进行匹配分析的,这意味着源字符串跟模式串一样,也是非常小的数。这使得一行代码的词法分析匹配结果即使用暴力匹配,所有的情况都找一遍出来,也并不比用 DFA 慢多少 |