这是将EBNF转换为BNF的有效方法吗?

问题描述

我有一个描述语言的EBNF语法。我想知道是否存在等效的LL(1)BNF语法,以便我可以为没有“ steamrollering over ambiguities”的语言构建递归下降解析器。

我面临的问题是我的EBNF包含如下规则:

StatementList: Statement (',' Statement)* ','?

如果我使用“方法1”-these transformations但使用右递归而不是左递归将其转换为BNF,则会得到以下内容。不幸的是,StatementList EBNF规则的这种转换永远不会成为LL(1)语法的一部分,因为','既在StatementList1的第一集合中,也在其后集合中:

BNF1
----

StatementList:  Statement StatementList1 StatementList2
StatementList1: ',' Statement StatementList1 | ε
StatementList2: ',' | ε

因此,我想出了“方法2”-EBNF到BNF转换的替代方法,但是我不确定它是否有效。首先,假设规则右侧的所有符号都是终结符,并为所有内容赋予一个字符的名称。例如,StatementList变成SStatement变成s,而','变成c。然后我们有:

S: s(cs)*c?

接下来,将RHS视为正则表达式。我们可以将其转换为等效的右线性语法:

S: sT
T: cU | ε
U: sT | ε

现在恢复为原始名称

BNF2
----

StatementList:  Statement StatementList1
StatementList1: ',' StatementList2 | ε
StatementList2: Statement StatementList1 | ε

AFAICT BNF2与BNF1等效,但是它可以构成LL(1)语法的一部分。

  1. 方法2是将EBNF转换为BNF的有效方法吗?如果我用它来转换我的整个EBNF语法,那是否真的会给我等效的BNF格式语法?

  2. 是否可以确保使用方法2转换 any 个单个EBNF规则将生成Bem语法片段,而可以构成LL(1)语法的一部分?

  3. 因此,使用方法2将我的整个EBNF语法转换为BNF是否可能(但当然不能保证)产生的语法为LL(1)?即使使用方法1无法做到这一点?

解决方法

  1. 将EBNF右侧转换为DFA,然后将DFA重新编写为右规则语法,确实是将EBNF转换为BNF的有效过程。我相信您会在Stephan Heilbrunner 1979年的论文On the definition of ELR(k) and ELL(k) grammars中找到该算法的精确描述。 (Paywalled。希望您可以通过您的图书馆或机构进行访问。)

  2. 不能保证最终的BNF将为LL(1)。即使对于任何k,所得的BNF也不保证是LL(k)。甚至不能保证最终得到的BNF将为LR(k),但是如Heilbrunner所示,赔率更高。

  3. 当然,您可能会产生LL(1)语法。但这通常不会。