C++中switch语句的BNF 否极泰来 ——《周易》.

Slides:



Advertisements
Similar presentations
第六章 人事行政 一、教案释疑 政府系统内非经选举或政治任命产生 的常任文官 —— 这样的公务员是何种公务员 ?
Advertisements

〈媽媽的手〉 國二甲 蔡于均. 一.題旨 作者寫本文時,已身為人母,深深體會 到一個母親持家的辛勞,自然想起 了母親,以「媽媽的手」為題,歌 頌中國傳統婦女堅忍耐勞的美德, 並表達對母親的懷念。
组长:陈俊帆  组员:秦宗浩 何美林 白珊珊 蒋壮壮 黄 兰森 任雨之  班级:高 2014 级 2 班  指导老师:刘芬.
目录 古诗 现代诗 春夏秋冬 返回 咏柳 (贺知章) 碧玉妆成一树高, 万条垂下绿丝绦。 不知细叶谁裁出, 二月春风似剪刀。
教學單元:嬉遊記 活動主題:西遊記 - 三借芭蕉扇 低年級語文領域成員: 蔡妮君、劉盈秀、林嘉璇、郭惠玟、施乃菁、廖丸毅、李思韻.
建设党员标兵制 ——“ 选树 ” 学生党员标兵的探索与经验 传媒学院学生党支部 曲阜师范大学 2015 年度党支部创新活动方案验收汇报 2016 年 5 月 20 日.
组长:肖志远 组员:王嘉乐 翁家程 冯乐微 陶天皓 赵泽昊 “读书有味”主题阅读 阅读书目: 《西游记》 研究主题: 孙悟空的性格特点.
关于 “ 上海的新移民与传播 ” 研究调查报告.  小组成员:(周五上午班级)  董正椽: 研究设计及书面报 告  邵必为: ppt 制作、调查  曹本沛: 调查  江智东 调查  夏昊:
团队指导老师:李春虎 团队核心:黄跃民 团队成员:廖育人 朱蒙 郁倩.  姓名:黄跃民  专业:印度尼西亚语  学历:研究生  学位:博士  主要承担课程:高级印 尼语,印尼语泛读,印 尼文化  姓名:郁倩  专业:印度尼西亚语  学历:本科  学位:学士  主要承担课程:基础印.
耐心陪孩子玩,即使你真的认为他的游戏内容很无聊。. 请蹲下来和孩子说话。 一开始别太在乎孩子成绩,要关心他是否喜欢学校。
19 世纪不同国家的文学 作品所反映的社会现实. 法国:《我的叔叔于勒》 —— 莫泊桑 俄罗斯:《胖子与瘦子》 —— 契科夫 美国:《麦琪的礼物》 —— 欧亨利 选取的作品.
第三單元 我的世界宇宙大 教學設計:黃筱晶. 一、使用說明 (一) 本教學設計核心概念為「生涯發展」,共 四節課, 160 分鐘。 (二) 為了讓小學教學現場更加適用,教師可選 擇連續實施四節課,或彈性選擇其中一節 課或二節或三節課實施。 (三)四節課都進行是最完整的,但若因時間不允 許只進行其中一節課或二節或三節課實施,
上海市职业能力考试院 职称外语考试网上报名指导 (仅供参考). 考试报名 注意事项: 1 、本 PPT 旨在帮助考生熟悉上海市职业 能力考试院网上考试报名,仅供参考。 2 、每次考试报名细节处可能会有不同, 请具体关注考试院网上具体信息。
第二組 資料蒐集: 楊淳雅 陳佑安 PPT 製作: 陳薇如 口頭報告: 凃偌雯 葉于禎.
一、教学目标: 1 、阅读文章感悟作者的评论观点。 2 、阅读《百合花》,简述故事的情节。 3 、掌握小说阅读的基本方法。 4 、结合作者的观点和自己的体会,选取 一个角度赏析作品,谈出自己的独特见 解和感受。 二、教学重点、难点: 同目标 3 、 4.
关于网络对中学生的影响.
鎮東國小附幼 102學年度下學期 備課報告 彭淑宜 蕭秀蘭 沈旻慧 陳玉玲 張瓊貞.
荒岛求生 ——浅谈鲁滨逊的生存智慧.
讲解:赵玲 PPT制作:祝菁菁 材料搜集:石岩 田甜
2015年工作情况汇报 部门:轿车公司团委 时间:2015年11月.
第四节 品析艺术技巧 唐玄宗送张九龄白羽扇 张九龄是唐代开元年间的著名宰相,他为相贤明,敢于直谏,常惹得玄宗不高兴。开元二十四年,李林甫在玄宗面前举荐牛仙客为尚 书。张九龄强烈反对,但玄宗还是重用了牛仙客。接着,玄宗又欲以李林甫为相,张九龄以社稷为重,再次向玄宗劝阻,玄宗很不高兴。李林甫为篡夺相位,乘机私进谗言,诬告张九龄常怀诽谤之心。于是玄宗换相之意已决,他命高力士于秋风萧飒之时赐给张九龄白羽扇。
頑皮公主不出嫁 文.圖/巴貝柯爾 譯/吳燕凰 ppt製作/鄭仁偉. 頑皮公主不出嫁 文.圖/巴貝柯爾 譯/吳燕凰 ppt製作/鄭仁偉.
鲁滨逊漂流至荒岛后的心理变化 刘箫仪小组.
性平三法及兒少相關保護法令之介紹與宣導 華誠聯合律師事務所 蔡其龍律師.
精心设计学法,创造富有生机与活力的“学讲”有序课堂
我征服了黃山 林達的黃山之旅 2006春.
第四章 账户及复式记账的应用 教学目的与要求:本章内容属于会计实务部分。通过本章的教学,使学生掌握制造企业经济业务的核算内容及账务处理,进一步加深对复式记账原理的理解,熟练掌握借贷记账法在制造企业的实际应用。 教学重点:运用借贷记账法对制造企业的经济业务进行账务处理。 教学难点:利润的核算;期末各账户之间的相互结转。
返本归原在课文,精讲多练会高考 ——2012届高三语文复习的几点做法.
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
迴圈 迴圈基本觀念 while迴圈 do 迴圈 for迴圈 巢狀迴圈 迴圈設計注意事項 其他控制指令 迴圈與選擇的組合.
图书馆直属党总支 党风廉政建设专题党课.
西游记 之 兵器.
第一章信託法 第一節 信託契約 第二節 信託財產 第三節 受益人 第四節 受託人 第五節 信託關係之消滅.
从“无节操游戏” 看人际交往 应用伦理学课程研究.
三十集大型红色史诗电视剧 《傅连璋》 策划案.
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
航空服务沟通与语言艺术 非语言沟通的含义 主讲人:李敬华.
第 5 章 流程控制 (一): 條件分支.
報告人:萬華國中 吳菜霞校長 中華民國103年11月27日
選擇 運算式 邏輯運算 if指令 流程圖基本觀念 程式註解 巢狀if指令 switch指令.
初中獨立專題探究(文字模式) 課程規劃與教學經驗分享
程式設計實作.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
C++Primer 3rd edition 中文版 Chap 5
第一次随堂作业(10.16) 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
流程控制結構 4-1 流程控制與UML活動圖 4-2 程式區塊與主控台基本輸入 4-3 條件控制敘述 4-4 迴圈控制敘述 4-5 巢狀迴圈
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C 語言簡介 - 2.
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
程式設計 老師:戴自強 助教:楊斯竣.
陳維魁 博士 儒林圖書公司 第五章 控制結構 陳維魁 博士 儒林圖書公司.
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第3章 JavaScript基本语句.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
單元名稱:結構化程式設計 報告人 劉洲溶.
探究影响浮力大小的因素.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
多重條件選擇敘述
C语言基本语句 判断循环.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
Presentation transcript:

C++中switch语句的BNF 否极泰来 ——《周易》

先定义后使用 BNF(巴科斯-瑙耳范式)是一种用于表示上下文无关文法(2型文法)的语言 最早用于描述ALGOL 60 编程语言 文法(形式文法)是描述一种语言的方法。 语言是一个包含所有合法字符串的集合。 语言 = 语法(文法) + 语义。 2

文法 文法是四元组 G=(V,Σ, R, S) Σ 是终结符集。又称为字母表。 V是非终结符(中间变量)集。 非终结符可以根据产生式“展开”。 终结符不能再分割。(但可以转化) R是产生式(即转化规则)。 S是起始变量。

产生式 通俗地,长这样 X → Y BNF中这么表示 X ::= Y X和Y是字符串。只能包含字母表中的字符(终结符)和非终结符。 任何一个合法句子,都能从S开始,按一定顺序应用某些产生式得到。 请注意:某一语言的合法字符串只包含终结符。含非终结符的都是中间量。

烤鸭菜谱文法 非终结符V = {普通法,酒渍法} 终结符Σ = {杀,洗,盐腌,酒渍,烤} 产生式R: S→杀、洗、普通法 普通法→盐腌、烤 酒渍法→盐腌、酒渍、烤 S在这里相当于“烤鸭方法” 5

关于非终结符 一般放在引号里 “for” “(“ stat “;” cond “;” stat “)” stat PPT里对眼睛不好。

BNF中扩充了一些符号 [ ] 可选项。 { } 可重复0至无数次的项。 | 任选其一,相当于"OR" ::= 定义,相当于“→” [ ] 可选项。  { } 可重复0至无数次的项。  |  任选其一,相当于"OR"  ::= 定义,相当于“→” () 表示分组、改变优先级等 可以证明,前三个符号能通过添加非终结符、添加相关的产生式来得到。 是否使用扩充符号,文法表达能力不变。

我知道你们要念《西江月·证明》 S ::= 炭烤鸭 | 啤酒鸭 | …… S→炭烤鸭 S→啤酒鸭 …… S ::= 烤鸭[真]好吃 S→烤鸭好吃 S→烤鸭X好吃 X→真X X→真

BNF懂了,查文献交差喽 GNU有C++的规范BNF http://www.nongnu.org/hcb/ switch_block ::= switch ( condition ) statement 蛤??? It’s too simple. Somewhat naive.

不着急 switch_block ::= switch ( condition ) statement 剖析一下两个非终结符

condition Condition的具体定义很复杂。(一大堆产生式、非终结符)。简而言之: 符合C++语法的,任何返回值为整形(或char/bool)的东西都是condition,例子如下: 1==2 3==true ‘x’ a=1 a=1,b=2 ++(++x) 11

statement statement ::= labeled-statement| 带标签语句 expression-statement| compound-statement| selection-statement| iteration-statement| jump-statement| declaration-statement| try-block

labeled-statement labeled-statement ::= (identifier : statement ) | (case constant-expression : statement) | (default : statement) 另外,compound_statement里面有大括号 *constant-expression是常量表达式

另外一件重要的事情 statement → compound_statement → { statement_seq } 再利用这两条规则 statement_seq ::= statement (请类比) X ::= 真 statement_seq ::= statement_seq statement (请类比) X ::= X 真 可以递归生成多个statement且确保在大括号内

否极泰来 GNU是著名的基建大师 对condition和statement进行良好定义后 switch的BNF就是如此简单 某微积分老师:GNU开创非终结符condition和statement之详尽定义,C++文法由此严密。 千古绝学!真神技也!

再来一盘烤鸭 用文法生成下列语句: switch(1){ case 1: a = 1; break; case 2: a = 2; default: a = -1; } switch_block → switch(condition) statement → switch( 1 ) compound_ { statement_seq }

再来一盘烤鸭-2 → switch( 1 ) { statement statement statement { labeled-statement jump-statement labeled-statement }

再来一盘烤鸭-3 → switch( 1 ) { case const-expression : statement jump-statement case const-expression : statement default : statement }

再来一盘烤鸭-4 → switch( 1 ) { case 1 : a = 1; break; case 2 : a = 2; default : a = -1; }

从而可知 这是你眼中的case语句块 case 1 : a = 1; 这是编译器眼中的 case 1 : a = 1;

请对比 goto语句标号 3: if (x>1) x = 1; case语句块 case 1: a = 1; 再看看定义 labeled-statement ::= (identifier : statement ) | (case constant-expression : statement) | (default : statement)

编译器的眼中 goto的标号 == case case的本质是标号 编译器面前一律平等

还有个重要情况没给你透露 switch_block 这个非终结符根本不存在 这是我自己命名的 原文: selection-statement ::= ( if ( condition ) statement ) | ( if ( condition ) statement else statement ) | ( switch ( condition ) statement ) switch君:原来我和if是平等的。。蛤??

其实一开始让我讲,我是拒绝的 三张PPT就能讲完了,有什么好讲的呢? switch的BNF,不就长这副样子吗? switch_block ::= switch( condition ) { { case : constant-expression statement } [ default : statement ] } 然而,其实长这样?还与if是平等的? switch_block ::= switch( condition ) statement

编译结果:0错误,0警告

否极泰来^2 0错误,0警告,里面代码其实不会运行 switch(x)的本质是goto,goto的目标行具有case value(x)标签 这就完美解释了为什么“未break就继续运行”并且“无视其他case标签” 把case看成goto标签,一切都解决了。 这不过是“顺序结构”的体现 至于上例,没标签当然不会goto,直接跳过。

大师手笔,目的何在? 请各位回忆PPT第二张 语言 = 语法 + 语义 如果提前限定switch里面有什么 这就是“语法对语义的入侵” 语义的定义又严格依赖于语法 二者分工相当重要 Switch如此简单的BNF,是语法和语义的相互妥协

总结:大师的抉择 道法自然 ——《道德经》 否极泰来 ——《周易》

Fin. Great Appreciations