Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何将扩展的Backus-Naur语法转换为其正常表示?_Algorithm_Parsing_Grammar_Context Free Grammar_Ebnf - Fatal编程技术网

Algorithm 如何将扩展的Backus-Naur语法转换为其正常表示?

Algorithm 如何将扩展的Backus-Naur语法转换为其正常表示?,algorithm,parsing,grammar,context-free-grammar,ebnf,Algorithm,Parsing,Grammar,Context Free Grammar,Ebnf,我有一个语法,它包含括号{}之间的表达式,括号{}表示该表达式的0倍或更多倍,方括号【】之间的表达式表示该表达式的1倍或零倍,我认为这种语法称为扩展巴科斯-诺尔形式语法。 我想把语法转换成它的标准形式(没有方括号也没有方括号) 有没有一个现有的算法可以做到这一点 我知道我可以用-->B[CD]E来代替-->BE、-->BCDE,但我想知道是否有现有的算法可以用来转换这些表达式。最简单的方法是用新规则替换每个EBNF构造。以下是您可以使用的等效值: 选项 A ::= B [C D] E ; A

我有一个语法,它包含括号{}之间的表达式,括号{}表示该表达式的0倍或更多倍,方括号【】之间的表达式表示该表达式的1倍或零倍,我认为这种语法称为扩展巴科斯-诺尔形式语法。 我想把语法转换成它的标准形式(没有方括号也没有方括号)

有没有一个现有的算法可以做到这一点


我知道我可以用-->B[CD]E来代替-->BE、-->BCDE,但我想知道是否有现有的算法可以用来转换这些表达式。

最简单的方法是用新规则替换每个EBNF构造。以下是您可以使用的等效值:

选项

A ::= B [C D] E ;
A ::= B {C D} E ;
其中,ɛ表示空字符串

重复

A ::= B [C D] E ;
A ::= B {C D} E ;
零次或多次:

A ::= B X E ;
X ::= C D X | ɛ ;
A ::= B X E ;
X ::= C D | C D X ;
一次或多次:

A ::= B X E ;
X ::= C D X | ɛ ;
A ::= B X E ;
X ::= C D | C D X ;
分组

A ::= B (C D) E ;

递归地应用这些转换,您将得到香草BNF。

非常感谢!这种转换没有特定的名称,对吧?我肯定有一个特定的术语,但现在我似乎记不起来它是什么了…再次您好,我在考虑{}替换,我想另一种书写方式是X-->CD |'#'。“#”在哪里是epsilon.@Pablo是的,这是真的。我必须承认我记不太清楚正式语法。由于epsilon表示空字符串,这将是正确的写入方式(我编辑了答案)。更正我之前的注释,{}可以替换为X-->CDX |'#'。