SPIR-V 研究:编译器基本原理(二)
2015-12-18 15:48
246 查看
SPIR-V 研究:编译器基本原理(二)- 语法
标签(空格分隔): SPIR-V Graphics Vulkan上一篇介绍了计算机语言的基本知识,这一篇主要讲讲语法。语法是一组能生成对应语言语句的规则,这一般是一个有限集合,也就是只有有限多个规则。所以,根据给定语法和字母表,我们可以生成所有符合规则的语句。比如下图:
Formal Language
这里所讲的语言其实就是形式语言(formal language),对应的语法就是formal grammar。语言L是一组长度有限的字符串(语句)。L可以包含有限个数的语句;最小的语言不包含任何语句。
L还可以包含无限多个语句;比如一般编程语言就是如此。
由于一个句子可以属于或不属于某一语言,所以需要一种规则或方法还检验给定语句是不是属于特定语言。这种规则就是语法;检验的过程就是Parse的过程。
Formal Grammar
语法有四种元素构成。可以参见这篇好文章:Formal Grammar。首先是一个字母表Σ,它包含所有的**有限个的**terminal symbols;terminal symbols,顾名思义就是最终的字符,不是中间的表示符号。因为语法基本上是一个递归替换的符号的过程;当所有符号都是最终字符时,替换过程结束,这时得到的就是这种语法生成的一个语句。比如:
Σ = { "a", "the", "dog", "cat", "barked", "napped"}
其次是一个包含有限个中间字符的集合N(nonterminal symbols).
中间字符是特殊的,可以把它们想象成wildcards;最终会被替换成其他符号。比如:
N = { "<sentence>", "<noun>", "<verb>", "<article>" }
再次是必须有一个中间符号最为起始符号S;它是所有可能的替换生成过程的开始。比如:
S = "<sentence>"
最后我们要有一组生成规则P(production rules);这是有限集合,定义了怎么样来组建语句。比如:
P = { "<sentence>" → "<article><noun><verb>" "<article>" → "a" "<article>" → "the" "<noun>" → "dog" "<noun>" → "cat" "<verb>" → "barked" "<verb>" → "napped" }
一个Formal Grammar就可以表示为以上四个集合的元组(tuple)。
G = { N, Σ, P, S }
正式的数学语言描述为:
具体也可参见wikiFormal_grammar.
The Chomsky hierarchy
数学大牛Noam Chomsky很早就研究了语言和语法,并对语法提出了分类。也就是所谓的Type-0,Type-1, Type-2和Type-3语法。其中最有用的是Context-free grammars (Type 2) and Regular grammars (Type 3).它们之间是包含关系,Type-0是没有任何限制的语法,可以描述最多的语言;其他的都是一步步加上各种限制后得出的语法,它们能描述的语言也就越来越少;然而它们却更简单更有用。事实上很多编程语言的语法都是正则表达式来描述的,也就是type-3。
相关文章推荐
- C#之值类型与引用类型
- pip和conda到底有什么不一样?
- 程序向oracle插入数据错误:can bind a LONG value only for insert into a LONG column
- 浏览器使用DOM表示标记
- SQLite3基本操作入门
- Tachyon部署与使用指南
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
- TOMCAT访问流程
- hdu1869六度分离,spfa实现求最短路
- urlencoder编码
- C#利用mysql验证登录
- 树的直径
- 修改debian的系统时间
- Xcode 自带git 使用,忽略用户数据
- IntelliJ IDEA 简单设置优化
- JVM系列五:JVM监测&工具[整理中]
- 10个Eclipse调试技巧
- 队列
- C# 中自定义Attribute值的获取与优化
- 【android】SQLite数据库之SQLiteOpenHelper与SQLiteDatabase