为包含至少三个连续1的所有二十进制转二进制数组成的语言编写BNF语法。

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
计算机专业,网络和系统结构方向
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(13866)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_081074',
blogTitle:'BNF范式简介',
blogAbstract:'介绍(来自维基百科)
BNF 规定是
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}> 问题详情
最早体现结构化程序设计思想的程序设计语言是(22),最早使用BNF文法定义程序设计语言语法的语言是
悬赏:0&答案豆
发布时间:
最早体现结构化程序设计思想的程序设计语言是(22),最早使用BNF文法定义程序设计语言语法的语言是(23)。最早提出类的概念语言是(24),完备地体现面向对象并提出继承概念的程序设计语言是(25),最早的人工智能语言是(26)。A.AdaB.PascalC.Algol 68D.Algol 60请帮忙给出正确答案和分析,谢谢!
权威推荐: & &
为您推荐的考试题库
您可能感兴趣的试题
1(48)A.AdaB.PascalC.Algol 68D.Algol 602(49)A.AdaB.PascalC.Algol 68D.Simula3(50)A.AdaB.PascalC.Algol 68D.Smalltalk 804(51)A.AdaB.PascalC.Algol 68D.Lisp
我有更好的答案
电脑、移动端同步直播
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
每天只需0.4元
选择支付方式
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
恭喜你被选中为
扫一扫-免费查看答案!
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
提示:请截图保存您的账号信息,以方便日后登录使用。
常用邮箱:
用于找回密码
确认密码:一起来写个简单的解释器(4):任意数量的乘法和除法_教育指南_百度教育攻略
《一起来写个简单的解释器(1)》《一起来写个简单的解释器(2)》《一起来写个简单的解释器(3)》你是在被动地学习这几篇文章中的材料,还是主动地去做练习?我希望你主动地去练习。我真的希望哦 :)记得孔子说过的话么?精彩内容,尽在百度攻略:http://gl.baidu.com精彩内容,尽在百度攻略:http://gl.baidu.com在上一篇文章中,你已经学会了如何解析(识别)和解释带有任意数量加法或者减法运算符的算术表达式,例如“7 – 3 + 2 – 1”。你也学习了语法图以及如何使用语法图来指定一种程序设计语言的语法。本文你将会学习如何解析(识别)和解释带有任意数量乘法或者除法运算符的算术表达式,例如“7 * 4 / 2 * 3”。这篇文章讨论的除法是整数除法,所以如果表达式是“9 / 4”,那么答案将会是一个整数:2。今天我也会讨论不少有关另一种被广泛使用的、用于指定一种程序设计语言语法的表示法。它叫做上下文无关文法(简称文法)或者BNF(Backus-Naur Form 巴科斯-诺尔范式)。在这篇文章中,我不会使用纯净的BNF表示法,而是使用类似的修改过的EBNF表示法。精彩内容,尽在百度攻略:http://gl.baidu.com下面是使用文法的几个原因:文法以简明的方式说明一种程序设计语言的语法。不像语法图,文法十分简洁。你将会看到我在未来的文章中越来越多地使用文法。文法可以用作很好的文档。即使你从零开始编写你的解析器,文法也是一个很好的起点。通常,你可以通过遵循一系列简单的规则将文法转换成代码。有一组工具叫做解析器生成器,它接收一段文法作为输入,并且根据那段文法自动地生成一个解析器。我会在系列后面的文章中讨论那些工具。现在,让我们谈一下文法的原理,好吗?精彩内容,尽在百度攻略:http://gl.baidu.com下面是描述像“7 * 4 / 2 * 3”(它只是众多可以由文法生成的表达式之一)这样的算术表达式的一段文法:一段文法由一系列规则(rule)组成,也称为产生式(productions)。在我们的文法中有两条规则:精彩内容,尽在百度攻略:http://gl.baidu.com一条规则由一个非终结符(称为产生式的头或者左边)、一个冒号和一系列终结符(和 | 或者)非终结符(称为产生式的主体或者右边)组成:精彩内容,尽在百度攻略:http://gl.baidu.com上面介绍的文法中,像 MUL、DIV 和 INTEGER 这样的标记称为终结符(terminals),像expr和factor这样的变量称为非终结符(non-terminals)。非终结符通常由一系列终结符(和 | 或者)非终结符组成:第一条规则左边的非终结符符号称为开始符号(start symbol)。在我们的文法例子中,开始符号是expr:精彩内容,尽在百度攻略:http://gl.baidu.com你可以这样读expr规则:“expr可以是一个factor可选地接着一个乘法或者除法运算符,再接着另一个factor,依次可选地接着一个乘法或者除法运算符,再接着另一个factor……”factor是什么?就本文而言,factor就是一个整数。精彩内容,尽在百度攻略:http://gl.baidu.com让我们快速地回顾一下文法中用到的符号和它们的含义。|– 多选一。表示“或”。所以 (MUL | DIV) 表示要么是 MUL,要么是 DIV。( … )– 一对圆括号表示把终结符(和 | 或者)非终结符组合起来,就像 (MUL | DIV) 一样。( … )*– 匹配组合里面的内容 0 次或者多次。如果你以前了解过正则表达式,那么|、()和(…)*这些符号对于你来说应该会比较熟悉。精彩内容,尽在百度攻略:http://gl.baidu.com一段文法通过说明它可以组成什么句子来定义一种语言(language)。这是如何使用文法推导出算术表达式:首先以开始符号expr开始,然后反复地用一个非终结符所在规则的主体替代该非终结符,直到产生一个只包含终结符的句子。那些句子组成了由文法定义的语言。如果文法不能得到一条确定的算术表达式,那么它不支持该表达式,并且当解析器尝试识别该表达式时,解析器会生成一个语法错误。我依次想了几个例子。下面是文法如何得到表达式 3 的例子:精彩内容,尽在百度攻略:http://gl.baidu.com这是文法如何得到表达式 3 * 7 的例子:精彩内容,尽在百度攻略:http://gl.baidu.com这是文法如何得到表达式 3 * 7 / 2 的例子:哇,这里有相当多的理论!精彩内容,尽在百度攻略:http://gl.baidu.com我想当我第一次阅读关于文法相关的术语和诸如此类的东西,我有这样一种感觉:我可以向你保证我肯定不会像这样:精彩内容,尽在百度攻略:http://gl.baidu.com我花费了一些时间来适应这种表示法,它是如何工作的和它与解析器、语法分析器的关系。但是我必须告诉你,从长远来看,学习它是值得的。因为它在实际中被广泛应用,你也一定会遇到一些编译器文献在某些时候会用到它。所以,为何不早点学呢?:)现在,让我们将文法映射成代码,可以么?精彩内容,尽在百度攻略:http://gl.baidu.com这里是用于将文法转换成源代码的准则。遵循这些准则,你可以逐字逐句地把文法翻译给正在工作的分析器:文法中定义的每条规则,R,会变成一个同名的方法,而对那条规则的引用变成一个方法调用:R()。方法的主体跟着同一套准则的规则的主体流。多个可选项(a1 | a2 | aN)变成if-elif-else语句。可选的(…)*集合变成while语句,该语句可以循环 0 次或者多次。每个符号引用T变成对eat方法的调用:eat(T)。eat方法的工作方式是如果该方法匹配当前的lookahead符号,那么eat方法会传入符号T,然后它会从词法分析器中得到一个新的符号,并且把该符号分配给内部变量current_token。这些准则直观上看起来像这样:精彩内容,尽在百度攻略:http://gl.baidu.com让我们继续前进,遵循上述准则将我们的文法转换成代码。在我们的文法中有两条规则:expr规则和factor规则。我们以factor规则(产生式)开始。根据准则,你需要创建一个名为factor的方法(准则 1),该方法有一个对以 INTEGER 符号为参数的eat方法的调用(准则 4):精彩内容,尽在百度攻略:http://gl.baidu.com这很简单,不是吗?继续!expr规则变成expr方法(再次依据准则 1)。该规则开始是对变成了factor()方法调用的factor的引用。可选的集合(…)*变成一个while循环,(MUL | DIV)变成if-elif-else语句。把那些代码段组合在一起,我们得到了下面的expr方法:精彩内容,尽在百度攻略:http://gl.baidu.com请花点时间学习一下我是如何将文法映射成源代码的。确保你弄懂了那部分的内容,因为在以后会派上用场的。为了方便,我将上述的代码放到parser.py文件中,它包含一个词法分析器和一个解析器,不包含解释器。你可以直接从GitHub下载文件并使用它。该程序有交互式提示,你可以在提示中输入表达式并查看表达式是否可用:也就是说,依据文法构建的解析器是否可以识别该表达式。下面是运行在我的电脑上一段简单的会话:精彩内容,尽在百度攻略:http://gl.baidu.com试一下!我忍不住再次提到语法图。这是对于同一个expr规则的语法图:精彩内容,尽在百度攻略:http://gl.baidu.com我们是时候专研一下新的算术表达式解释器的源代码了。下面的代码是一个计算器,该计算器可以处理包含整数和任意数量的乘法和除法(整除)运算符的有效算术表达式。你也可以看到我把词法分析器重构成一个Lexer类,并且把Lexer实例作为参数更新Interpreter类:将上面的代码保存到calc4.py文件或者直接从GitHub上下载。像往常一样,亲自试一下并看下它是如何工作的。这是运行在我的笔记本上一段简单的会话:精彩内容,尽在百度攻略:http://gl.baidu.com我知道你迫不及待这一部分了 :) 这是今天新的练习:写一段文法来描述包含任意数量的 +、-、* 或者 / 运算符的算术表达式。你应该有能力从文法中得到像“2 + 7 * 4”、“7 – 8 / 4”、“14 + 2 * 3 – 6 / 2” 等这样的表达式。使用文法,编写一个解释器,该解释器可以计算包含任意数量的 +、-、* 或者 / 运算符的算术表达式。你的解释器应该可以处理像“2 + 7 * 4”、“7 – 8 / 4”、“14 + 2 * 3 – 6 / 2” 等这样的表达式。如果你完成了上述的联系,那么放松一下把 :)精彩内容,尽在百度攻略:http://gl.baidu.com检测你的理解。牢记今天这篇文章介绍的文法,回答下面的几个问题,需要时可以参考下面的图片:精彩内容,尽在百度攻略:http://gl.baidu.com什么是上下文无关文法?文法有多少条规则或者产生式?什么是终结符?(在图片中找到所有的终结符)什么是非终结符?(在图片中找到所有的非终结符)什么是一条规则的头部?(在图片中找到所有的头部或者左边)什么是一条规则的主体?(在图片中找到所有的主体或者右边)文法的开始符号是什么?嘿,你读到最后了!这篇文章包含了相当多理论,所以我真的为你读完这篇文章而感到骄傲。下次我会带来一篇新的文章——敬请期待,不要忘记做练习哦,它们对你有好处的。精彩内容,尽在百度攻略:http://gl.baidu.com下面是我推荐的一些书籍列表,它们对你学习解释器和编译器有帮助:Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages (Pragmatic Programmers)Writing Compilers and Interpreters: A Software Engineering ApproachModern Compiler Implementation in JavaModern Compiler DesignCompilers: Principles, Techniques, and Tools (2nd Edition)打赏支持我翻译更多好文章,谢谢!精彩内容,尽在百度攻略:http://gl.baidu.com32 viewsA+
Greg Meredith近期在Youtube上教授一门课程Introduction to the Designof Computational Calculi (DoCC) ,每周更新。主要为了让RChain爱好者们理解可计算理论及其包含的演算模型,详解rho演算是如何应用在RChain项目中并教授大家如何基于该演算模型设计RChain相关应用。
由于该课程技术性很强,其理念过于深奥且难以理解。因此本系列文章即是想以一种通俗易懂的方式来帮助大家理解课程中的一些基本概念。行文也会尽可能的保持严谨并遵循课程中想要传递的核心信息。
前几篇文章将作为DoCC课程所需的一些背景材料。首先会介绍可计算性理论的一些基础知识,比如λ演算、π演算以及作为RChain理论基础的ρ演算的语法语义等内容;在此基础上,后续也会每周更新文章来帮助我们更深入的理解DoCC课程。
首先,我们需要理解巴斯克范式及λ演算,这里我们先来讨论基本语法及操作语义。
巴斯克范式(BNF, Baukus-Naur form)
按照编程语言世界的经典规范,我们将要讨论的各类演算的语法语义都以巴斯克范式呈现。巴斯克范式可以用一种精简且准确的方式描述演算的语法规则(这里有点类似我们算法笔试中所用到的伪码,但是BNF描述的更加规范准确且没有歧义,被计算机科学界广泛接受并使用)。这里我们通过λ演算作为例子,来具体看下BNF是什么。
λ演算是一种通用的计算模型,由数学家AlonzoChurch在20世纪30年代提出。 用BNF描述λ演算的语法表示如下:
M,N ::= x | λx.M |(M N)
我们暂时不需要知道这个公式是什么意思,只需要了解这是三种不同基本形式的λ项(terms),对应了构造λ项的三种不同的规则。即M, N λ项可以由x或λx.M 或(M N) 形式组成。这些λ项是可递归构建的,因此在语言中我们可以使用相当复杂的λ项,也可以使用这些λ项在语言中做出各种合理的组合。
这可以类比为一个游戏,该游戏中,有三个规则用于描述如果构建λ项,并且有个盒子可以抽名字出来。每轮,首先给定一个λ项M,然后做如下选择:(1)从帽子中抽出名字x;(2)抽出一个名字x并组合成一个λ抽象λx.M; (3)选择另一个λ项N并组成一个应用(MN)。 规则就是这样,之后就可以通过多次重复该游戏来组成不同的λ项。(比如第一次选择(2)第二次选择(3),第一次选择后得到λ项λx.M,第二次选择后得到λ项(λx.M N))
我们可以从集合X中选择一个变量x,作为我们第一个λ项x。之后就可以构造其他的λ项了,比如λx.x 及(x x)。还有什么其他的λ项可以构造么?
这里我们先回到BNF表达式(1.1),可以看到等号右面的变量x来自于一个变量集合X,而游戏规则是我们只从集合X中取变量,集合X中的内容是我们可以控制的,并且改变集合X会改变我们语言中的表达式的合规性。因此我们可以称这个语法在变量X中是参数化的。所以有些人会把这个λ演算的BNF表达式写的有点奇怪,用X集合来显示的放入表达式中:
M[X]::= X | λX.M[X] | (M[X] M[X])
用于强调λ项M[X]对X的依赖性。本段文字有点跑题,主要是想要强调λ项对给定变量的依赖性。
另一个在(1.1)中值得注意的内等容是几个M和N出现在BNF表达式的两侧。这意味着如果我们有两个λ项M和N,我们有一些选项可以递归创建新的λ项:
x(变量;从集合X中选择一个变量,诚然这与M和N没什么关系,变量本身也是个λ项)
λx.M(抽象;将变量x绑定在M中,即在M中声明x变量,抽象也是λ项)
(M N)(应用;将 λ项M“应用”到λ项N,应用同样也是λ项)
基本上λ演算就是上面这样了。我们总是可以从一些符合规范的λ项组成另一些符合规范的λ项。我们来看几个例子:
1.λx.λy.x是符合规范的λ项(这是一个重要的例子,因为它是λ演算中布尔函数True的编码)
证明:x是符合规范=>M=λy.x符合规范=>λx.M=λx.λy.x符合规范
2. (λx.xy)是符合规范的λ项(这也是一个重要的例子,因为λx.x充当λ演算中的恒等函数)
证明:λx.x符合规范=>(λx.xy)符合规范(将λx.x应用于y)
xλx。是不正确的语法=>不是一个可接受的λ项
以上就是我们需要知道的关于构造λ项的所有知识了。但是,这并没有告诉我们这些λ项是如何相互作用的。为此,我们还需要讨论下操作语义。
λ演算可以映射为函数的概念:抽象(λx.M)从一个函数中选择变量,应用(M N)用函数来评估变量。这个思想指导了这些结构间的相互作用,称之为操作语义。在λ演算中主要有两种关系,α-变换和β-规约:
λx.M{x}→ λy.M{y}
该规则认为,只是“绑定变量”名称不同的两个λ项的可以认为是“结构上等同”的。“结构上等同”的意思是这些λ项从计算的角度上看是没有区别的。“绑定变量”的指的是表达式λx.M{x}中的x。变量x出现在λ项M中(被写为M{x})并且λ在这个表达式中绑定x,即λ在M中声明变量x。另一种等价的解释方式是函数f可以将x作为变量,写作f(x),或者它可以用y作为变量,写作f(y),不管我们用哪个变量名,这个函数表达的含义相同。这就是α转换的本质。也即告诉我们λx.M和λy.M{y / x}是等价项(译者注:这里λy.M{y / x}的意思应该是α-变换的一个约束,即y的变化不能超过x变量的取值范围,该变换才能成立)。
(λx.MN)→M {N / x}
β规约主要表达函数的应用。(λx.MN)中,前半部分是λ抽象λx.M,后面的N用于替代λx.M中的x,也即λx.M应用于N。这即是一个简单的函数评估:在函数M中声明变量x并用其评估N,即用N代替x。这也可以被认为是功能组合,如果我们将函数f(x)应用于g(y),我们可以得到函数f(g(y))。这与替换x=g(y)效果完全相同。
下面举一些便于理解操作语义的例子:
1,λx.(x z)→λy.(y z)
设M {x} =(xz)和M {y} =(yz),所以我们直接α-转换得到λx.(xz)=λx.M{x}→λy.M{y}=λy.(yz)。 即使在λx.(x y)中存在抽象和应用,它也不是β规约。请思考为什么?(对比上文β规约内容显然)
2,(λx.(x x)y)→(y y)
这是一个β规约,因为我们将抽象λx.(x x)应用于项y。设M {x} =(x x), 代入M{x}后通过β规约有(λx.(x x)y)=(λx.My)→M {y / x} =(x x){y / x} =(y y)。
3,(λx.(λy.(x y)u)v)→(v u)
这里有两轮β规约。 第一轮,让M {x} =(λy.(x y)u)。 然后(λx.(λy.(xy)u)v)=(λx.Mv)→M {v / x} =(λy.(xy)u){v / x} =(λy.(vy)u)。 最后我们对剩余的表达式使用直接的β规约得到(λy.(v y)u)→(v u)。
综上,我们简单介绍了λ演算的语法及两个主要的操作语义。如果您之前没有了解过该内容,初识可能会觉得该部分内容有些难以理解。本文中也确实没有告诉我们λ演算是如何与算术是相关联的,但是该系列后面的文章会很快触达具体的内容。我们一步一步来。
译者:由于现代计算机编程语言基本上完全按照λ演算的规则来实现,若有编程经验的同学应该很容易看出来λ演算与编程语言语法中函数的关联性。这里就个人理解做一个简单的总结性类比:
x:变量声明,int x
λx.M:函数声明, def M(x)
(M N):M(x)和N(y)都是函数,表示M(N(y)), 要求N(y)的结果与变量x声明的类型一致或取值范围一致,此例子中为int型。
α-变换: 函数的内容一致时,修改函数变量名函数的功能是没区别的,f(x)与f(y)等价,α-变换避免了不同函数中变量名称冲突的问题
β-规约:两个函数f(x)和g(y),当x= g(y)时候,可以表示为f(g(y))
*补充,η-变换:如果两个函数在变量相同时总有f(x)===g(x),则f=g
[1] Computational Calculi Primer Part 1:Lambda calculus & BNF (https://blog.rchain.coop/computational-calculi-primer/)
[2] Wikipedia-Lambda calculus (https://en.wikipedia.org/wiki/Lambda_calculus)
本文由微信公众号:Rchain中文社区 翻译
<span class="tipso_style" id="tip-p" data-tipso='
ETH赞助地址二维码
有回复时邮件通知我
本站是与官方合作的RChain中文爱好者网站,及时发布各种相关中文资讯
站长:北京之东
微信:beijingzhidong
技术讨论QQ群:
畅聊讨论QQ群:
联系邮箱:helloblockchain#gmail.com,请换掉#为@
记住我的登录信息
输入用户名或电子邮箱地址,您会收到一封新密码链接的电子邮件。
用户名或电子邮件地址【图文】第三章 文法和语言_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第三章 文法和语言
阅读已结束,下载本文到电脑
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 二进制数怎么表示 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信