乔姆斯基语言类型

2024-02-06

我试图理解四种不同的乔姆斯基语言类型,但我发现的定义对我来说没有任何意义。我知道类型 0 是自由语法,类型 1 是上下文相关的,类型 2 是上下文无关的,而类型 3 是常规的。那么,有人可以解释一下这一点并将其放在上下文中吗,谢谢。


语言是属于该语言的单词的集合。然而,很多时候,不必列出该语言中的每个单词,而是指定生成该语言的单词(并且仅生成这些单词)的一组规则来识别所讨论的语言是什么就足够了。

Note:可以有不止一组描述同一种语言的规则。

一般来说,对规则的限制越多,语言的表达能力越差(从规则中可以生成的单词越少),但更容易识别单词是否属于规则指定的语言。由于后者,我们希望识别对其规则限制最多的语言,这些语言仍然允许我们生成相同的语言。

关于规则的几句话:一般来说,您用四个项目(又称四元组)来描述正式语言:

  1. 的集合非终结符 (N)
  2. 的集合终端符号 (T)
  3. 的集合生产规则 (P)
  4. The 开始符号 (S)

终止符号(又称字母)是语言单词组成的符号,通常是小写英文字母的子集(例如“a”、“b”、“c”)

非终结符标记单词生成中的中间状态,指示可能的变换仍然可以应用于中间“单词”。终结符号和非终结符号之间没有重叠(即两个集合的交集为空)。用于非终结符的符号通常是大写英文字母的子集(例如“A”、“B”、“C”)

这些规则表示一系列终结符和非终结符的可能变换。它们的形式为:左侧 -> 右侧,其中左侧和右侧均由一系列终结符和非终结符组成。示例规则:aBc -> cBa,这意味着一系列符号“aBc”(作为中间“单词”的一部分)可以在单词生成期间被系列“cBa”替换。

起始符号是专用的非终结符号(通常用 S 表示),表示单词生成的“根”或“开始”,即在单词生成系列中应用的第一个规则始终具有起始符号作为其左侧。

当所有非终结符都被终结符替换时,单词的生成就成功完成了(因此最终的“中间单词”仅由终结符组成,这表明我们到达了所讨论语言的单词)。

当并非所有非终结符都已被终结符替换,但没有可应用于当前中间“词”的产生规则时,词的生成不成功。在这种情况下,生成必须从起始符号重新开始,遵循产生式规则应用的不同路径。

Example:

L={T, N, P, S},

where

T={a,b,c}

N={A,B,C,S}

P={S->A, S->AB, S->BC, A->a, B->bb, C->ccc}

它表示三个单词的语言:“a”、“abb”和“bbccc”

规则应用示例:

S->AB->aB->abb

其中我们 1) 从起始符号 (S) 开始,2) 应用第二条规则(用 AB 替换 S),3) 应用第四条规则(用 a 替换 A),4) 应用第五条规则(用 bb 替换 B) )。由于生成的“abb”中没有非终结符,因此它是该语言的一个单词。

当一般谈论规则时,希腊符号alpha, beta, gamma等表示(可能为空的)一系列终结符+非终结符;希腊字母epsilon表示空字符串(即空的符号系列)。

中的四种不同类型乔姆斯基层次结构描述不同表达能力的语法(规则的不同限制)。

  • 生成的语言Type 0 (or 无限制) 语法最具表现力(限制较少)。的集合递归可枚举languages 包含可以使用图灵机(基本上是计算机)生成的语言。这意味着,如果您有一种比这种类型更具表现力的语言(例如英语),您就无法编写一个可以列出该语言的每个(且仅这些)单词的算法。这些规则有一个限制:规则的左侧不能为空(不能“突然”引入任何符号)。

  • 生成的语言Type 1 (上下文相关) 语法是上下文相关语言。这些规则有以下形式的限制:alpha A beta -> 阿尔法伽玛贝塔, where alpha and 贝塔可以是空的,并且gamma非空(例外:S->epsilon规则,仅当起始符号 S 未出现在任何规则的右侧时才允许)。这限制了规则在其左侧至少有一个非终结符,并允许它们有一个“上下文”:此规则示例中的非终结符 A 可以替换为gamma,仅当它被包围时(“在...的上下文中”)alpha and beta。规则的应用保留了上下文(即alpha and beta不会改变)。

  • 生成的语言Type 2 (上下文无关) 语法是上下文无关语言。这些规则有以下形式的限制:A ->gamma。这限制了规则在其左侧只有一个非终结符并且没有“上下文”。这本质上意味着,如果您在中间词中看到非终结符,则可以应用左侧具有该非终结符的任何规则来将其替换为右侧,无论周围环境如何非终结符的。大多数编程语言都有上下文无关的生成语法。

  • 生成的语言Type 3 (Regular) 语法是Regular语言。这些规则有以下形式的限制:A->a 或 A->aB(规则 S->epsilon如果起始符号 S 没有出现在任何规则的右侧,则允许该符号),这意味着每个非终结符必须恰好产生一个终结符(也可能产生一个非终结符)。这常用表达生成/识别这种类型的语言。

其中一些限制可以解除/修改,以保持修改后的语法具有相同的表达能力。修改后的规则可以允许其他算法识别某种语言的单词。

请注意(如前所述)一种语言通常可以由多种语法(甚至属于不同类型的语法)生成。语言族的表达能力通常等同于可以生成这些语言的最严格的语法类型的表达能力(例如,由常规(类型 3)语法生成的语言也可以由类型 2 语法生成,但是它们的表达能力能力仍然是类型 3 语法的能力)。

Examples

The 常规语法

T={a, b}

N={A,B,S}

P={S->aA, A->aA, A->aB, B->bB, B->b}

生成包含以非零数量的“a”开头,后跟非零数量的“b”的单词的语言。请注意,用常规语法来描述一种语言是不可能的,其中每个单词都由多个“a”和后跟相同数量的“b”组成。

The 上下文无关语法

T={a, b}

N={A,B,S}

P={S->ASB, A->a, B->b}

生成包含以非零数量的“a”开头,后跟相同数量的“b”的单词的语言。请注意,不可能用上下文无关语法来描述每个单词由多个“a”、后跟相同数量的“b”、后跟相同数量的“c”组成的语言。

The 上下文相关语法

T={a,b,c}

N={A,B,C,H,S}

P={S->aBC, S->aSBC, CB->HB, HB->HC, HC->BC, aB->ab, bB->bb, bC->bc, cC->cc}

生成 tha 语言,其中包含以非零数量的 'a' 开头的单词,后跟相同数量的 'b',最后是相同数量的 'c'。 H在此语法中的作用是能够将CB组合“交换”为BC组合,因此B可以聚集在左侧,而C可以​​聚集在右侧。请注意,不可能用上下文相关语法来描述单词由一系列“a”组成的语言,其中“a”的数量是素数,但可以编写生成该语言的无限制语法。

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

乔姆斯基语言类型 的相关文章

  • Swift 如何消除表达式上下文中类型参数的歧义?

    看看下面两个表达式 baz Foo
  • Raku:捕获标记的效果在“更高处”消失

    以下 Raku 脚本 usr bin env raku use v6 d grammar MyGrammar rule TOP
  • 如何确定上下文无关语法是否描述了常规语言?

    给定任意上下文无关语法 我如何检查它是否描述了常规语言 我不是在寻找考试 技巧 我正在寻找一种可以编写代码的万无一失的机械测试 如果有帮助 这里是我可能会收到的 CFG 作为输入的示例 具体来说 请注意 答案一定比仅仅寻找左递归或右递归复杂
  • SQL 是一种什么样的语言?

    SQL 是上下文无关语言还是其他类型的语言 根据https stackoverflow com a 31265136 https stackoverflow com a 31265136SQL 不是常规语言 简短的解释是每个选择查询看起来像
  • LL(1) 不能有歧义

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

    我正在读 雷布尔 维基百科页面 https en wikipedia org wiki Rebol 解析表达式是用 parse 方言编写的 与 do 方言一样 它是数据交换方言的面向表达式的子语言 与 do 方言不同 parse 方言使用表
  • 如何将三元运算符合并到优先级攀爬算法中?

    我遵循 优先级攀登 部分中给出的解释这个网页 http www engr mun ca theo Misc exp parsing htm climbing使用具有各种一元前缀和二元中缀运算符的优先级攀爬算法来实现算术求值器 我还想包括三元
  • 语法:自上而下和自下而上的区别?

    自上而下和自下而上语法有什么区别 举个例子就太好了 首先 语法本身不是自上而下或自下而上的 parser是 尽管有些语法可以被一种语法解析 但不能被另一种语法解析 从实践的角度来看 主要区别在于大多数手写解析器是自上而下的 而更大比例的机器
  • 对于给定的有限代表字符串列表,正则表达式的语法推理?

    我正在分析一个大型公共数据集 其中包含许多详细的人类可读字符串 这些字符串显然是由某些常规 在形式语言理论意义上 语法生成的 逐一查看这些字符串组以了解其中的模式并不太难 不幸的是 大约有 24 000 个独特的字符串被分为 33 个类别和
  • 寻找一种非 LL(1) 的语言?

    我最近一直在研究很多非 LL 1 的语法 其中许多可以转换为 LL 1 的语法 然而 我从未见过这样的例子明确的语言这不是 LL 1 换句话说 一种语言的任何明确语法都不是 LL 1 我也不知道如果我不小心偶然发现了一种语言 我将如何证明我
  • ANSI-C 语法 - 数组声明,如 [*] 等

    ANSI C 语法来自 link http www quut com c ANSI C grammar y html给我以下数组声明规则 1 direct declarator type qualifier list assignment
  • 如何引用语法中先前匹配的项目?

    我正在尝试解析 BibTeX 作者字段 并将其拆分为单独的作者 这将帮助我重写每个作者的姓名首字母 这是一个最小的例子 use v6 my str Rockhold Mark L and Yarwood RR and Selker John
  • 组合的解解析器/解析器生成器

    是否有一个解析器生成器也实现了相反的方向 即从相同的语法规范中解析域对象 又名漂亮打印 据我所知 ANTLR不支持这个 我已经用 Java 和 Kotlin 实现了一组可逆解析器组合器 解析器几乎是用 LL 1 风格编写的 它提供了解析方法
  • 用于计算上下文无关语法的 FIRST 和 FOLLOW 集的算法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一种算法来计算语法的 FIRST 和 FOLLOW 集 是否有一个简单的算法或简单的代码来计算这些 大多数编译器教科书和解析算法
  • 在哪里可以找到 Perl 编程语言的形式语法?

    我知道 Perl 语法是不明确的 并且它的消歧是不平凡的 有时涉及在编译阶段执行代码 http www modernperlbooks com mt 2009 08 on parsing perl 5 html 无论如何 Perl 是否有正
  • 如何使用 preg_match_all() 获取子组匹配的所有捕获? [复制]

    这个问题在这里已经有答案了 更新 注意 我想我可能正在寻找的是得到捕获一组 https stackoverflow com questions 6571106 can you retrieve multiple regex matches
  • Perl 6 规则中 .parse 锚点还是 :sigspace 首先?

    我有两个问题 我表现出的行为是否正确 如果是 它是否记录在某处 我在玩语法TOP方法 宣布为rule 它意味着字符串的开头和结尾锚点以及 sigspace grammar Number rule TOP d my strings 137 1
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 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
  • Parse::RecDescent 语法未按预期工作

    我所能做的就是 STRING PARAMS VARIABLE 和 FUNCNAME FUNCTION 似乎有问题 但我就是看不到它 use strict use Parse RecDescent RD ERRORS 1 Make sure
  • 用PLY解析python,如何编码缩进和缩进部分

    我试图用 PLY 解析 python 语言的函数定义 我遇到了与缩进相关的问题 例如 对于 for 语句 我希望能够知道块何时结束 我在这里阅读了python语法 http docs python org 2 reference gramm

随机推荐

  • IntelliJ 中的 Google Play、Drive API 示例代码

    我正在关注Android 版 Google 云端硬盘快速入门说明 https developers google com drive quickstart android并让它在 Eclipse Kepler 中工作 Juno 就是很狡猾
  • 值不能为空。参数名称:实体集

    我有一个相当标准的设置 只有 POCO 类 public class Project public int ProjectId get set public string Name get set public int ClientId g
  • 将图像拖放到画布上 (FabricJS)

    问题 我想用图像而不是canvas目的 这意味着您必须先将要添加的内容添加到画布并作为画布的一部分 然后才能添加它 这些图像实际上是网站的一部分 因此不需要做一些复杂的事情 我在这里找到的这段代码仅适用于对象而不是实际元素的情况 顺便说一句
  • 在 UITableView 中滚动时视图被替换

    我是一名 Android 开发人员 对 iOS 应用程序开发非常陌生 我正在尝试构建一个简单的聊天系统 每个单元格中只有一行数据 我正在使用自定义UIView类来生成气泡和UILabel and an UIImageView以编程方式 当我
  • Python 从键列表生成动态字典

    我确实有一个清单 如下所示 keyList1 Person Male Boy Student id 123 Name value1 Roger 如何生成可以按如下方式检索的动态字典 mydict Person Male Boy Studen
  • Bigquery - 计划存储过程不再工作

    最近 Bigquery UI 发生了变化 似乎不再可以安排存储过程自动执行 使用 UI 只是不断要求插入目标表 如果我放置一个虚拟表 则会创建计划 但是当尝试执行时只会抛出一个错误 表明在执行存储过程时我们无法拥有目标表 有人遇到这个问题并
  • SQL 注入预防 - GET_VARS

    我有一个网址 有效时将如下所示 site com page php id 12345 我试图了解我们是否容易受到 sql 注入的攻击 在这个特定的实例中 该值只能是正整数值 因为它是一个 ID 号 我们有时确实使用其他变量 可以是字母或文本
  • Groovy 中分割字符串的惯用方法

    是否有更好 更短 更好的方法来执行以下操作 filename AA BB CC DD EE FF xyz parts filename split packageName parts 0 parts 1 parts 2 parts 3 pa
  • AngularJS - 单个模板中的多个 ng-view

    我正在使用 AngularJS 构建一个动态 Web 应用程序 是否可以有多个ng view在一个模板上 你可以只拥有一个ng view 您可以通过多种方式更改其内容 ng include https docs angularjs org
  • 文件内容更改后使用 ifstream 从同一文件读取(直到 EOF)

    要求 我必须读到 EOF 16 个字节 时间 来自特定文件 以及 然后说睡5秒 现在 5秒后 当我尝试阅读时 从文件 其内容将 到那时已被附加 预期的设计必须是这样的 它从它所在的点读取 之前离开并再次扫描 内容 一次 16 个字节 直到
  • bigint 通过 PDO 截断?

    我遇到了将大整数存储在 a 中的问题BIGINT通过 PDO 在 MySQL 上列 如果我运行这个测试 number 30123456789 var dump number prints string 11 30123456789 new
  • 使用 Connect-MSOLservice 与服务主体连接

    我正在尝试使用在 AzureAD 中创建的服务主体通过 PowerShell 脚本进行连接 我成功创建了 SP 创建了密钥 还创建了自签名证书并将其与帐户关联 我知道如何使用 Connect AzureAD 但 Connect MSOLse
  • 可以使用按钮删除从项目添加的数据库条目吗?

    我正在尝试使用 Android 编程 大书呆子牧场指南 自学 Android 开发 其中一个练习 如果您熟悉这本书 请从第 14 章开始 涉及创建一个工具栏 其中包含一个项目 该项目将新条目添加到单击该项目时的数据库 一个挑战问题是删除条目
  • 使用 JGit 从 Git 检索提交消息日志

    我只想从 Git 存储库检索提交日志 其中包含您在特定存储库上完成的所有提交的消息 我找到了一些实现此目的的代码片段 并以异常结束 try FileRepositoryBuilder builder new FileRepositoryBu
  • Kivy 窗口隐藏/显示

    我是一个Python编程新手 学习让我创建一个项目 这就是我正在尝试做的事情 我想创建一个在系统托盘中运行的程序 并且 fire 是一个在后台加载的程序 在后台加载 这样我可以减少 Kivy 的启动时间 在这里和谷歌搜索后 我找不到答案 我
  • Azure ARM 角色分配不同的资源组

    我正在尝试创建一个具有 VM 的 ARM 模板 我希望 VM 具有AcrPull向位于不同资源组中的容器注册表进行角色分配 我将范围属性设置为 ACR 的 ID 我从https resources azure com https resou
  • 正则表达式 标签解析src、宽度、高度

    你可能会对这句话做出反应 H使用正则表达式进行 TML 解析是一个完全糟糕的主意 下列的this https stackoverflow com questions 1732348 regex match open tags except
  • 添加对消息的反应。 Discord.py 重写

    我正在尝试使用自定义表情符号添加对消息的反应 由于某种原因 我在网上找不到太多与此相关的内容 并且我花了过去 3000 万的时间试图找出不同的方法 到目前为止还没有任何效果 这是在齿轮内部 第一种方法 accept decline awai
  • Xcode + 删除所有断点

    有什么方法可以删除Xcode中的所有断点吗 那么有一个三步的方法 按 CMD 7 显示所有断点 在 Xcode4 中按 CMD 6 在 Xcode3 中按 CMD ALT B 使用 CMD A 选择所有断点 然后使用退格键删除它们 就像删除
  • 乔姆斯基语言类型

    我试图理解四种不同的乔姆斯基语言类型 但我发现的定义对我来说没有任何意义 我知道类型 0 是自由语法 类型 1 是上下文相关的 类型 2 是上下文无关的 而类型 3 是常规的 那么 有人可以解释一下这一点并将其放在上下文中吗 谢谢 语言是属