是否可以使用
https://en.wikipedia.org/wiki/Operator-precedence_parser
如果没有,这里使用的解析器是什么
https://en.wikipedia.org/wiki/Thompson的构造#算法的应用
你诚挚的
是否可以使用
https://en.wikipedia.org/wiki/Operator-precedence_parser
如果没有,这里使用的解析器是什么
https://en.wikipedia.org/wiki/Thompson的构造#算法的应用
你诚挚的
2条答案
按热度按时间brtdzjyr1#
我不认为正则表达式有Operator Precedence Grammar,如果是这种情况,那么您就不能使用Operator Precedence解析器。
下面是我从a Perl-style one简化而来的正则表达式语法:
注意,
<concatenation>
的右边有两个相邻的非终结符,这意味着这不是一个Operator Precedence语法。我认为解析正则表达式的首选方法可能是Recursive Descent parser。
ztyzrc3y2#
正则表达式确实可以用运算符优先级解析器来解析,所提供的C代码基本上使用了pratt解析器(操作符优先)方法。程序打印NFA(非确定性有限自动机)由一系列状态转换表示。输入是一个正则表达式,通常带有 *?()+.[]运算符。pratt解析器函数 parse() 首先为正则表达式创建一个表达式树,它处理两个连续的字符(或括号中的组),就好像它们之间有一个不可见的二元CONCAT操作符。之后,函数 print_nfa() 从右到左遍历表达式树,并动态打印NFA状态转换。
该方法结合了两种算法:Vaughan Pratt的自顶向下运算符优先级解析方案(如Nystrom的书“Crafting Interpreters”第17章中所述)和Thompson NFA算法(如鼓舞人心的文章“Regular Expression Matching Can Be Simple And Fast”中所述)(https://swtch.com/~rsc/regexp/regexp1.html)。由于我没有在一个程序中找到这两种方法的组合,我决定分享我想出来的,即使最初的问题是5年前的。