programming-languages - 如何使用自动机概念理论制作计算机语言?
问题描述
我非常努力地在谷歌引擎上找到这个问题的答案。
但是我想知道这些高级编程语言是如何根据自动机原理创建的,或者自动机理论不包括在定义语言中吗?
解决方案
语言设计往往有两个重要的层次:
- 词法分析- 令牌外观的定义。什么是字符串文字,什么是数字,什么是变量、函数等的有效名称。
- 句法分析- 令牌如何协同工作以做出有意义的陈述的定义。您可以为文字赋值吗,块是什么样的,
if
语句是什么样的,等等。
词法分析使用正则语言完成,通常使用正则表达式定义标记。并不是说使用了 DFA(实际上大多数正则表达式实现都不是 DFA),而是正则表达式倾向于与大多数语言认为的标记很好地对齐。例如,如果您想要一种所有变量名都必须是回文的语言,那么您的语言的标记规范就必须是上下文无关的。
词法分析阶段的输入是源代码的原始字符。因此,字母表将是 ASCII 或 Unicode 或您的编译器期望的任何输入。输出是带有元数据的令牌流,例如string-literal (value: hello world)
可能"hello world"
在源代码中表示的。
句法分析通常使用称为LL或LR解析器的上下文无关语言的子集来完成。这是因为 CFG (PDA) 的实现是不确定的。LL 和 LR 解析是就如何解析给定表达式做出确定性决策的方法。
我们将 CFG 用于代码,因为这是发生嵌套的 Chomsky 层次结构中的级别(您可以在其中表达“深度”的概念,例如使用if
within an if
)。层次结构的更高或更低级别是可能的,但常规语法无法轻松表达嵌套,并且上下文相关的语法可能会导致混淆(但并非闻所未闻)。
句法分析步骤的输入是令牌流,输出是某种形式的可执行结构,通常是立即执行(如在解释语言中)或存储以供以后优化和/或执行(如在编译中)的分析树语言)或其他东西(如Java等中间编译语言)。因此,CFG 的字母表是词法分析步骤指定的可能标记。
所以这整件事是一种冗长的说法,说重要的不是自动机理论,而是形式语言。我们通常希望拥有满足我们需求的最简单的语言类。这通常意味着常规标记和上下文无关语法,但并非总是如此。
正则表达式的实现不必是自动机,CFG 的实现也不能是 PDA,因为 PDA 是非确定性的,所以我们在 CFG 类的合理子集上定义确定性解析器。
推荐阅读
- python - 按广度优先顺序列出的字典图
- javascript - 然后在部署节点 js 函数时捕获错误
- java - 为什么我的代码无法在使用 JSoup 库的 AsyncTask 中运行我的 Android 活动?
- javascript - 将数组中的对象合并为多个键共享相同的值
- ruby-on-rails - 使用回形针上传从谷歌驱动器下载的 docx 文件
- sql - 公用表表达式:关系不存在
- javascript - 方法在传递给组件的 HTML 时没有上下文
- c# - SignalR:从另一个项目访问 Hub 类
- sql - PostgreSQL和多个匹配行
- php - 根据codeigniter php中的第一个下拉值选择下拉值