第四次作业

 

1. 梳理第二章的内容,写一篇理解与总结。

 

字母表:一个有限的字符集

 

例子:C语言的字母表

 

(1)大小写英文字母

 

a ~ z, A ~ Z

 

(2)数字

 

0 ~ 9

 

(3) 特殊字符

 

单词符号:是语言中具有独立意义的最基本结构

 

语法单位:由单词符号构成的更大的结构

 

一般包括:表达式 语句 分程序(语句块)函数(有返回值)

 

语义是指这样的一组规则,使用它可以定义一个程序的意义。

 

标识符:以字母开头后跟字母数字组成字符串   PI、nm1

 

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

 

PI :π(圆周率)(变量名,函数名,类名,常量名,对象名等)

 

名字的属性

 

类型:以什么方式存放、大小、运算操作

 

作用域:全局变量,局部变量,静态函数

 

字母表:由若干元素组成的有限非空集合,用∑表示,它的每个元素称为一个符号。

 

符号串 ∑中的符号所构成的有穷序列。

 

空字:不包含符号的序列称为空字,记为ε。

 

∑*表示∑上的所有符号串的全体,空字也包括在其中。如: 

 

∑={a,b},则∑*=?  ∑*={ε,a,b,aa,ab,bb,aaa,…}。

 

Φ表示不含人何元素的空集{}。

 

特别地:xº=ε

 

∑*的子集U和V中的(连接)积定义为:  UV={αβ∣α∈U & β∈V }

 

V的闭包:  令: V*  = V0∪V1∪V2È…  V*是V的闭包。

 

V的正则包(正闭包,正则闭包):  V+ = VV*, 称 V+是V的正则包,即V+ =V1∪V2∪V3È…。

 

文法是描述语言的语法结构的形式规则(即语法规则)

 

上下文无关文法它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的

 

特点:独立性

 

缺点:不能用来描述自然语言

 

一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号,以及一组产生式。

 

终结符号:乃是组成语言的基本符号,即在程序语言中以前屡次提到的单词符号,如基本字,标识符,常数,算符和界符等

 

非终结符号(也称语法变量):用来代表语法范畴。如“算术表达式”“布尔表达式”“过程”等。

 

一个非终结符代表一个一定的语法概念。因此非终结符是一个类(或集合)记号,而不是个体记号。 如:{E,T,F}

 

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

 

产生式(也称为产生规则或简称规则):是定义语法范畴的一种书写规则。  一个产生式的形式是  A→ α   其中箭头左边的A是一个非终结符,称为产生式的左部符号;箭头右边的α是终结符号或与非终结符号组成的一符号串,称为产生式的右部,或称候选式。

 

可能用多个产生式对一个非终结符进行定义 

 

 E→i    E→ E+E    → E*E     E→(E) 或者: E → i  | E+E | →E* | →(E)   

 

直接推导:仅当A→àγ是一个产生式,有 αAβ →αγβ  该推导称为直接推导(直接导出)

 

规范推导最右推导为规范推导,由规范推导推出的句型称为右句型或规范句型。

 

文法的二义性

 

一个句型可能对应多个语法树,一个句型可能对应多个最左/最右推导。

 

如果一个文法中的某个句子可以对应两个不同的语法树,则称这个文法是二义的。

 

两个不同的文法可能是一样的语言。

 

如果一种语言的所有文法都是二义的,则称此语言先天二义。

 

判定一个文法是否是二义的是递归不可解的。

 

文法G所产生的句子的全体是一个语言,将它记为L(G).   L(G)={α|S =>α&α∈VT }

 

考虑一个文法G1: S→bA   A→aA|a 它定义了一个什么语言呢?

 

从开始符S出发,我们可以推出如下句子:

 

S ⇒bA ⇒ba   S ⇒bA ⇒baA ⇒baa  S ⇒bA ⇒baA ⇒… ⇒baa…a

 

可以写为:L(G1)={ba|n≥1}

 

语法树图示化形式分解句子各组成部分描述句子语法结构语法树与文法相一致

 

满足的条件
1)结点用终或非终标记
2)根结点用S标记
3)子结点一定是非终结符

 

句型(Sd(T)db)

 

S -> a|b|(T) 

 

T -> TdS|S 

 

语法树如下图所示。 
           S 
         /  |  \ 
         (   T   ) 
          /  | \ 
          T   d  S 
           /|\    | 
           T d S    b 
           |  /|\ 
           S ( T ) 

 

一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语,当子树中不包含其他更小的子树时,该子数叶结点所组成的字符串就是该句型的直接(简单)短语。 
因此本题的直接短语的为 S 、(T)、b,短语有S、(T)、b、Sd(T)、Sd(T)db 、(Sd(T)db)。

 

d不是直接短语,因为d所在的树还有子树所以它不是!

 

一个句型的最左直接短语汇称为该句型的句柄本题的句柄S

 

素语是一个短语,它至少含有一个终结符,而且除它自身以外不再含有更少的素短语,对于句型(Sd(T)db)的素短语是(T)、b.

 

 

 

 2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)

 

整数n

 

<整数> ::= [-] <数字> {<数字>}

 

<数字> ::= 0 | 1 | 2 | … | 8 | 9

 

标识符i

 

<标识符> ::= <字母> {<字母>|<数字>}

 

<字母> ::= a | b | … | X | Y | Z

 

<数字> ::= 0 | 1 | 2 | … | 8 | 9

 

表达式e

 

<e>:=[+|-]<项>{<加减运算符><项>}

 

<项>::=<因子>{<乘除运算法><因子>}

 

<加减运算符>::=+|-

 

条件语句

 

<条件语句>::=if<条件>then<语句>

 

赋值语句

 

<赋值语句>::=<id>:=<表达式>

 

复合语句

 

<复合语句> ::= begin <语句> {;<语句>} end

 

<语句> ::= <赋值语句> | <条件语句> | <当型循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句> | <空语句>

 

函数

 

<函数> :: = <类型说明><函数名><复合语句>

 

程序

 

<程序>-><外部声明> | <外部声明><函数>

 

<外部声明>-><头文件><函数声明> | <其他声明>

 

<函数>-><返回值类型><标识符><形参><复合语句>

 

 

 

 

 

 

 

 

 

posted on 2019-09-27 20:35  [︵︵]  阅读(394)  评论(0)    收藏  举报