Ebnf – 这是 LL(1) 语法吗?

2023-11-23

我发现了以下内容EBNF在维基百科上,描述了 EBNF:

letter = "A" | "B" | "C" | "D" | "E" | "F" | "G"
   | "H" | "I" | "J" | "K" | "L" | "M" | "N"
   | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
   | "V" | "W" | "X" | "Y" | "Z" ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
symbol = "[" | "]" | "{" | "}" | "(" | ")" | "<" | ">"
   | "'" | '"' | "=" | "|" | "." | "," | ";" ;
character = letter | digit | symbol | "_" ;

identifier = letter , { letter | digit | "_" } ;
terminal = "'" , character , { character } , "'" 
     | '"' , character , { character } , '"' ;

lhs = identifier ;
rhs = identifier
 | terminal
 | "[" , rhs , "]"
 | "{" , rhs , "}"
 | "(" , rhs , ")"
 | rhs , "|" , rhs
 | rhs , "," , rhs ;

rule = lhs , "=" , rhs , ";" ;
grammar = { rule } ;

现在,由于我对解析器和语法的了解有限,我不知道这是否是 LL(1) 语法。我尝试为它编写一个解析器,但是在尝试读取 rhs 时失败,它再次读取自身,再次读取自身,oh, 你说对了...

  • 它是 LL(1) 语法吗?
  • 如果不是,如何将其变成一个(可能?)?

引用的维基百科摘录不是 EBNF 的正确 EBNF 语法。它也不是左可解析的:事实上,它是不明确的,所以它根本不是明确可解析的。

一般来说,条款LL(k) and LR(k)(以及许多其他此类术语)适用于上下文无关语法 (CFG)(以及,通过扩展,这些语法生成的语言)。 EBNF 不是描述 CFG 的形式主义。它被设计为描述上下文无关语言的形式主义,因此应该可以从给定的 EBNF 语法创建 CFG(但请参见注释 1),但 EBNF 语法规则和单个CFG 中的生产。

也就是说,您通常可以使用一些标准转换直接创建 CFG。例如:

{ ... }

可以用生成的非终结符 M'' 替换,并添加以下产生式:(ε是空字符串)

M'  → ...
M'' → ε
M'' → M' M''

上述变换没有引入左递归,因此没有人为地使原始文法非LL(1)。

引用的语法[注2]中最重要的错误是模糊的EBNF规则:

rhs = identifier
    | terminal
    | "[" , rhs , "]"
    | "{" , rhs , "}"
    | "(" , rhs , ")"
    | rhs , "|" , rhs
    | rhs , "," , rhs
    ;

它也是左递归的,因此它不对应于 LL(1) CFG。但更重要的是,它并不表明结合性或优先级| and ,运营商。 (从语义上讲,这些运算符没有定义的结合性,但语法仍应指定结合性;否则,不可能明确地创建解析树。两个运算符之间的优先级在语义上很重要。)

一套更好的规则是:

primary = identifier
        | terminal
        | "[" , rhs , "]"
        | "{" , rhs , "}"
        | "(" , rhs , ")"
        ;
factor  = primary , { "|" , primary } ;
rhs     = factor ,  { "," , factor } ;

这仍然过于简单化,但它涵盖了大量用例。它既不是二义性的,也不是左递归的。 [3]


Notes

  1. 不过,注释中指定的语法约束可能不容易转化为 CFG。例如,ISO标准EBNF对EBNF定义了非终结符“语法异常”,如下:

    syntactic exception =
       ? a syntactic-factor that could be replaced
         by a syntactic-factor containing no
         meta-identifiers
       ?


    上述文本的目的是将异常限制为常规语言。这很重要,因为两种上下文无关语言之间的设定差异不一定是上下文无关的,而上下文无关语言和常规语言之间的差异可以证明是上下文无关的。讽刺的是,描述这种限制的“特殊序列”不能表达为上下文无关语法,因为它依赖于定义元标识符。 (如果它说“一个不包含元标识符的语法因素”,那么在不诉诸特殊序列的情况下就很容易编写,但显然这不是意图。)

  2. 维基百科摘录中还有另一个重要错误。它将两种类型的带引号的字符串定义为具有相同的主体,但这是不正确的;双引号字符串不能包含双引号字符,单引号字符串不能包含单引号字符。所以使用标识符character这两个定义都是不正确的。

  3. 正式的 EBNF 语法允许primary为空。我省略了它,因为通常不需要它。

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

Ebnf – 这是 LL(1) 语法吗? 的相关文章

  • Gson解析没有键值对的字符串

    我正在尝试使用 Gson 库解析字符串 但没有成功 这是我的字符串 1 816513 52 5487566 1 8164913 52 548824 此示例中的问题是没有键值对 我查看了其他示例 但它们都有键值对 看起来不像我的问题 我的解决
  • 解析日期字符串

    我在 post 变量中有这个字符串 03 21 2011 我需要通过php解析它并将其转换成这种格式 2011 03 21 我正在使用 php 我需要这种格式 以便我可以运行此查询 SELECT prospect as Prospect c
  • C 或 C++ 中是否有轻量级的多部分/表单数据解析器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑将多部分表单数据解析集成到 Web 服务器模块中 以便可以减轻后端 Web 应用程序 通常用动
  • 我应该在哪里划清词法分析器和解析器之间的界限?

    我正在为 IMAP 协议编写一个词法分析器 用于教育目的 但我很困惑应该在词法分析器和解析器之间划清界限 以 IMAP 服务器响应为例 FLAGS Answered Deleted 该响应的正式语法定义如下 mailbox data FLA
  • VBA:访问 JSON

    我正在处理 VBA 投影 但不确定如何访问此 JSON 中的 id 应该将 players 设置为什么才能在循环中获取 id 我已经用更多代码更新了问题 JSON event games players id 182759 Code Pri
  • 分析 ELF 部分和符号大小的工具

    我需要一种方法来分析 ARM 的 GCC 编译器的输出文件 我正在为裸机进行编译 并且我非常关心大小 我可以用arm none eabi objdump由交叉编译器提供 但如果存在用于此任务的工具 则解析输出并不是我渴望做的事情 您知道存在
  • 从 csv 中读取 pandas 数据帧,以非固定标头开始

    我有许多数据文件是由我的实验室中使用的一些相当黑客的脚本生成的 该脚本非常有趣 因为它在标头之前附加的行数因文件而异 尽管它们具有相同的格式并具有相同的标头 我正在编写一个批处理来将所有这些文件处理为数据帧 如果我不知道位置 如何让 pan
  • 从 XML 构建树结构的速度很慢

    我正在将 XML 文档解析为我自己的结构 但对于大型输入来说构建它非常慢 是否有更好的方法来做到这一点 public static DomTree
  • 如何在Java中有效地读取由大量小项目组成的大型XML文件?

    我有一个很大的 XML 文件 其中包含相对固定大小的项目 即
  • 如何在 powershell 中使用正则表达式选择“catch”代码块?

    我正在尝试分析多个目录中的大量 powershell 脚本 并且希望将任何 Catch 代码块拉入列表 变量中 我正在尝试编写一个正则表达式来选择以下格式的任何块 Catch write Host Function MyInvocation
  • 使用 Javascript 解析文本

    我正在尝试使用 Javascript 来解析在文本框中输入的文本 这将结合各种用户生成的变量来创建随机活动 看看这个例子可能更有意义 一些示例输入可能是 Activity Home Out Home Read book for time C
  • Parse::RecDescent 语法未按预期工作

    我所能做的就是 STRING PARAMS VARIABLE 和 FUNCNAME FUNCTION 似乎有问题 但我就是看不到它 use strict use Parse RecDescent RD ERRORS 1 Make sure
  • 调用了 numberOfRowsInSection 但未调用 cellForRowAtIndexPath

    在我的表视图中节中的行数被调用两次但是cellForRowAtIndexPath不叫 我想在 tableView 中显示 Facebook 好友列表 如果 cellForRowAtIndexPath 调用我的问题就解决了 我在这里的数组中得
  • iOS 解析如何通过 URL 下载文件

    我正在将 parse 用于我的聊天应用程序 当我上传文件时 我保留该 url 并将该 url 发送给其他用户 然后其他用户可以通过该 URL 下载文件 这是我上传文件的代码 void uploadBlob NSData blob fileN
  • 如何在 Azure 逻辑应用中解析 Excel 电子表格

    我需要使用 Azure 逻辑应用从 Excel 电子表格中解析和提取列信息 我已经为我的逻辑应用程序设置了从 Outlook 检索最新未读电子邮件的功能 此外 我的逻辑应用程序执行 FOR EACH 来读取所有附件 来自未读电子邮件 并确保
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • Magento - 将特定父类别的子类别列为链接

    我是 php 的初学者 并且一直试图将一个父类别的子类别作为链接调用 我得到了这个 它调出了 getName 但 getUrl 根本没有返回任何 URL 输出代码只是 li a href name of sub a li
  • 使用多个可选模式时顺序的重要性

    可选模式的顺序如何DateTimeFormatter影响解析操作吗 我正在运行这个程序 想知道为什么最后一行抛出异常而不是前三行 public static void main String args String p1 EEEE E dd
  • iOS 中的 CSV 逐行解析

    我正在 Objective c 中解析 CSV 文件 该文件包含如下内容 line 40 Rising searches line 41 nabi avc Breakout line 42 stonewall 700 line 43 med
  • C 的二进制流解析库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您能推荐一个经过验证的 C 二进制流解析库吗 如果它能像 C 语言所允许的那样具有声明性 那就太好了

随机推荐

  • 如何获取android中所有非系统应用程序的列表

    我正在开发一个应用程序 我想在其中获取所有非系统应用程序的列表 这是我的代码部分 TextView tv new TextView this this setContentView tv ActivityManager actvityMan
  • 在 ARM 上的 Linux 中写入和读取内存映射设备寄存器

    我正在尝试按照以下步骤读取和写入 ARM9 SAM9X25 上的寄存器 http infocenter arm com help index jsp topic com arm doc faqs ka3750 html我以以下代码结束 in
  • 在代理上启用 ssl 后,服务器发送的事件停止工作

    我在他面前做了一个基于Tomcat和Nginx的Web项目 必须努力工作才能使其无错误地运行 但是 当我将 ssl 添加到 nginx 时 停止工作的服务器发送事件 如果我直接访问后端服务器 它可以工作 所以 nginx 的某个地方有问题
  • 返回 `p->first` 和 `p->second` 的 C++ 函数对象

    是否有一个内置函数对象返回p gt first and p gt second 这样我就可以愉快地写作了 transform m begin m end back inserter keys get first transform m be
  • 在android中使用OpenCV进行人脸识别?

    我能够使用 open cv 检测人脸 但我不知道如何处理人脸识别 我用谷歌搜索了很多 但没有找到任何可以指导我的文章或博客 有人可以帮我在android上开发人脸识别应用程序吗 您始终可以使用 JavaCV 它是本机 OpenCV 函数的一
  • 如何在Matlab中定义结构体

    我知道结构可以通过多种方式定义 例如 向变量添加字段 p color red 2 p color green 4 p color blue 7 通过赋值定义标量结构 S struct a 0 b 1 c 2 我想要做的是创建一个结构定义 如
  • 使用 Expression[] 调用 (params object[])

    我正在尝试从 Linq Expression 树中调用 String Format 这是一个简单的例子 var format Expression Constant 0 1 var company Expression Property i
  • MySQL 错误 1093 - 无法在 FROM 子句中指定更新的目标表

    我有一张桌子story category在我的数据库中 条目已损坏 下一个查询返回损坏的条目 SELECT FROM story category WHERE category id NOT IN SELECT DISTINCT categ
  • 在 matplotlib 标签中添加下标文本

    这是我的第一个问题 我是 python 菜鸟 所以可能还会有更多后续 我想用 matplotlib 创建一个图形 在标签中 我想包含一个化学式 其中涉及下标 我认为同样适用于上标 无论如何 我不知道标签应该是什么样子 import nump
  • 从烧瓶中的 before_request() 返回

    我是 Flask 的新手 目前正在将现有的 WSGI 应用程序转换为通过 Flask 运行 从长远来看 这会让生活变得更轻松 所有请求都 POST 到特定路由 但是当前应用程序在执行路由之前检查发布数据 以查看是否需要运行请求 即发布数据中
  • 图像的亮度和模糊度之间的关系

    我想知道是否有人可以解释亮度 或强度 和图像模糊度之间的关系 我想使用强度作为参数对模糊图像进行过滤排名 检查频域中的强度级别 对图像进行 FFT 如果频率高 图像就不会模糊 如果所有强度都处于低频 则图像会模糊 或者 计算图像的拉普拉斯梯
  • “登录超时”设置和功能的原因是什么?

    如果应用程序将用户重定向到 Keycloak 登录页面 并且该页面停留的时间超过 登录超时 默认 5 分钟 那么当用户输入用户名和密码 而不是登录 时 她会看到以下内容 您登录的时间太长 登录过程从头开始 为了避免这种情况 可以将 领域设置
  • 无法在QT编辑器中创建调试引擎

    我最近安装了基于 Qt 5 12 0 的 Qt Creator 4 8 0 并对其进行了如下图所示的配置 但是 我还没有成功启动调试器 可以看出 调试器已针对我现在正在使用的该套件正确设置 有什么解决办法吗 Thanks 哇 我找到了 在
  • 如何在 Visual Studio 中将 C++ 代码移植到 C++/CLI?

    我有一个用本机 C 编写的应用程序 我想在 NET 虚拟机上运行它 我正在考虑使用 Visual Studio 2008 编译器将 C 代码重新编译为 C CLI 遗憾的是 我没有找到任何有关如何执行此操作的文档 因此我的问题是 这实际上有
  • Android 使用 Zxing 生成二维码和条形码

    使用zxing生成二维码的代码是 它需要字符串数据和imageview这很好用 private void generateQRCode general String data ImageView img throws WriterExcep
  • 将 RGB 颜色值转换为十进制

    如何将 RGB 颜色值转换为纯十进制 所以我有 RGB 255 255 255 是白色其十进制等效值为 16777215 我试过认为这可能只是 var dec r g b but this doesn t work 虽然那不起作用 有人知道
  • 使用实时数据创建闪亮的应用程序

    我正在尝试创建一个闪亮的应用程序来显示实时收集的数据 为此我正在使用invalidateLater 5000 session 定期更新 R 中的数据 这是我的轮廓server R file library shiny library mag
  • 如何使用 BASIC 身份验证从网站注销用户?

    如果用户使用基本身份验证 是否可以从网站注销用户 杀死会话是不够的 因为一旦用户通过身份验证 每个请求都包含登录信息 因此用户下次使用相同的凭据访问站点时会自动登录 到目前为止唯一的解决方案是关闭浏览器 但从可用性的角度来看这是不可接受的
  • 如何让 VBO 使用 Python 和 PyOpenGL

    以下 Python 程序应在窗口的右上象限绘制一个白色三角形 import pygame from OpenGL GL import from ctypes import pygame init screen pygame display
  • Ebnf – 这是 LL(1) 语法吗?

    我发现了以下内容EBNF在维基百科上 描述了 EBNF letter A B C D E F G H I J K L M N O P Q R S T U V W X Y Z digit 0 1 2 3 4 5 6 7 8 9 symbol