LL(1) 不能有歧义

2023-12-26

如何证明 LL(1) 文法不能是二义性的?

我知道什么是二义性语法,但无法证明上述定理/引理。


这是我的校样初稿。它可能需要一些微调,但我认为它涵盖了所有情况。我认为许多解决方案都是可能的。这是一个直接的证明。

(旁注:遗憾的是,SO 不支持数学,例如 LaTeX。)

Proof

设 T 和 N 为终结符号和非终结符号的集合。

让下面的内容保持不变

MaybeEmpty(s) = true <=> s ->* empty
First(s) = X containing all x for which there exists Y such that s ->* xY
Follow(A) = X containing all x for which there exists Y,Z such that S ->* YAxZ

请注意,如果以下对每对产生式 A -> B 和 A -> C 成立,则语法为 LL(1):

1. (not MaybeEmpty(B)) or (not MaybeEmpty(C))
2. (First(B) intersect First(C)) = empty
3. MaybeEmpty(C) => (First(B) intersect Follow(A)) = empty

考虑一种语言为 LL(1),A -> B and A -> C。 也就是说,存在一些终端 TZ 字符串,它允许通过不同的解析树进行多个推导。

假设左导数达到S ->* TAY ->* TZ。下一步可能是TAY -> TBY, or TAY -> TCY。 因此,如果两者都存在,则语言是有歧义的BY ->* Z and CY ->* Z。 (请注意,由于 A 是任意非终结符,因此如果不存在这种情况,则该语言是明确的。)

情况 1:Z = 空

根据 LL(1) 语法的规则 1,最多 B 和 C 之一可以导出空(非二义情况)。

情况 2:Z 非空,并且 B 和 C 都不派生为空

根据 LL(1) 语法的规则 2,最多 B 和 C 之一可以允许进一步推导,因为 Z 的前导终结符不能同时存在于两者中First(B) and First(C)(不含糊的情况)。

情况 3:Z 非空,并且MaybeEmpty(B) or MaybeEmpty(C)

请注意,根据 LL(1) 语法的规则 1,B 和 C 不能同时导出空值。因此假设MaybeEmpty(C)是真的。

这给出了两个子情况。

情况3a:CY -> Y;和情况 3b:CY ->* DY,其中 D 不为空。

在 3a 中我们必须选择BY ->* Z and CY -> Y ->* Z,但请注意First(Y) subset-of Follow(A)。自从Follow(A)不相交First(B),只能进行一种推导(无二义性)。

在 3b 中我们必须选择BY ->* Z and CY ->* DY ->* Z,但请注意First(D) subset-of First(C)。自从First(C)不相交First(B),只能进行一种推导(无二义性)。

因此,在每种情况下,推导只能通过可用的产生式之一来扩展。因此语法并无二义性。

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

LL(1) 不能有歧义 的相关文章

  • 使用 Eclipse 创建 java 可执行文件

    这完全是一个新手问题 我在 Ubuntu 上运行 Eclipse 我创建了一个测试项目 我想将其编译为可执行文件 Linux 相当于 Windows exe 文件 这是我的程序的内容 public class MyTest public s
  • 在应用程序中嵌入 C++ 编译器

    着色器不是很酷吗 您可以只输入一个纯字符串 只要它是有效的源 它就会编译 链接和执行 我想知道是否有一种方法可以将 GCC 嵌入到用户应用程序中 以便它 自给自足 例如具有编译与其自身兼容的本机二进制文件的内部功能 到目前为止 我一直在从应
  • 在 Xcode 4 中编译 Java

    我知道这个问题已经流传了很长时间 Xcode 4 中的 Java 我不需要任何建议 Eclipse Netbeans 例如 我只想在 XCode4 而不是 3 中编译一些简单的 Java 代码 我设法创建了一个文件 正如预期的那样 语法和一
  • 不清楚链接器的工作

    我在windows上使用C语言 这个问题以前是程序中的标识符会发生什么情况 https stackoverflow com questions 1986549 what happens to identifiers in a program
  • ANTLR“无法启动调试器。等待连接到远程解析器超时。”

    我在 AntlrWorks 中运行的 ANTLR 语法之一抛出 无法启动调试器 等待连接到远程解析器超时 过去 此消息通常会消失 但此消息会持续存在 在搜索 ANTLR 列表时 例如http www antlr org pipermail
  • 无意中使用 = 而不是 ==

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 看起来 if x y 代替 if x y 是许多罪恶的根源 为什么不all编译器将其标记
  • 使用 Sethi-Ullman 算法的表达式的代码生成器

    Give a AST tree http en wikipedia org wiki Abstract syntax tree 我想生成一种类似汇编的语言 我正在尝试使用塞西 乌尔曼 http en wikipedia org wiki S
  • [“03C0”]如何匹配附件P中的语法?

    我正在编写一个工具来使用 2005 年附录 P 中提供的语法来解析 Ada 源文件 通过下面的代码 我知道 03C0 代表 希腊字母Pi 但它是合法的变量名吗 01 package Ada Numerics is 02 Pi constan
  • 被调用的函数在被调用后如何返回给调用者?

    我读到 当程序进行函数调用时 被调用的函数必须知道如何返回其调用者 我的问题是 被调用的函数如何知道如何返回其调用者 是否有一种机制通过编译器在幕后工作 编译器遵循特定的 调用约定 该约定定义为您所针对的 ABI 的一部分 该调用约定将包括
  • 如何在代码生成过程中简化包含变量的 C 风格算术表达式?

    我正在尝试优化编译器中的表达式求值 算术表达式都是C风格的 并且它们可以包含变量 我希望尽可能简化表达 例如 3 100 A B 100 3 100可以简化为409 300 A B 主要取决于分配律 结合律和交换律 我遇到的主要困难是如何将
  • 如何从java程序中编译.java文件[重复]

    这个问题在这里已经有答案了 可能的重复 从 Java 内部编译外部 java 文件 https stackoverflow com questions 10889186 compiling external java files from
  • 函数内的静态变量如何工作?

    在下面的代码中 int count static int n 5 n n 1 return n 变量n仅在第一次调用该函数时实例化一次 应该有一个标志或其他东西 所以它只初始化变量一次 我试图查看 gcc 生成的汇编代码 但没有任何线索 编
  • 向 Java 类添加编程注释

    使用示例 我想在类字段上添加一个自定义注释 MyContainer 然后在所有此类字段上自动添加相关的 Hibernate 注释 取决于字段类型和属性 另外 我需要向类添加 JAXB XmlType 注释 并使类型名称基于类名称 我还想根据
  • 最好的 C++ 编译器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 实现词法分析器时,DFA 与正则表达式?

    我刚刚学习如何编写编译器 所以如果我有任何错误的说法 请纠正我 当人们可以简单地使用正则表达式时 为什么还要在代码中实现 DFA goto 语句 表驱动实现 据我了解 词法分析器接收一串字符并生成一个标记列表 这些标记在语言的语法定义中是终
  • TypeScript 编译错误 TS5037:除非提供“--module”标志,否则无法编译外部模块

    无法编译任何 TS node js 项目 包括示例中列出的项目 http typescript codeplex com sourcecontrol latest samples imageboard README txt http typ
  • 我收到此警告: com.sun.org.apache.xml.internal.serialize.OutputFormat 是 Sun 专有 API,可能会在未来版本中删除

    我的代码是 OutputFormat wOf new OutputFormat XML ISO 8859 1 true 帮我解决这个警告 提前致谢 一种解决方案是不使用该类 另一种解决方案是忽略该警告 看看这个类 我怀疑这是唯一可行的解 决
  • Flash Builder 条件编译变量

    我正在使用 Flash Builder 4 5 并且我想在调试和发布版本之间使用条件编译 我了解如何使用条件编译以及如何定义编译器常量 我需要的是 IDE 在调试和发布版本之间设置的预定义常量 一种在调试和发布版本之间为编译器指定不同参数的
  • 如何通过命令行将Flash .fla编译为.swf? [复制]

    这个问题在这里已经有答案了 如何在基于 Windows 的操作系统上通过命令行将 Flash fla 文件编译为 swf 需要安装的命令行工具就可以了 谁能建议我该怎么做 以直接的方式 谢谢 您可以使用JSFL为 Flash IDE 编写脚
  • 当参数类型不明确时,编译器如何选择调用哪个方法?

    我有以下代码 TestMethod public void TestFoo Foo null private void Foo object bar Console WriteLine Foo object private void Foo

随机推荐

  • 访问同一包中的私有内部类

    我有两个编译单元 public class OuterClass private static class InnerClass public String test return testing123 public static void
  • 应用内购买:动态添加非消耗品

    我正在开发一个应用程序 用户可以在其中购买数字地图 图表等 我想将这些包含在应用内购买中 问题是我事先不知道会有多少图表 因为我是从网络的另一个来源获取它们的 可能有数百个 我有一个服务器定期从该源获取图表并将其存储在本地 未来可能会出现新
  • Azure CosmosDB:存储过程根据查询删除文档

    目标是输入一个简单的字符串查询 例如 SELECT FROM c WHERE c deviceId device1 并且所有生成的获取文档都需要删除 我发现了关于使用存储过程执行此操作的非常旧的帖子 但我无法让它与 新 用户界面一起正常工作
  • 如何使用 IPython 表示图形

    最近我发现IPython notebook这是一个强大的工具 作为一名 IT 学生 我一直在寻找一种用 Python 表示图形的方法 例如 我想知道是否有一个图书馆 例如numpy or matplotlib 从中可以得出 1 3 2 2
  • JPA 中的瞬态字段和查询中的设置

    我们如何从选择查询中加载 JPA 中的瞬态字段 例如我有这个查询 SELECT table1 SELECT SUM field from table2 WHERE theField table1 flag as total FROM tab
  • 为什么 C# 中某些迭代器比其他迭代器更快?

    有些迭代器速度更快 我发现这一点是因为我收到鲍勃 塔博尔 Bob Tabor 的来信9频道 http channel9 msdn com 永远不要复制和粘贴 我习惯于这样做来设置数组值 testArray 0 0 testArray 1 1
  • 如何在行为测试.feature 文件的示例表中使用管道字符?

    我有一个行为场景大纲 我需要使用管道字符 作为示例表中的单元格值 但我不知道如何转义这个字符 以免被视为列分隔符 我越来越Malformed table当我尝试使用时出错 顺序 据我所知 从 1 2 5 版本 发布时的当前版本 开始 不可能
  • 如何在函数中编写函数(list_map)

    你好 我最近问了一些关于C中链表的问题 链接是在这里找到的 https stackoverflow com questions 2106691 c issue cant figure how to assign pointer to beg
  • 何时以及为何使用一组 Executor

    我一直在阅读 Android 文档中有关 Executor 的内容 如果我理解正确的话 它用于多线程管理 并且它会为您完成一些工作 例如在需要时生成新线程 或者您可以选择自己管理事情 在下面的示例中 使用一组执行器而不是一个执行器 所以它就
  • 如何在Python中更新字典中键的值?

    我有一本代表书店的字典 键代表书名 值代表当前书籍的份数 当书籍从商店出售时 书籍的册数必须减少 我编写了一个代码来减少已售书籍的副本数量 但是在更新后打印词典时 我得到的是初始词典 而不是更新后的词典 n input Enter numb
  • 使用端口 Ping ip,不返回任何内容,PHP/APACHE

    我正在使用以下命令来获取 IP 或域的状态 我如何 ping 端口 80 提供端口后 根本不返回任何内容 尝试通过 80 和 80 将其添加到末尾 任何想法表示赞赏 如果您想要了解给定主机是否接受端口 80 上的 TCP 连接 您可以这样做
  • Android Studio 找不到 AndroidManifest.xml

    我正在使用 Android Studio v0 2 x 我刚刚创建了一个具有默认设置的新应用程序 File gt 新项目 gt 然后一步步进行 当我构建它时 它失败了 日志是 Android 源生成器 MyApplication Andro
  • Maven 版本控制和发布 GIT 存储库

    我在一个 GIT 存储库中有多个 Maven 项目 我想对 Maven 项目执行单独的发布 将发布版本推送到 Nexus 跳过标记并增加快照和提交 使用的 Maven 发布目标 release clean release prepare r
  • Android - 无法打开 zip 存档

    我正在从网络下载 apk 文件并将其存储到 Context getCacheDir 中 我正在通过 HttpURLConnection 下载文件 我实际上并没有询问代码 它完全正常工作 所以我不会将其发布在这里 我成功启动下载 文件被下载到
  • 将频率表合并到单个数据框中

    我有一个列表 其中每个列表项都是一个词频表 该表是通过在不同的示例文本上使用 table 而派生的 因此 每个表的长度不同 我现在想将列表转换为单个数据框 其中每列都是一个单词 每行都是示例文本 这是我的数据的虚拟示例 t1 lt tabl
  • RSpec 错误“未初始化常量 FactoryGirl(名称错误)”

    我尝试运行 RSpec 测试 rspec comments rb 但不断收到相同的错误 见标题 在有人问之前我已经添加了require factory girl到spec helper rb 的内容spec factories commen
  • 为什么我无法在 Raspberry Pi 上安装任何带有 GHC 7.8.4 的软件包?

    根据这个帖子 http www reddit com r haskell comments 35bw0b at last debian unstable has working arm ghci and 终于有一个支持模板 haskell
  • ASP.Net MVC 3.0 Ajax.ActionLink Onbegin 函数 true 执行操作?

    我有一个 Ajax Action 链接 它将调用一个 action 方法 在我的 Ajax 选项中 我调用了一个验证函数 如果这个函数返回 true 那么只有我想要执行此操作 不知道如何完成此操作 我的 Ajax ActionLink Aj
  • android 未加载广告时使用空间

    我正在尝试在我的应用程序中添加 admob 广告 但是当我没有连接到互联网时 那里的空间太空了 我希望添加在加载后出现 直到广告空间应由其余元素利用 该怎么办 我的活动文件如下 MainActivity java package com t
  • LL(1) 不能有歧义

    如何证明 LL 1 文法不能是二义性的 我知道什么是二义性语法 但无法证明上述定理 引理 这是我的校样初稿 它可能需要一些微调 但我认为它涵盖了所有情况 我认为许多解决方案都是可能的 这是一个直接的证明 旁注 遗憾的是 SO 不支持数学 例