我正在尝试编写正则表达式引擎。我想手工写一个递归下降解析器。没有正则表达式语言(不是正则表达式可以描述的语言)的左递归的无上下文语法会是什么样的?是否最容易重新分解语法糖,即将a+
更改为aa*
?提前谢谢!
答案 0 :(得分:7)
左递归:
Expression = Expression '|' Sequence
| Sequence
;
Sequence = Sequence Repetition
| <empty>
;
正确的递归:
Expression = Sequence '|' Expression
| Sequence
;
Sequence = Repetition Sequence
| <empty>
;
不明确的形式:
Expression = Expression '|' Expression
| Sequence
;
Sequence = Sequence Sequence
| Repetition
| <empty>
;
答案 1 :(得分:2)
您可以查看source code for Plan 9 grep。文件grep.y有一个yacc(如果我没记错的话,LALR(1))正则表达式的语法。您可能可以从yacc语法开始,并重写它以进行递归下降解析。
答案 2 :(得分:0)
关于Left Recursion的维基百科文章提供了关于如何解决此问题的非常好的信息。