首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将EBNF转换为BNF基础

将EBNF转换为BNF基础
EN

Stack Overflow用户
提问于 2013-02-25 03:50:51
回答 1查看 6.8K关注 0票数 2

我不太清楚如何回答我的计算机语言课的问题。我要将以下声明从EBNF表单转换为BNF表单:

EBNF:expr --> [-] term {+ term}

我知道,花括号中包含的表达式要重复0次或多次,直角大括号中包含的内容代表零或一个选项。如果我的理解是正确的,这是否正确的转换?

我的BNF:

代码语言:javascript
复制
expr --> expr - term
       | expr + term
       | term

奖金阅读

EN

回答 1

Stack Overflow用户

发布于 2013-02-25 06:48:16

我觉得这不对。事实上,我不认为EBNF是有效的EBNF。How to convert BNF to EBNF问题的答案显示了如何构造EBNF,引用了国际标准化组织/IEC 14977:1996的扩展巴克斯-诺尔格式标准。

我想这句话是:

代码语言:javascript
复制
expr --> [-] term {+ term}

应写明:

代码语言:javascript
复制
expr = [ '-' ] term { '+', term };

这意味着表达式由一个可选的减号组成,后面是一个term,后面是一个加号和一个term的零序列。

下一个问题:你针对的是哪一种BNF方言?这里的情况很棘手,有许多方言。然而,这里有一个可能的翻译:

代码语言:javascript
复制
<expr> ::= [ MINUS ] <term> <opt_add_term_list>

<opt_add_term_list> ::= /* Nothing */
     | <opt_add_term_list> <opt_add_term>

<add_term> ::= PLUS term

其中减号和加号是终端(表示“-”和“+”)。这是一个非常简朴但最小的BNF。另一种可能的翻译是:

代码语言:javascript
复制
<expr> ::= [ MINUS ] <term> { PLUS <term> }*

其中,{ ... }*部件意味着包含的模式...中的零或多个(在本例中为PLUS <term> )。或者您可以使用引用的字符:

代码语言:javascript
复制
<expr> ::= [ '-' ] <term> { '+' <term> }*

因此,一系列可能的替代方案还在继续。你必须看一下给你工作的BNF的定义,如果它是ISO标准EBNF的话,你应该抱怨给你的EBNF非常草率。如果它只是一些随机的BNF风格的语言,叫做EBNF,我想它只是一个令人困惑的名字。私人方言只要被定义就行,但不熟悉方言的人不可能知道正确的答案是什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15059790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档