有谁能请我完成从正则表达式获取常规语法的过程?我发现很少'教程',但我仍然无法将更复杂的正则表达式转换成语法。
你会如何解决((a+b)*(c|d))+a?
?
我虽然
A -> aB
A -> aA
B -> bA
A -> cC
A -> dC
C -> cA
C -> dA
C -> a
C -> epsilon
但这显然不正确。
答案 0 :(得分:3)
从内到外工作。每个运营商介绍 一个新的非终端
Operator Grammar Operator Grammar
-------- ------- -------- -------
R|S A->R R* A->
A->S A->AR
R? A-> R+ A->R
A->R A->AR
(大多数博览会还将引入新的非终结用于连接;在这里,我没有打扰。我希望它不会混淆。)
示例:
((a+b)*(c|d))+a?
Sub- Rewritten with Rules for
expression new nonterminal new nonterminal
---------- --------------- -----------
a+ A A->a A->Aa
a+b Ab
(a+b)* (Ab)* B-> B->BAb
c|d C C->c C->d
(a+b)*(c|d) BC
(a+b)*(c|d)+ (BC)+ D->BC D->DBC
a? E E-> E->a
(a+b)*(c|d)+ DE S->DE