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

Parsing 这是将EBNF转换为BNF的有效方法吗?,parsing,compiler-construction,grammar,context-free-grammar,bnf,Parsing,Compiler Construction,Grammar,Context Free Grammar,Bnf,我有一个描述语言的EBNF语法。我想知道是否有一个等价的LL(1)BNF语法,这样我就可以为不带“”的语言构建递归下降解析器 我面临的问题是,我的EBNF包含如下规则: StatementList: Statement (',' Statement)* ','? 如果我使用“方法1”将其转换为BNF,但使用右递归,而不是左递归,我将得到以下结果。不幸的是,StatementListEBNF规则的这种转换永远不能成为LL(1)语法的一部分,因为,“在StatementList1的第一组和第二组中

我有一个描述语言的EBNF语法。我想知道是否有一个等价的LL(1)BNF语法,这样我就可以为不带“”的语言构建递归下降解析器

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

StatementList: Statement (',' Statement)* ','?
如果我使用“方法1”将其转换为BNF,但使用右递归,而不是左递归,我将得到以下结果。不幸的是,
StatementList
EBNF规则的这种转换永远不能成为LL(1)语法的一部分,因为
,“
StatementList1
的第一组和第二组中:

BNF1
----

StatementList:  Statement StatementList1 StatementList2
StatementList1: ',' Statement StatementList1 | ε
StatementList2: ',' | ε
所以,我提出了“方法2”——一种EBNF到BNF转换的替代方法,但我不确定它是否有效。首先,假设规则右侧的所有符号都是终端,并为所有符号指定一个字符的名称。例如,
语句列表
变为
S
语句
变为
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)语法的一部分

  • 方法2是将EBNF转换为BNF的有效方法吗?如果我用它来转换我的整个EBNF语法,这真的会给我一个BNF形式的等价语法吗

  • 是否可以保证使用方法2转换任何单个EBNF规则将生成一个BNF语法片段,该片段可能构成LL(1)语法的一部分

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

  • 将EBNF右侧转换为DFA,然后将DFA重写为右侧规则语法,这确实是将EBNF转换为BNF的有效过程。我相信你会在Stephan Heilbrunner 1979年的论文中找到对算法的精确描述。(付费。希望您可以通过图书馆或机构访问。)

  • 无法保证由此产生的BNF为LL(1)。对于任何k,即使结果BNF为LL(k),也无法保证。甚至不能保证由此产生的BNF将是LR(k),但海尔布伦(Heilbrunner)显示,可能性更大

  • 当然,你有可能写出LL(1)语法。但通常不会


  • 您是否考虑过接受Laurence的建议,改为执行LR解析?:-)只是问。。。