正则表达式的明确语法

时间:2011-07-18 09:34:36

标签: regex recursive-descent

我正在尝试为家庭作业的正则表达式开发一个递归的正确解析器。我只是想问一下社区我所开发的语法是否正确,或者我是否走在正确的轨道上:

-= 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 小白

1 个答案:

答案 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时看到的,自从我自己研究这个以来已经有一段时间了,所以我的一些修改可能是错误的。