构建基于正则表达式的解析器是愚蠢的吗?
答案 0 :(得分:14)
使用现代模式匹配嵌套的parens非常简单。不计算空白,这类事情:
\( (?: [^()] *+ | (?0) )* \)
适用于主流语言,如Perl和PHP,以及任何使用PCRE的东西。
然而,你真的需要语法正则表达式来完整解析,否则你会疯了。不要使用其正则表达式不支持将正则表达式分解为较小单元的语言,或者不支持正确调试其编译和执行的语言。生活对于低级别的hackery来说太短暂了。如果你打算这样做,也可以回到汇编语言。
我写了很多关于递归模式,语法模式和解析的内容:例如,请参阅here for parsing approaches和here for lexer approaches;另外,final solution here。
此外,Perl的Regexp::Grammars
module在将语法正则表达式转换为解析结构时特别有用。
所以,无论如何,去吧。你会从中学到很多东西。
答案 1 :(得分:8)
上班?是。为了学习?否。
答案 2 :(得分:1)
使用正则表达式解析自己的小语言的诱惑力不容小觑:大多数系统管理员可以非常快速地在Perl中编写一个简单的语言解析器,但使用lex / yacc解析相同的语言将花费大多数程序员几个小时。 / p>
Perl版本可能只是做这项工作。但是正如gpvos指出的那样,使用正则表达式后端进行解析会大大减少未来的增强选项,有时尝试解决这些限制会导致一些非常糟糕的代码,当使用表驱动工具或手工处理这些常规增强功能时很容易书面递归下降解析器。
如果您知道语言总是可以使用正则表达式轻松解析,那么您可以通过花一个小时来完成工作来做正确的事情,而不是四到五次重新学习lex和yacc足以写类似的解析器,具有更强大的工具。但是如果语言容易增长或变化很大,那么从长远来看,使用真正的解析器生成器可能会有所帮助。
答案 3 :(得分:1)
这取决于您要解析的内容,但对于大多数实际案例而言,IMO的答案是“否”。正则表达式在他们可以识别的语法上非常有限(正则表达式实现设置的限制,因为每个人都有自己的香料)
正如您在评论中所述,您正在为VBScript构建解析器,因为您需要识别Context Free Grammar,因此请忘记正则表达式。检查GOLD Parser或ANTLR。
答案 4 :(得分:0)
通常,正则表达式用于词法分析器(识别标记),并且诸如递归下降解析器之类的更强大的东西用于识别标记序列,即实际解析。
对于非常简单的语言,正则表达式就足够了,但你会非常限制自己。例如,您无法使用正则表达式解析(1 + 2) * 3 - 4
之类的表达式。
答案 5 :(得分:0)
查看GoldParser。它允许使用正则表达式来查找令牌。