bnf - 这三个非终结符(expr、term 和 factor)在这个整数算术表达式的 BNF 中是什么意思?
问题描述
这里有一套整数算术表达式的标准BNF,我想知道的是这个BNF是怎么来的?以及为什么我们需要定义以下三种非终结符(“expr”、“term”和“因素”)?
expr -> term [ ('+' | '-') term ]*
term -> factor [ ('*' | '/') factor ]*
factor -> '(' expr ')' | identifier | number
解决方案
从技术上讲,非终端的名称没有任何意义,至少对解析算法没有任何意义。就像程序中的变量名称一样,它们的唯一目的是为人类读者提供一些线索。
在这种情况下,名称大多只是一种约定,松散地基于数学术语。例如,如果我们写3 * 7
,那么我们会说 3 和 7 是结果 (21) 的因数。没有真正的通用词3 + 7
,称它们为“术语”可能比“总和”更容易。
我们把它们分开的原因是我们想描述常见的用法,意思是“和a + b * c
的总和”。换句话说,“加号”或“减号”运算符的参数可以是乘积,但“倍”或“除”运算符的参数不能是和,除非它被括在括号中。(如语法所示,括号中的任何表达式都是“因素”。)a
b * c
推荐阅读
- python - 使用 python 检查 datetime 是否有日期名称或时区
- android - 我们如何从PC的浏览器向android设备发送消息(都连接到同一网络)
- javascript - 编辑表单时如何显示数据库中的选定值?
- python - 我想过滤行并给我第三部分(数据)我该怎么办?
- c - 如何解决运行时错误问题,如“有符号整数溢出:2147483644 + 4 不能以'int'类型表示”?
- android - 如何将 TextureView 保存为视频文件或 Mp4 文件?
- python-3.x - asyncio.Queue() 的目的是什么,如何正确使用它?
- sql - '' 不是有效的浮点数
- c# - 在c#中使用microsoft graphclient服务下载邮件并将邮件保存为.eml格式
- nginx - Nginx 的主页不允许超过 350 个并发请求