标记和词位有什么区别?

2023-12-26

在 Aho Ullman 和 Sethi 的《Compiler Construction》一书中,给出了源程序的输入字符串被分成具有逻辑含义的字符序列,称为标记,而词位是组成标记的序列,所以什么是基本的区别吗?


Using "编译器原理、技术和工具,第二版。 http://www.pearsonhighered.com/educator/product/Compilers-Principles-Techniques-and-Tools/9780321486813.page" (世界猫) https://www.worldcat.org/title/804295189作者:Aho、Lam、Sethi 和 Ullman,又名紫龙书 http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools#Second_edition,

莱克梅页。 111

词位是源程序中的字符序列, 匹配标记的模式并由词法标识 分析器作为该令牌的实例。

令牌页。 111

令牌是由令牌名称和可选属性组成的对 价值。代币名称是一个抽象符号,代表一种 词汇单元,例如特定的关键字或输入序列 表示标识符的字符。令牌名称是输入 解析器处理的符号。

图案页。 111

模式是对标记的词位可能的形式的描述 拿。在关键字作为标记的情况下,模式只是 构成关键字的字符序列。对于标识符和一些 其他标记,模式是更复杂的结构,匹配 许多字符串。

图 3.2:代币示例第 112 页

[Token]       [Informal Description]                  [Sample Lexemes]
if            characters i, f                         if
else          characters e, l, s, e                   else
comparison    < or > or <= or >= or == or !=          <=, !=
id            letter followed by letters and digits   pi, score, D2
number        any numeric constant                    3.14159, 0, 6.02e23
literal       anything but ", surrounded by "'s       "core dumped"

为了更好地理解与词法分析器和解析器的关系,我们将从解析器开始,然后逆向分析输入。

为了更容易地设计解析器,解析器不直接处理输入,而是接受词法分析器生成的标记列表。查看图 3.2 中的标记列,我们会看到以下标记if, else, comparison, id, number and literal;这些是令牌的名称。通常,对于词法分析器/解析器来说,标记是一种结构,它不仅保存标记的名称,还保存组成标记的字符/符号以及组成标记的字符串的开始和结束位置,其中用于错误报告、突出显示等的开始和结束位置。

现在词法分析器接受字符/符号的输入,并使用词法分析器的规则将输入字符/符号转换为标记。现在,使用词法分析器/解析器的人们对他们经常使用的东西有自己的说法。您所认为的构成标记的字符/符号序列就是使用词法分析器/解析器的人所说的词法。因此,当您看到词位时,只需考虑代表标记的字符/符号序列。在比较示例中,字符/符号的序列可以是不同的模式,例如< or > or else or 3.14, etc.

考虑两者之间关系的另一种方式是,标记是解析器使用的编程结构,它具有称为词素的属性,用于保存输入中的字符/符号。现在,如果您查看代码中标记的大多数定义,您可能不会将词素视为标记的属性之一。这是因为令牌更有可能保存表示令牌和词位的字符/符号的开始和结束位置,可以根据需要从开始和结束位置导出字符/符号序列,因为输入是静态的。

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

标记和词位有什么区别? 的相关文章

  • 使用 SSD 加快编译时间

    我想尝试加快 C 项目的编译时间 他们有大约 300 万行代码 当然 我不需要总是编译每个项目 但有时有很多源文件被其他人修改过 我需要重新编译所有这些文件 例如 当有人更新一个项目时 ASN 1 https en wikipedia or
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 使用 Java 文件中的代码编译 Java 文件

    我目前正在创建一个个人 也许是公共 java 终端 我想创建一个在执行时创建 编译 Java 文件的命令 但我不太确定如何实际执行此操作 是否可以 或者我只是在做梦 你也可以使用Groovy http groovy codehaus org
  • 有人可以告诉我计算机编程如何工作的基础知识吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是什么让编程语言的所有单词实际上都有作用 我的意思是 到底发生了什么让计算机知道所有这些词的含义 如果我口头告诉我的计算机做某事 它不
  • 无法在 Windows 上使用 Gnustep 编译 Objective C

    嗨 我是初学者 学习目标c 我发现错误 hello m 1 34 Foundation Foundation h 没有这样的文件或目录 我开始知道我需要制作一个 make 文件 我可以知道如何制作 make 文件吗 无需创建 makefil
  • 如何使用pyinstaller?

    好吧 我是一个完全的编程菜鸟 我正在尝试编译一个我编写的简单程序 该程序接受一个字符串并以莫尔斯电码打印该字符串 它被称为 morse py 我使用安装 pyinstaller pip install pyinstaller 我正在尝试使用
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • 如何将 CodeBlocks 与最新版本的 VC++ 编译器一起使用?

    我需要将 C B 与最新版本的 MS VC 编译器 例如 VS2015 或 VS2017 中的编译器 以及最终的未来版本一起使用 但 C B 不提供此类选项 C B 允许用户从设置中的列表中选择的最新 VC 版本是 VC 2010 MSVC
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • Raspberry 交叉编译 - 执行程序以“分段错误”结束

    我有一个自己编写的程序 我想从我的 x86 机器上为 Raspberry Pi 构建它 我正在使用 eclipse 生成的 makefile 并且无法更改此内容 我已经阅读了 CC for raspi 的教程 Hackaday 链接 htt
  • 编译器琐事:这段代码的结果是什么

    我今天正在审查一些代码 并遇到了一些代码 此片段准确地描述了 public abstract class FlargBase public FlargBase this DoSomething public abstract void Do
  • Qt 编译器标志顺序

    我的目标是消除某些类型的编译器警告 我发现可以通过在 pro 文件中添加编译器标志来做到这一点 QMAKE CXXFLAGS Wno unused variable Wno reorder 问题是它们被添加在 Qt 构建系统生成的标志之前
  • 找出 Maven 使用的编译器

    您知道我如何找到 Maven 使用哪些 JDK 来编译我的项目吗 mvn version会吐出maven的版本和它正在使用的jdk
  • 如何在我的应用程序中取消授权/撤销 LinkedIn 令牌

    我有一个 grails 应用程序 我希望用户授予我访问他 她的 LinkedIn 帐户的权限 以获取信息并以不同的方式显示信息 我能够执行以下操作 获取授权码 使用该授权码获取访问令牌 我将该访问令牌与到期日期一起存储在我的用户实体中 当过
  • Swift 客户端和根 SSL 证书身份验证

    积分得到token api of QLIK server with ssl证书 但执行任务后我收到这样的错误 完成时出现错误 代码 999 Your hostname and endpoint let hostname YOUR HOST
  • 使用 jar 依赖项构建 Android 库项目

    我已经被一个问题困扰了几天 但我不知道如何解决这个问题 我正在处理一个 Android 库项目 该项目正在使用 android sdk 提供的 Android 工具进行编译 在项目内部 我遵循 Android 项目的标准结构 我的 jar
  • 如何在Windows 7上运行Ruby程序?

    有谁知道如何在 Windows 7 上运行 编译 Ruby 程序 例如 你可以在 Eclipse 中编译 Java 但我似乎找不到 Ruby 的编译器 http rubyinstaller org http rubyinstaller or
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • Clang 工具 (libtooling):将标头搜索路径设置为标准库标头。基础框架

    相关链接http kevinaboos wordpress com 2013 07 23 clang tutorial part ii libtooling example http kevinaboos wordpress com 201

随机推荐