Regex 正则表达式的无歧义语法
我正试图为家庭作业中的正则表达式开发一个递归解析器。我只是想问问社区,我制定的语法是否正确,或者我的思路是否正确:Regex 正则表达式的无歧义语法,regex,recursive-descent,Regex,Recursive Descent,我正试图为家庭作业中的正则表达式开发一个递归解析器。我只是想问问社区,我制定的语法是否正确,或者我的思路是否正确: -= Regex Grammar (EBNF) =- <start> -> <expr> '\n' <expr> -> <expr> { '|' <term> } // Union | <expr> { <expr> }
-= Regex Grammar (EBNF) =-
<start> -> <expr> '\n'
<expr> -> <expr> { '|' <term> } // Union
| <expr> { <expr> } // Concatenation
| <expr> '*' // Closure
| <term>
<term> -> '(' <expr> ')' | <char> // Grouping
| <char>
<char> -> a|b|c| ... |z
-=正则表达式语法(EBNF)=-
->“\n”
->{'|'}//并集
|{}//串联
|'*'//闭包
|
->“(“”)|//分组
|
->a | b | c ||Z
一些指导原则:1.优先级:按所列顺序(从高到低)闭包、连接、并集
2.关联性:闭包是右关联的;连接/并集是左关联的
3.必须支持使用参数分组 我的问题:语法(以上)是否符合准则?我觉得肯定,但我不是100%,我希望一些经验丰富的人能指出一些问题/错误 短暂性脑缺血发作 Noob
“abc”
这是不明确的,因为在第三步中,您可以展开第一个
,也可以展开后一个。您应该能够通过删除
<expr> -> <expr> { <expr> }
->{}
创造
<term> -> <term> <expr>
->
相反
你在这里重复你自己
<term> -> '(' <expr> ')' | <char> // Grouping
| <char>
->'('')//分组
|
(你有两次
,你的意思是在第一条规则中有'('''|'
)我想删除会更清楚
<term> -> '(' <expr> ')'
->'('')
创造
<expr> -> '(' <expr> ')'
->'('')
相反
然后还需要在
中的字符周围添加引号
这是我从快速查看您的EBNF中看到的,我已经有一段时间没有亲自研究过了,所以我的一些更正可能是错误的。先兆存在问题。将此语法与PEG解析器一起使用将使用错误的优先级,LL和LR解析器将抱怨歧义。要删除它们,每个操作需要一条规则(而不仅仅是一条用于
expr
)。您建议的修改将打破kleene star在连接aa*
=(a)(a)*
和aa*
!=<代码>(aa)*。
<expr> -> '(' <expr> ')'