C—的BNF语法

近期用到ABB机器人,RAPID使用BNF语法规则描述,所以不得不复习了一下BNF语法描述规则,通过C的BNF描述,唤醒我的记忆 %>_<%

C—的BNF语法如下: 
1. program  →  declaration-list  
2. declaration-list → declaration-list  declaration | declaration  3. declaration → var-declaration | fun-declaration  
4. var-declaration → type-specifier ID  | type-specifier ID [ NUM ]   5. type-specifier → int | void | float  
6. fun-declaration → type-specifier ID(params)  compound-stmt 7. params → params-list | void  
8. param-list → param-list,param | param  
9. param → type-specifier ID| type-specifier ID[]  
10. compound-stmt → { local-declarations statement-list }  
11. local-declarations → local-declarations var-declaration | empty  12. statement-list → statement-liststatement | empty  
13. statement → expression-stmt | compound-stmt | selection-stmt  | iteration-stmt | return-stmt  
14. expression-stmt → expression;|;  
15. selection-stmt → if (expression) statement  | if (expression) statement else statement  
16. iteration-stmt → while (expression) statement  17. return-stmt → return; | return expression;  
18. expression → var = expression | simple-expression  19. var → ID | ID[expression]  
20. simple-expression → additive-expression relop additive-expression |  additive-expression  
21. relop → <= | < | > | >= | = = | != | && | ||  
22. additive-expression → additive-expression addop term | term  23. addop → + | -  
24. term → term mulopfactor | factor  25. mulop → * | /  
26. factor → (expression) | var | call | NUM  27. call → ID (args)  
28. args → arg-list |empty  
29. arg-list → arg-list,expression | expression 
下面是对以上每条文法规则,给出了相关语义的简短解释。  
1.program → declaration-list  
2.declaration-list → declaration-list declaration | declaration  
3.declaration → var-declaration | fun-declaration  
程序由声明的列表(或序列)组成,声明可以是函数或变量声明,顺序是任意的。至少必须有 一个声明。接下来是语义限制(这些在C中不会出现)。所有的变量和函数在使用前必须声明 (这避免了向后backpatching引用)。程序中最后的声明必须是一个函数声明,名字为main。 注意,C1缺乏原型,因此声明和定义之间没有区别(像C一样)。  
4.var-declaration → type-specifier ID  | type-specifier ID[NUM];  
5.type-specifier → int | void | float 变量声明或者声明了简单的整数或浮点类型变量,或者是基类型为整数或浮点的数组变量, 索引范围从0到NUM-1。注意,在C1中仅有的基本类型是整型和空类型。在一个变量声明中, 只能使用类型指示符int。void用于函数声明(参见下面)。也要注意,每个声明只能声明一 个变量。  
6.fun-declaration → type-specifier ID(params) compound-stmt  
7.params → param-list | void  
8.param-list → param-list , param | param  
9.param → type-specifier ID |type-specifier ID[]  函数声明由返回类型指示符、标识符以及在圆括号内的用逗号分开的参数列表组成,后面跟 着一个复合语句,是函数的代码。如果函数的返回类型是void,那么函数不返回任何值(即 是一个过程)。函数的参数可以是void(即没有参数),或者一列描述函数的参数。参数后面 跟着方括号是数组参数,其大小是可变的。简单的整型参数由值传递。数组参数由引用来传 递(也就是指针),在调用时必须通过数组变量来匹配。注意,类型“函数”没有参数。一个 函数参数的作用域等于函数声明的复合语句,函数的每次请求都有一个独立的参数集。函数 可以是递归的(对于使用声明允许的范围)。  
10.compound-stmt → { local-declarations statement-list }   复合语句由用花括号围起来的一组声明和语句组成。复合语句通过用给定的顺序执行语句序 列来执行。局部声明的作用域等于复合语句的语句列表,并代替任何全局声明。  
11.local-declarations → local-declarations var-declaration | empty  
12.statement-list → statement-list statement | empty  
注意声明和语句列表都可以是空的(非终结符empty表示空字符串,有时写作ε。)  
13.statement → expression-stmt  | compound-stmt  | selection-stmt  | iteration-stmt  | return-stmt  
14.expression-stmt → expression; |   
表达式语句有一个可选的且后面跟着分号的表达式。这样的表达式通常求出它们一方的结 果。因此,这个语句用于赋值和函数调用。  
15.selection-stmt → if (expression) statement  | if (expression) statement else statement  
if语句有通常的语义:表达式进行计算;非0值引起第一条语句的执行;0值引起第二条语句的执行,如果它存在的话。这个规则导致了典型的悬挂else二义性,可以用一种标准的方法解决:else部分通常作为当前if的一个子结构立即分析(“最近嵌套”非二义性规则)。  
16.iteration-stmt → while (expression) statement  
while语句是C-中唯一的重复语句。它重复执行表达式,并且如果表达式的求值为非0,则 执行语句,当表达式的值为0时结束。  
17.return-stmt → return; | return expression  返回语句可以返回一个值也可无值返回。函数没有说明为void就必须返回一个值。函数声明 
为void就没有返回值。return引起控制返回调用者(如果它在main中,则程序结束)。  
18.expression → var=expression | simple-expression  
19.var→ ID | ID[expression]  
表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达 式。赋值有通常的存储语义:找到由var表示的变量的地址,然后由赋值符右边的子表达式 进行求值,子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。var是简 单的(整型)变量或下标数组变量。负的下标将引起程序停止(与C不同)。然而,不进行下标 越界检查。  
var表示C1比C的进一步限制。在C中赋值的目标必须是左值(l-value),左值是可以由许多操 
作获得的地址。在C1中唯一的左值是由var语法给定的,因此这个种类按照句法进行检查, 代替像C中那样的类型检查。故在C1中指针运算是禁止的。  
20.simple-expression → additive-expression relop additive-expression  |additive-expression  
21.relop → <= | < | > | >= | == | != | && | ||  
简单表达式由无结合的关系操作符组成(即无括号的表达式仅有一个关系操作符)。简单表达 式在它不包含关系操作符时,其值是加法表达式的值,或者如果关系算式求值为ture,其值 为1,求值为false时值为0。  
22.additive-expression → additive-expression addop term | term 23.addop → + | -  
24.term → term mulop factor | factor  
25.mulop → * | /   
加法表达式和项表示了算术操作符的结合性和优先级。/符号表示整数除;即任何余数都被 截去。  
26.factor → (expression) | var | call | NUM  
因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数 的返回值;或者一个NUM,其值由扫描器计算。数组变量必须是下标变量,除非表达式由单个ID组成,并且以数组为参数在函数调用中使用(如下所示)。 
27.call → ID(args)  
28.args → arg-list | empty  
29.arg-list → arg-list,expression | expression  
函数调用的组成是一个ID(函数名),后面是用括号围起来的参数。参数或者为空,或者由逗 号分割的表达式列表组成,表示在一次调用期间分配的参数的值。函数在调用之前必须声明, 声明中参数的数目必须等于调用中参数的数目。函数声明中的数组参数必须和一个表达式匹 配,这个表达式由一个标识符组成表示一个数组变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Warning: Attempt to present on whose view is not in模态跳转问题

错误分析&#xff1a; controller A present controller B ,前提是A的view要存在&#xff0c;如果不存在&#xff0c;就会报这个错。解决方法&#xff1a; 将原来的present语句由 viewDidLoad方法中移到 viewDidAppear中&#xff0c;问题就可以解决。但是这样的话&#xff0c;画…

Reflector7及破解

Reflector7开始收费&#xff0c;前面的版本都已经过期&#xff0c;在网上下载了Reflector7&#xff0c;并找到了破解软解&#xff0c;特在此分享。 下载地址&#xff1a; Reflector7.1.0.143.zip&Red.Gate_.NET_.Reflector.7.1.0.143.patch-SND.zip 本文转自xwdreamer博客园…

win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法

如上图所示&#xff0c;桌面或其他大部分地方点击右键菜单&#xff0c;都只显示一个白色框&#xff0c;鼠标移上去才有菜单项看&#xff0c;并且效果很丑 解决办法&#xff1a; 计算机—右键—属性—高级—性能—设置—视觉效果—淡入淡出或滑动菜单到视图&#xff0c;将其前面…

【setup.py编译出错】——提示无法查找到powershell.exe

https://www.cnblogs.com/wind-chaser/p/11359521.html pytorch fasterrcnn训练自己数据集文章链接 在进行faster rcnn pytorch跑通的时候遇到的&#xff0c;我是直接在pycharm中的终端上进行运行的&#xff0c;但是一直会跳出powershell.exe无法查找的错误&#xff0c; pytho…

同工不同酬,年薪 50 万美金的工程师到底有什么神本事?

同工不同酬&#xff0c;年薪 50 万美金的工程师到底有什么神本事&#xff1f;投递人 itwriter 发布于 2014-05-10 23:09 评论(6) 有6066人阅读 原文链接 [收藏] 英文原文&#xff1a;What kind of jobs do the software engineers who earn $500K a year do? 他们究竟是作…

201671010117 2016-2017-2 《Java程序设计》Java第十七周学习心得

Java第十七周学习心得 这一周老师对线程的内容进行了详细讲解&#xff0c;包括线程创建的两种技术&#xff0c;和线程的优先级属性及调度方法&#xff0c;对于布置的实验作业中&#xff0c;实验九中存在一点问题&#xff0c;程序运行不出来&#xff0c;后来跟同学商量探讨没有…

ACM数论之旅4---扩展欧几里德算法(欧几里德(・∀・)?是谁?)

为什么老是碰上 扩展欧几里德算法 ( •̀∀•́ )最讨厌数论了 看来是时候学一学了 度娘百科说&#xff1a; 首先&#xff0c; axby gcd(a, b) 这个公式肯定有解 &#xff08;( •̀∀•́ )她说根据数论中的相关定理可以证明&#xff0c;反正我信了&#xff09; 所以 axby g…

艾里斑大小与像元尺寸的匹配问题

写给自己看的学习记录&#xff1a; 光具有波粒二象性&#xff0c;由此衍生出了几何光学与衍射光学。在光学设计软件中&#xff0c;最常用的判断标准是查看点列图的RMS半径以及MTF图的曲线&#xff0c;这两者分别代表了两种传播性质的评价方式。 在刚接触光学设计时&#xff0…

Android 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护

本文分为两个部分&#xff0c;第一部分为双Service守护&#xff0c;第二部分为双进程守护 第一部分&#xff1a; 一、Service简介&#xff1a;Java.lang.Object ↳Android.content.Context ↳android.content.ContextWrapper ↳android.app.Service Service是应用程序Applicati…

【mmdetection2.0错误】——ModuleNotFoundError: No module named ‘mmdet‘

一开始以为是安装包导入的相对路径的问题&#xff0c;结果鼓捣了一上午都没有用&#xff0c;最后才发现再进行mmdet2.0环境配置的时候忘记编译了 也就是如下语句&#xff1a; python setup.py develop

聊聊分布式事务

事务就是一个会话过程中&#xff0c;对上下文的影响是一致的&#xff0c;要么所有的更改都做了&#xff0c;要么所有的更变都撤销掉。就要么生&#xff0c;要么死。没有半死不死的中间不可预期状态。参考下薛定谔的猫。 事务是为了保障业务数据的完整性和准确性的。分布式事务&…

PLSQL DBMS_DDL.ANALYZE_OBJECT

http://space.itpub.net/11893231/viewspace-683241 本文转自健哥的数据花园博客园博客&#xff0c;原文链接&#xff1a;http://www.cnblogs.com/gaojian/archive/2012/11/30/2795775.html&#xff0c;如需转载请自行联系原作者

【深度学习mmdetection错误】——mmdetection 运行报错KeyError:‘ConvWS is already registered in conv layer‘

于是修改以下mmdetection的安装文件&#xff1a; site-packages/mmdet-2.1.0unknown-py3.7-linux-x86_64.egg/mmdet/ops/conv_ws.py" 把 CONV_LAYERS.register_module(ConvWS) 修改为&#xff1a; CONV_LAYERS.register_module(nameConvWS, forceTrue)

ABB RAPID 在 Notepad++ 中语法高亮的实现

ABB RAPID 在 Notepad 中语法高亮的实现 分类&#xff1a; Misc2014-04-08 15:43 145人阅读 评论(0) 收藏 举报notepadNotepad 内置了一个称为 UDL2.0 (User Defined Language) 的引擎&#xff0c;来实现用户自定义语法高亮&#xff0c;使用它&#xff0c;可以定制自己的代码语…

Redis服务器的启动过程分析

转载于&#xff1a;http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/127.html?1455808771 本文将通过分析代码来介绍Redis的启动过程&#xff0c;通过查看Redis 的启动脚本&#xff0c;得知Redis的启动时从Redis.c的main方法开始的。Redis启动可以分为以下几个步骤…

MyEclipse运行时自动保存

今天第一次用MyEclipse&#xff0c;我发现我的代码明明修改了&#xff0c;但运行结果发现总是修改前的代码结果。后来发现&#xff0c;是代码修改后必须保存&#xff0c;再点运行。这个功能明显不合适&#xff0c;所以需要更改MyEclipse的配置。红框是修改后的结果。 转载于:ht…

PLSQL中INDEX BY TABLE 的 prior 和 next 操作学习

开始 --INDEX BY Table SET SERVEROUTPUT ON;DECLARETYPE enm_tab_type IS TABLE OFemp.ename%TYPEINDEX BY BINARY_INTEGER;enm_table enm_tab_type; BEGINenm_table(1):1001;enm_table(2):1002;enm_table(3):1003;enm_table(4):1004;enm_table(6):1006;dbms_output.put_line(…

【深度学习torch——error】——“xxx.pt is a zip archive(did you mean to use torch.jit.load()?)

这个问题是在进行权重文件加载进行预测的时候发生的&#xff0c;原因其实就是torch版本不对 我是用的工作站训练使用的是torch1.7.0&#xff0c;然后用自己的电脑进行预测&#xff0c;就报错了&#xff0c;原因就是自己的电脑是torch1.2.0版本的 因为在1.6版本以上的模型改变…

ABB 机器人 IRBP系列转台的一段代码注释

PROC IndexToStn1() //检测变位机状态 并设置要运行到的角度位置 并对不同的GetNextPartAdv返回值情况 进行处理 VAR bool bActive;VAR jointtarget jtCurrent; //声明一个位置变量IF (NOT bInterchCalib1) CalibIntch1; ! reset inpo…

如何写一个bootloader

声明&#xff1a;本文为学习Codeproject文章的个人总结性文章&#xff0c; 原文&#xff1a;http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part 本人开发环境&#xff1a; 操作系统&#xff1a;Ubuntu 32位&#xff08;64位的会有push…