Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式的无歧义语法_Regex_Recursive Descent - Fatal编程技术网

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> ')'