您的位置:首页 > 其它

编译原理高级语言及其语法描述

2018-03-23 23:01 323 查看
程序语言的定义:语法和语义
语法中的基本概念:
1.字母表:一个有限的字符集,包括大小写字母、数字、特殊字符
2.单词符号:语言中具有独立意义的最基本结构,包括:常数,标识符,基本字、算符和界符
3.语法单位:由单词符号构成的更大的结构,包括表达式、语句、分程序(语句块)、函数(有返回值)、程序
语法:一组规则,这组规则产生形式上正确的程序,词法规则和语法规则
词法规则:合法单词的构成规则,也就是如何从字母表中选择字符构成一个合法单词(用有限状态自动机或正规式描述)

语法规则:合法程序的构成规则,也就是如何把各个单词符号组成更大的语法单位(语句、程序)(用上下文无关文法进行描述)

语义:语义是指这样的一组规则,使用它可以定义一个程序的意义
语义描述方法:属性文法和基于属性文法的语法制导翻译方法

程序设计语言的定义:

1.建立在有限字母集之上的一个符号系统
2.有一定的语法和语义规则
    语法规则:词法规则和语法规则
    语义规则:描述语法单位的功能和含义
3.程序的功能是描述数据和对数据的运算
高级语言的分类:
1.程序设计范型:强制式语言(过程式语言,c),应用式语言(函数式语言,lisp),基于规则的语言(proolog,yacc),面向对象的语言(java)
2.编译时是否需要类型检查:静态类型语言(c,c++,java),动态类型语言(Python,Ruby,PHP)
3.类型检查强弱:弱类型语言(C,C++,VB),强类型语言(java,C#)
程序设计语言的一般特性:

1.程序结构:是(Pascal)否(c/c++/java)支持过程的嵌套定义
程序结构的不同,决定了符号表构造方法的不同

2.数据类型和操作:
数据类型:每种数据类型都隐含了数据对象可以具有的值和作用于这种类型数据对象的操作
标识符:以字母开头后跟字母数字组成字符串

名字:当给标识符一定意义时,该标识符成为名字

数据类型通常包括要素:
a.用于区别这种类型的数据对象的属性
b.这种类型的数据对象可以具有的值
c.可以作用于这种类型数据对象的操作
3.语句:根据属性文法的定义进行处理
4.控制结构
文法:文法是描述语言的语法结构的形式规则(即语法规则)
字母表:由若干元素组成的有限非空集合,用S表示,它的每个元素称为一个符号
符号串: 由S中的符号所构成的有穷序列
空字:不包含符号的序列称为空字,记为e
f表示不含任何元素的空集{}
上下文无关文法:它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的
上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号,以及一组产生式
终结符号:组成语言的基本符号,即在程序语言中以前屡次提到的单词符号,如基本字,标识符,常数,算符和界符等
非终结符号:也称语法变量,用来代表语法范畴,非终结符是一个类(或集合)记号,而不是个体记号

开始符号:是一个特殊的非终结符号,它代表所定义的语言中我们最感兴趣的语法范畴

产生式:也称为产生规则或简称规则,是定义语法范畴的一种书写规则 
形式上定义一个上下文无关文法G是一个四元式(VT,VN,S,P)
VT是一个非空有限集,它的每一个元素称为终结符号
VN是一个非空有限集,它的每一个元素称为非终结符号         VT∩VN=f
S是一个非终结符号,称为开始符号
P 是一个产生式(有限)集合,每个产生式形式是A→a ,其中,P∈VN,   a ∈( VT∪VN)*
开始符号S至少必须在某一产生式的左部出现一次   
仅含终结符号的句型是一个句子
文法G所产生的句子的全体是一个语言,将它记为L(G)
L(G)={a|S+=> a & a∈VT* }
最左(最右)推导:在推导的任何一步α=>β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换

语法分析树:简称语法树,用来表示推导过程

语法树的根结由开始符号所标记
随着推导的展开,当某个非终结符被它的某个候选式所替换时,这个非终结符的相应结就产生了下一代新结点。每个新结点和其父亲结点间都有一条连线
在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末结自左至右排列起来就是一个句型
文法的二义性:一个文法存在某个句子,它有两个不同的最左(最右)推导,则这个文法是法是二义的

文法二义不等于语言二义
文法的二义性是不可判定的
文法的二义性证明:找出一个句子,它有两个不同的最左推导或最右推导

文法二义性的消除:给每个产生式定义优先级
形式语言:

乔姆斯基把文法分为四种类型:0型,1型,2型,3型
0型文法:也称短语文法,描述能力相当于图灵机
G=(VT ,VN ,S ,P) 是一个0型文法,如果它的每个产生式是这样的结构 a-> b,a∈(VN∪VT)* 且至少有一个非终结符,而b∈(VN∪VT)* 
1型文法:又称为上下文有关文法
产生式的形式为a-> b,其中|a|<=|b|, S->ε 除外,但S不得出现于任何产生式的右部,另一种定义形式:aAb -> aγb
2型文法:上下文无关文法
3型文法:又称为右线性文法,或左线性文法,通称正规文法

该文法的产生式满足:A->aB 或 A->Ba,A为非终结符,a为终结符组成的符号串,可以是空串
课后题:
6.(1)L(G6)={0,1,2,3,4,5,6,7,8,9}+
    (2) 0127: 最左推导:N->ND=>NDD=>NDDD=>DDDD=>0DDD=>01DD=>012D=>0127

                   最右推导:N->ND=>N7=>ND7=>N27=>ND27=>N127=>D127=>0127

        34,568同理

7.   D->1|3|5|7|9    C->D|2|4|6|8     B->C|0    A->ε|+|-    S->AFD   F->C|CE|ε     E->EB|B
8. (1)i+i*i:最左:E=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+F*F=>i+i*F=>i+i*i
                 最右:E=>E+T=>E+T*F=>E+T*i=E+F*i=>E+i*i=>T+i*i=>F+i*i=>i+i*i
    i*(i+i):最左:E=>T=>T*F=>F*F=>i*F=>i*(E)=>i*(E+T)=>i*(T+T)=>i*(F+T)=>i*(i+T)=>i*(i+F)=>i*(i+i)

                最右:E=>T=>T*F=>T*(E)=>T*(E+T)=>T*(E+F)=>T*(E+i)=>T*(T+i)=>T*(F+i)=>T*(i+i)=>F*(i+i)=>i*(i+i)

(2)i+i+i :                E                    i*(i+i):            E                                i-i-i:                 E   
                            / | \                                       /  |  \                                                    /   |   \

                          E  +  T                                   E  +   T                                                E    -    T                                               
                        / | \     |                                    |     /  |  \                                           / | \         |  

                      E  +  T  F                                   T    T  *   F                                        E  - T       F
                       |       |   |                                    |     |        |                                        |      |        | 
                      T       F  i                                    F    F       i                                        T     F       i 

                       |       |                                        |     |                                                 |      |   

                      F       i                                        i     i                                                 F      i  
                       |                                                                                                        |
                       i                                                                                                        i
9.    最左 :  S                                                最右:         S
            /   /  |   \                                                          /   /  |   \

           i    S  e   S                                                        i    S  e   S    

              /  \      |                                                               |      / \

             i    S     i                                                               i     i    S  

                  |

                  i

10.不会
11.L1:  S->AC,  A->aAb|ab,C->cC|ε   L2:  S->AC, A->aA|ε,C->bCc|bc  
     L3:  S->AA,A->aAb|ε  L4:  S->1S0|A,A->0A1|ε
12-不会
感悟:
        语言包括语法和语义,自然语言和机器语言都是这样,我们所学习的编程语言,居然能系统的用形式化语言描述,抽象成简单的数学符号,之前的我对编译原理一无所知,现在了解到编译原理是用来描述怎样去定义一门编程语言,是语言的语法,我们从简单的一个句子入手,引人了开始符号,终结符号,非终结符号,产生式的概念,从而导入了文法这一概念,文法是产生句子的语法规则,有0,1,2,3型文法,其中讲的最多的是上下文无关文法,而且讲了一堆例子,我们能根据几个产生式推导出文法,还有就是语法树和二义性的讨论,通过添加优先级的方法来优化。我们还比较了0123型文法,文法越复杂,描述能力越弱。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: