Regex-EBNF转换问题python

时间:2015-01-21 02:21:11

标签: regex python-3.x expression ebnf

我是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       

1 个答案:

答案 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"