SPIR-V 研究:编译器基本原理(三) - Chomsky文法分类
来源:互联网 发布:算法工程师主要做什么 编辑:程序博客网 时间:2024/05/22 08:27
SPIR-V 研究:编译器基本原理(三) - Chomsky文法分类
标签(空格分隔): SPIR-V Vulkan Grammar
上一篇说过语法分为四类;这一篇来介绍Chomsky Hierarchy。首先,我们简单看看type-0和type-1的语法。
Type-0 - Unrestricted grammar
这是一种没有任何限制的语法,理论上可以描述任何图林机可以接受的语言。它的一般形式如下图:
这是一个从u生成v的过程;其中u,v是任意字符组合(包括最终字符和中间符号,或空字符),当然u至少包含一个中间符号。数学表达式为:(Σ ⋃ N)* N (Σ ⋃ N)* --> (Σ ⋃ N)*
虽然,type-0很强大,但是用它来检验语句是否符合语法规则,也就是写一个一般性通用的Parser,是非常困难的事。这也就引出了后面几种语法;其想法是通过加强限制条件,我们可以得到更简单更容易使用的语法。
Type-1- Context-sensitive grammar (CSG)
这是一种上下文有关的语法规则;左侧和右侧被替换的字符前后都有可能有别的字符,也就是有上下文的;只有在这一组字符一起出现才能应用这个规则。并且,左侧的字符数要小于等于右侧。如下图
其一般形式:
其中α,β可以是空字符,也就是没有;γ是任意字符。
这里A被替换为γ 有个前提条件,就是当且仅当A被α,β包裹;这也就是上下文相关。
CSG的生成过程可以用一张图来表示,比如:
这种CSG的生成图比较复杂,可能会含有某种环;而我们后面将要看到的CFG和正则语法图就简单的多了。
Kleene star
这里有几个描述符号我们会经常碰到:*,+,?,|;它们也广泛用于正则表达式。
* Kleene star/克莱尼星号(或者克莱尼闭包)是一个针对集合或字符的单目运算符。一个集合的克莱尼闭包定义为:L* = {ε} ∪ L ∪ LL ∪ LLL ∪ ...,
即L的0到正无穷次幂的并集。对于语言L*= {'a'},我们有:L*={ε, 'a', 'aa', 'aaa', ...}。
加号运算符+:L+ = LL* = L*L,对L = {'a'},我们有:L+={'a', 'aa', 'aaa', ...}。
? : 0个或一个元素。
| : 或运算。U : 集合的并集。
Type-2 Context Free Grammar
CFG是这样一种语法规则,左边(LHS)只有一个中间字符,而右边(RHS)是任意字符。 α --> (N U Σ)* ; α属于N
这样的规则替换的时候是和上下文无关的;只是简单的把某个中间表示替换成一组字符,然后继续。这样的过程可以用一颗生成树来表示,比如:
Type-3 Regular grammar
CFG的一个问题是右边有可能有多于一个的中间表示;这样当某个中间表示被替换时,我们必须记住旁边还有另一个中间表示也要被替换;也就是说CFG可能需要在生成树上往上回溯。我们希望有个更简单的规则,它可以一路向下不断替换最终结束,而不用回溯。这就是Regular Grammar。
Regular Grammar: 限制右边只能是一组最终字符或一组最终字符加一个中间表示。
1. B → a - where B is a non-terminal in N and a is a terminal in Σ 2. B → aC - where B and C are non-terminals in N and a is in Σ 3. B → ε - where B is in N and ε denotes the empty string, i.e. the string of length 0.
这样,生成树变成了一个链条。
下表是四种类型语法描述汇总表格;其中:
T or ∑ = set of alphabet/Character/terminals = ( a, b,c,…., +,-,*, …. )
V = Set of non-terminals or variables =( A,B,C, …., )
(∑ U V) = combination of variables and terminals
- SPIR-V 研究:编译器基本原理(三) - Chomsky文法分类
- SPIR-V 研究:编译器基本原理(一)
- SPIR-V 研究:编译器基本原理(二)
- SPIR-V 研究:编译器基本原理
- 【编译原理】乔姆斯基(chomsky)文法分类
- Chomsky 文法分类
- 编译器_文法分类
- Chomsky文法类型判断
- Chomsky文法类型判断
- 编译原理(一) Chomsky文法
- 文法分类
- Java版编译原理Chomsky文法判断Java版
- Jikes 研究虚拟机(RVM)三 动态优化编译器
- [转] Redefining the shading languages ecosystem with SPIR-V
- [转] 8 reasons why SPIR-V makes a big difference
- 8 reasons why SPIR-V makes a big difference
- Redefining the shading languages ecosystem with SPIR-V
- 自己动手开发编译器(六)上下文无关语言和文法
- 基本图算法之图的表示
- AsyncTask入门
- mysql 中查询语句表达式REGEXP用法
- 通过Wifi调试运行Android应用的IntelliJ/AndroidStudio插件:AndroidWiFiADB
- 期末总结
- SPIR-V 研究:编译器基本原理(三) - Chomsky文法分类
- 循环单向链表
- 浅读原型
- centos rm -rf 恢复删除的文件
- 【Codeforces 597C】 Subsequences - DP 主席树
- 项目第二天
- ceph学习笔记
- Servlet获取参数Map
- redis 命令总结