我是python的新手,我正在尝试使用正则表达式和EBNF。我不确定我的转换是否准确。我只需要再看看我的转换。
EBNF REGEX
a{a} (convereted from regex) a+
a{{ab} ya} (convereted from regex) a((xa)*ya)
e{e}{bb|p[p] [p]d}c e+(bb|(p)*d)?c
答案 0 :(得分:1)
虽然EBNF的功能很简单,但实际符号可以以几种不同的形式出现。我将使用ISO/IEC 14977 : 1996(E)的术语和符号(如果您使用Google,则可以PDF格式提供)。
正则表达式a+
是终结符号(第5.2节),后跟重复序列(第5.6节)。 EBNF表格将是:
"a", {"a"}
正则表达式a((xa)*ya)
有点复杂。如果您首先只查看a(ya)
,则会有一个终结符串,后跟一个Grouped-sequence(第5.4节)。它看起来像这样:
"a", ("y", "a")
子表达式(xa)*
本身是一个包含两个终端字符串序列的重复序列。它本身就是这样的:
{"x", "a"}
您可以组合前两个项目以获取完整表达式的EBNF表单:
"a", ({"x", "a"}, "y", "a")
最后的表达式引入了另外两个概念,特别是Definitions-list(第5.10节)和Optional-sequence(第5.5节)。子表达式(bb|(p)*d)
包含一个定义列表。仅此子表达式的EBNF如下:
("b", "b" | {"p"}, "d")
如果包含可选的量词,将其扩展为子表达式(bb|(p)*d)?
,则将EBNF更新为以下内容:
[("b", "b" | {"p"}, "d")]
由于Optional-sequence也可用作分组构造,因此您可以删除不必要的start-group-symbol和end-group-symbol以获取以下内容:
["b", "b" | {"p"}, "d"]
通过组合上面使用的步骤,您可以获得完整的第三个正则表达式的EBNF表单:
"e", {"e"}, ["b", "b" | {"p"}, "d"], "c"