BNF、EBNF、ABNF:选择哪一个?

2024-03-25

我想提出一种语言语法。我读过一些关于这三个人的内容,但确实看不出有什么是一个人能做而另一个人做不到的。有什么理由使用其中一种而不是另一种吗?或者这只是一个偏好问题?


你必须考虑一下EBNF and ABNF作为扩展,可以帮助您在开发语法时更加简洁和富有表现力。

例如,考虑一个可选的非终结符,在BNF您可以使用中间符号来定义它,例如:

A        ::= OPTIONAL OTHER
OPTIONAL ::= opt_part | epsilon

当与EBNF您可以使用可选语法直接执行此操作:

A ::= [opt_part] OTHER

那么由于没有办法在 a 中表达优先级BNF对于嵌套选择,您也必须始终使用中间符号:

BNF
A ::= B C
B ::= a | b | c

EBNF
A ::= (a | b | c) C

这对于许多语法问题都是正确的。EBNF or ABNF语法,感谢语法糖,但不是正常的BNF. ABNF延伸EBNF,允许您做更复杂的事情,例如指定可以一起找到一个符号的出现次数(即4*DIGIT)

所以选择一个ABNF or an EBNF因为您的语法选择的语言将使您的工作更轻松,因为您将更具表现力,而无需在语法中填充无用的符号,这些符号无论如何都会由您的解析器生成器生成,但您不会关心它们!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BNF、EBNF、ABNF:选择哪一个? 的相关文章

  • DRY(不要重复自己)和 if 作业

    我想我忘记了一些明显的事情 但如果它验证了尽可能保持干燥的条件 我似乎找不到一种分配值的方法 一些代码来解释我的意思 a b gt 1 b c or even a a gt 1 a b 所以当然这里没什么大不了的 但是如果 a 要被方法调用
  • 索引对象点表示法给出标量属性

    当我在使用点表示法应用方法后尝试引用对象属性时 我遇到了问题 仅当我尝试索引初始对象时才会发生 classdef myclassexample properties data end methods function obj procDat
  • 解析树和语法信息

    有谁知道在哪里可以找到好的在线资源以及如何制作语法和解析树的示例 最好是介绍材料 信息是 n00b 友好的 我自己在 Google 上没有找到任何好的信息 Edit 我正在考虑理论 而不是特定的解析器软件 网上没有 不过也许你应该看看编译器
  • VIM 高亮匹配开始/结束

    我正在尝试找到一个插件 它将突出显示与 Verilog 匹配的开始 结束语句 VIM 可以使用花括号 方括号 但不能使用它的开始 结束 我希望 VIM 突出显示正确的开始到正确的结束 在我看来 最好的选择是使用 matchit 该脚本是 v
  • 确实开始了。 。 。 end while 表示“块”?

    temp 98 3 begin print Your temperature is temp to s Fahrenheit puts I think you re okay temp 0 1 end while temp lt 98 6
  • 在迭代器上使用 map()

    假设我们有一张地图 let m new Map using m values 返回一个地图迭代器 但我不能使用forEach or map 在该迭代器上并在该迭代器上实现 while 循环似乎是一种反模式 因为 ES6 提供了类似的函数ma
  • 无法使用 sqldf 对 R 中的函数使用rank()

    arm lt as data frame matrix c 1 1 1 2 2 6 7 4 9 10 ncol 2 colnames arm lt c a b 这是我在 R 中创建的数据集 现在我想对 b 列进行排名并按 a 列进行分组 无
  • Scala 中的自定义“let”表达式

    我很想拥有let构造类似于 Scala 中的 Haskell 中的构造 我尝试了几种方法 但似乎都不好 这是一些代码 object CustomLet extends App val data for i lt 1 to 1024 j lt
  • 为什么 python 对某些东西使用两个下划线? [复制]

    这个问题在这里已经有答案了 我对实际的编程语言相当陌生 Python 是我的第一个语言 我对 Linux 有点了解 足以用它找到一份暑期工作 我还在读高中 而且在工作中 我有很多空闲时间来学习 Python 不过有一件事一直困扰着我 当你有
  • 为什么此 SQL 存储过程需要创建临时表才能工作(返回结果)?

    IBM Informix 动态服务器版本 11 50 FC6 我正在开发一个小型存储过程 该过程将从表中获取名称字段并将它们解析为最多 8 个字符的 用户名 这是我正在尝试的代码 CREATE PROCEDURE build jics us
  • 为什么 jsp 会触发 PropertyNotFound?

    在JSP中编写 a b c 抛出 c PropertyNotFound 但写入
  • C# 在枚举中使用数字

    这是一个有效的枚举 public enum myEnum a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 0xff 但这不是 public enum myEnum 1a 1 2a 2 3a 3 有没有办法在枚举中使用数字 我已经
  • MATLAB 黑洞变量

    MATLAB 是否有 黑洞 或丢弃变量 假设我正在做类似的事情 rows cols size A 但我不想存储行 是否有一个 黑洞 变量可以让我发送值去死 所以任务就像 BLACKHOLE cols size A 其中 BLACKHOLE
  • 为什么使用散列而不是点来选择 Scala 类型成员?

    在 Scala 中 从类中选择类型的语法与从类中选择其他任何内容的语法不同 因为前者使用散列而不是点作为选择运算符 这是为什么 示例 如果我们有这样的课程 class Example type Foo String 为什么我们要从这样的类中
  • 带有 case OR 运算的 VB.NET select case 语句逻辑是什么?

    我正在使用一个Or https msdn microsoft com en us library 06s37a7f aspx我的案例表达式中的声明 尽管我有一个在此范围内的值 但它没有找到匹配项 为什么不 示例代码 Select Case
  • 带尖括号 (<>) 的方法

    方法名称中是否可以有尖括号 例如 class Foo ind1 Int ind2 Int var v new Foo 1 2 v 1 3 updates ind1 v lt 1 gt 4 updates ind2 真实情况显然比这更复杂 我
  • 如何在 Dart 中打印美元符号 $

    我实际上需要在 Dart 中在变量之前打印一个美元符号 例如 void main int dollars 42 print I have dollars I have 42 我希望输出为 我有 42 美元 我怎样才能做到这一点 谢谢 飞镖弦
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • 使用模板时什么时候应该使用关键字“typename”[重复]

    这个问题在这里已经有答案了 我最近一直在做一个小项目 但我无法弄清楚一些事情 我得到了一个 h 文件 其中包含一个使用类型名模板的类 那个班级里面有一个私人班级 template
  • 什么是标记结构初始化语法?

    struct file operations scull fops owner THIS MODULE llseek scull llseek read scull read write scull write ioctl scull io

随机推荐

  • 如何向特定用户发送消息 Ratchet PHP Websocket

    我正在尝试构建一个系统 用户可以在建立与 websocket 服务器的连接时订阅某个类别 然后他将开始接收该类别的更新 到目前为止 我已经与 Ratchet 合作 我能够向所有连接的客户端发送消息 但问题是我不想向所有客户端发送消息 我只想
  • 一种 O(n) 时间复杂度的算法,用于在数组中查找彼此之间差异最接近的一对 no

    我得到一个不一定已排序的整数数组 我必须找到一对 no 其彼此之间的差异与数组中任何其他对 no 相比最小 时间效率应该是O n 我很确定您无法获得解决此问题的通用线性时间算法 但是 由于您有 有界 整数 因此您可以稍微作弊并从使用基数排序
  • 如何配置python+uwsgi+nginx?

    我正在尝试使用 uwsgi nginx 运行 python 脚本 它在浏览器中导致了这个错误 uWSGI Error Python application not found In var log uwsgi app pyec loc lo
  • 如何使用 PowerShell 从“应用程序和服务日志”中读取分析性 Windows 事件?

    I use Get EventLog https learn microsoft com en us powershell module microsoft powershell management get eventlog读取事件 使用
  • 如何将十六进制字符串转换为无符号字符数组?

    例如 我有一个cstring E8 48 D8 FF FF 8B 0D 包括空格 需要转换为等效的 unsigned char 数组 0xE8 0x48 0xD8 0xFF 0xFF 0x8B 0x0D 什么是有效的方法来做到这一点 谢谢
  • 使用 tsfresh 仅选择一定数量的顶级特征

    如何使用 tsfresh 选择时间序列的前 n 个特征 我可以决定要提取的主要特征的数量吗 基于 Chaitra 的上述评论和这个答案 https stackoverflow com questions 62991201 tsfresh g
  • 应用程序在调试时不会崩溃,但在正常运行时会崩溃

    系统信息 Windows 10 技术预览版 内部版本 9926 Visual Studio 社区 2013尝试调试 美国电话电报公司 Lumia 635 Windows 10 技术预览版 适用于版本 9941 的手机 带有 Lumia Cy
  • GraphQL java以json格式发送自定义错误

    我正在一个 graphql 应用程序中工作 我必须以 json 格式发送自定义错误对象 消息 无论它是出现在 servlet 还是服务中 预期错误响应 errorCode 400 error goes here errorMessage m
  • 在Ruby中通过pid获取进程状态

    有没有办法在 Ruby 中根据 PID 获取进程的子进程状态 例如 在 Python 中 您可以执行 psutil Process pid status 我不知道有一种可移植的 ruby 方法来获取正在运行的进程的进程状态 你可以做Proc
  • 无法通过 SalesForce API (JSforce) 更新自定义日期字段

    我正在使用 Node js 应用程序中的 JSforce 库来更新机会对象上的自定义日期字段 但该字段并未更新 响应表明更新成功 并且对象上的 SystemModstamp 字段已更新 但该字段仍为空 这是我正在使用的 JSforce 调用
  • 应用程序未打开时,GCM 消息未发送?

    最近我在我的应用程序上实现了 GCM 我按照这个网站上的教程代码进行操作 http javapapers com android google cloud messaging gcm for android and push notific
  • 使用 Cloud Functions for Firebase 和 @google-cloud/storage 删除图像时出现问题

    我正在尝试在 Cloud Functions for Firebase 中创建一个脚本 该脚本将对数据库事件做出反应并删除其路径位于其中一个参数 fullPath 中的图像 这是我正在使用的代码 use strict const funct
  • 将 2D numpy 数组转换为 2D numpy 矩阵

    我有一个 python 代码 其中我必须将 2D 数组转换为 2D 矩阵 以便我可以使用它来计算逆 为此 我正在使用 numpy matrix array 但它不起作用 谁能告诉我如何将 2D 数组转换为 numpy 矩阵 该数组由所有浮点
  • 我开始使用诊断 CSS 样式表 例如http snipplr com view 6770 css diagnostics highlight deprecated html with css more http snipplr com vi
  • 将羊驼导入 React.js

    我正在尝试在 React 应用程序中使用羊驼形式 import React useEffect useRef from react import from jquery import as popper from popper js imp
  • TextView 中的行号、代码突出显示

    我正在为 Android 开发一个 IDE 它对于编辑短脚本 对文件进行快速调整可能很有用 目前我只使用一个简单的 EditText 但我想添加几个功能 例如 EditText 左侧的行编号和代码突出显示 有人对如何解决这个问题有任何建议吗
  • Laravel 4 - 容器类:共享函数和闭包逻辑

    我对这里讨论的问题有一个后续问题 Laravel 核心方法混乱 https stackoverflow com questions 15758936 laravel core method confusion 17295616 172956
  • 如何处理 SQL 中的引号 ' [重复]

    这个问题在这里已经有答案了 我有一个数据库 其中包含 John Doe 等姓名 不幸的是 其中一些姓名包含引号 例如 Keiran O Keefe 现在 当我尝试搜索此类名称时 如下所示 SELECT FROM PEOPLE WHERE S
  • 替换 WPF 入口点

    WPF定义了自己的Main 方法 我应该如何用我自己的替换它Main 通常 打开 WPF 的方法MainWindow 例如通过命令行参数添加非 WPF 脚本模式 一些示例描述了将 App xaml 的构建操作从ApplicationDefi
  • BNF、EBNF、ABNF:选择哪一个?

    我想提出一种语言语法 我读过一些关于这三个人的内容 但确实看不出有什么是一个人能做而另一个人做不到的 有什么理由使用其中一种而不是另一种吗 或者这只是一个偏好问题 你必须考虑一下EBNF and ABNF作为扩展 可以帮助您在开发语法时更加