程序设计语言|文法
从产生语言的角度出发,给出文法和语言的定义。
所谓产生语言,是指制定出有限个规则,借助他们就能产生此语言的全部句子。
1.文法的定义
描述语言语法结构的规则称为文法。文法是一个四元组G=(Vn,Vt,P,S)。
Vn是一个非空有限集,其每个元素称为非终结符;
Vt是一个非空有限集,其每个元素称为一个终结符;
Vn∩Vt=∅,Vn和Vt不含公共元素;V=Vn∪Vt,称V是文法G的词汇表,V中的符号称为文法符号。
P是产生式的有限集合,每个产生式形式为“α→β”的规则,α是产生式的左部,α∈V+且α中至少含有一个非终结符,β是产生式的右部,β∈V*,β是α的一个候选式。
S∈Vn,称为开始符号,它至少要在一个产生式中作为左部出现。
2.文法的分类
文法有4种类型:0型、1型、2型、3型。这4类文法之间的差别在于对产生式要施加不同的限制。
0型文法:G的任何产生式α→β,均有α∈(Vn∪Vt)+且α中至少含有一个非终结符,β∈(Vn∪Vt)*;
(对0型文法的每条产生式分别施加以下限制,则可得以下文法。)
1型文法:G的任何产生式α→β(S→ε除外)均满足|α|≤|β|(|x|表示x中文法符号的个数,ε是空串);
2型文法:G的任何产生式形如A→β,其中A∈Vn,β∈(Vn∪Vt)*;
3型文法:G的任何产生式形如A→a或者A→aB(或者A→Ba),其中A,B∈Vn,a属于Vt;
0型文法是短语文法,其功能相当于图灵机,任何0型语言都是递归可枚举的。
1型文法是上下文有关文法,对非终结符的替换必须考虑上下文,且不允许替换成空串ε。
2型文法是上下文无关文法,非终结符的替换无须考虑上下文。
3型文法等价于正规式,因此也被称为正规文法或线性文法。
词法分析的词法规则一般用3型文法;
语法分析的语法规则一般用2型文法;语法分析方法有很多种,根据产生语法树的方向,可分为自底向上和自顶向下两类。
这是编译原理里的问题
文法 可以通俗的说是一个东西产生所遵循的规则,如语言中的主谓宾,就是语言的文法
G[S] 这是文法G :S->0S0 S->1 这就是他里面的规则
S->0 S 0 或S->1
N 表示一个数遵循文法G
n->0s0->00s00->00100
或者说他永远遵循文法G中S->0s0规则那么只可能为0
若遵循文法S->0 S 0 或S->1则大于0
乔姆斯基(Chomsky)按产生式的类型把文法分为四种类型:0、1、2、3型文法。
*在下文中的产生式中,箭头左边的大写字母为严格的非终结符,而其左边的小写字母不严格要求为非终结符,如[0型文法]中的第2条产生式。
【0型文法】
产生式形式:α→β
要求:箭头左边的α 至少 含有 一个非终结符 , 其余 不加任何限制
例如,G:C→AaB
aA→a
B→b|Bb
【1型文法】
产生式形式:α→β
要求: |α|≤|β| (产生式左端的长度<=右端的长度),S→ε除外。
例如G: C→aAB
aA→aBa
B→b|Bb
【2型文法】(上下文无关文法)
产生式形式:A→β,A∈VN(终结符) ,β∈V *(VN∪VT,即可为终结符也可为非终结符)
说明:当以β替换A时,与A的上下文环境无关;
大部分程序设计语言近似于2型文法。
【3型文法】(正规文法 / 右线性文法)
产生式形式:A→a,A→aB,
说明:a∈VT(终结符) , A,B∈VN(非终结符),即产生式右端的第一个符号必须为 终结符
例如 G:A→aB
B→b|bB
【其他说明】对于这四种类型的文法:
*包含关系:0 >1 >2 >3 (以'>'代替包含符,'A>B'译为A包含B)
*严格程度:3 >2 >1 >0
*判断文法所属类型的顺序:3 → 2 → 1 → 0
如果你仅仅有一般程序设计的基础,直接要设计一门语言是有难度的。结合我个人的经验,以下路径应该比较适合语言初学者:你需要有基本的编译原理常识。构造基本的编译原理常识,一方面来自于你对已有语言的使用经验,了解基本术语。比如我用C,那么我起码知道语言要素包括宏、表达式、语句、语句块、函数、指针等;我还知道C语言有编译、链接和执行三个阶段。这些基本概念对你宏观掌握你的学习进程是很有必要的。另外一方面编译原理的常识,要来自图书。比如龙书、SICP。
在这一步,你得知道大部分语言的处理都要分为词法、语法、语义和代码生成四个阶段。每个阶段,分别是做什么的。了解具体的编译算法。了解到什么程度,取决于你使用第三方工具,还是需要自己从字符开始处理。个人建议,乔姆斯基文法体系、(扩展)巴克斯范式(EBNF),正则表达式,和LL(1)的递归下降分析法是必须要掌握的。对LL(k),LR(k)要有概念。其中,四则运算表达式的分析是很好的练习。对语法的感觉。
初学者设计语言的难度有两点。第一,不知道什么样的语法/语义是你需要的;第二,不知道你设计的文法能否实现。你是需要一个类似于自然语言的脚本,还是只是一个表达式。经过3阶段的训练我认为你已经有了独立撰写语法的能力。可以写一个基础版本的出来。实现你的语言,特别是词法和语法部分。这一步最好能Log出尽可能多的信息,例如词列表并打印出分析树。
在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。
文法分成四种类型,即0型、1型、2型和3型。这几类文法的差别在于对产生式施加不同的限制。
形式语言,这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。
多数程序设计语言的单词的语法都能用正规文法或3型文法(3型文法G=(VN,VT,P,S)的P中的规则有两种形式:一种是前面定义的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一种形式是:A→Ba或A→a,前者称为右线性文法,后者称为左线性文法。正规文法所描述的是VT*上的正规集)来描述。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。称0型文法产生的语言为0型语言。上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。
节点之间的转移关系弧线应随着节点移动
各个节点的位置应随着自动机被保存和装入
使用说明书:界面说明、人机交互方法
解决方案、设计思想、系统框架的概述
案例文档:角色说明、案例说明(事件流)、案例图、
静态模型:类图、类文档(属性、方法)