V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

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

  •  
  •   zxCoder · 2021-06-11 14:17:57 +08:00 · 508 次点击
    这是一个创建于 1087 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    ch2
        1
    ch2  
       2021-06-11 17:13:57 +08:00
    词法分析用正则表达式足够了
    作为词法分析工具的时候,单个正则表达式模式串本身就很简单,毕竟不是让你去匹配什么复杂的 token
    而且用到的正则表达式数量也不会太多,这种情况下额外的开销是可以接受的
    而且代码可以写的很简单,跟 DFA 相比:可读性、可拓展性、通用性几乎每个方面都完胜,牺牲一点性能就能换来非常大的好处,这就是通用的词法分析工具用正则表达式的原因
    ch2
        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 慢多少
    zxCoder
        3
    zxCoder  
    OP
       2021-06-11 18:51:15 +08:00
    @ch2 懂了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   866 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:20 · PVG 04:20 · LAX 13:20 · JFK 16:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.