0

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

-= 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. 必须支持带括号的分组

我的问题:语法(以上)是否符合准则?我有把握,但我不是 100%,希望一些经验丰富的眼睛能指出一些问题/错误。

TIA 菜鸟

4

1 回答 1

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>.

这是我快速浏览您的 EBNF 所看到的,我已经有一段时间没有自己研究这个了,所以我的一些更正可能是错误的。

于 2011-07-18T10:08:43.563 回答