我正在尝试为家庭作业的正则表达式开发一个递归的正确解析器。我只是想问一下社区我所开发的语法是否正确,或者我是否走在正确的轨道上:
-= 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
一些指导方针:
1.优先顺序:按所列顺序(从最高到最低)关闭,连接,联盟
2.相关性:关闭是正确联想的;连接/联盟是左关联的
3.必须支持与parens分组
我的问题:语法(上述)是否符合指南?我感到很肯定,但我不是100%,并希望一些经验丰富的眼睛可以指出一些问题/错误。
TIA 小白
答案 0 :(得分:1)
<start>
<expr>
<expr><expr>
<expr><expr><expr>
<term><term><term>
'abc'
这是不明确的,因为在第三步中,您可以展开第一个<expr>
或后一个<expr> -> <expr> { <expr> }
。您应该能够通过删除
<term> -> <term> <expr>
并创建
<term> -> '(' <expr> ')' | <char> // Grouping
| <char>
代替。
你在这里重复一遍
<char>
(你有'(' <expr> ')' '|' <char>
两次,你的意思是在第一条规则中有<term> -> '(' <expr> ')'
吗?)我认为删除会更清楚
<expr> -> '(' <expr> ')'
并创建
<char>
代替。
然后您还需要在{{1}}中的字符周围添加引号。
这是我从快速浏览你的EBNF时看到的,自从我自己研究这个以来已经有一段时间了,所以我的一些修改可能是错误的。