学习编译原理Time05 ~ 文法的认知

共 2199字,需浏览 5分钟

 ·

2021-04-17 23:07

首先举个自然语言的例子,来了解句子的构成规则。

<句子> → <名词短语><动词短语>

<名词短语>→<形容词><名词短语>

<名词短语>→<名词>

<动词短语>→<动词><名词短语>

<形容词>→big

<名词>→boy

<名词>→apple

<动词>→eat

上面未用尖括号括起来部分表示语言的基本符号

尖括号括起来部分称为语法成分



文法的形式化定义

G=(VT,VN,P,S)


VT:终结符集合

    终结符(terminal symbol)是文法所定义的语言的基本符号,有时也称为token。

例:VT={apple, boy, eat,big }


VN:非终结符集合

    非终结符集合(nonterminal)是用来表示语法成分的符号,有时也称为”语法变量”

例:VN={<句子>,<名词短语>,<动词短语>,<名词>,...}


在这个要注意一下,VT和VN这两个集合是不相交的。VT和VN并起来统称文法符号集


P:产生试集合

    产生式(production)描述了将终结符和非终结符组合成串的方法,一般形式为:α →β,读作α定义为β。

    α(VT U VN)+, 且α中至少包含VN中的一个元素:称为产生式的头(head)或左部(leftside)

    VT、VN  两个字母表并起来也是一个字母表,上一篇文章也说到,字母表的闭包是是这个字母表的字符串构成的集合,因此α和β为文法符号串。

    β(VT U VN)*: 称为产生式的体(body)或右部(right side)

例:P={<句子> → <名词短语><动词短语>,

            <名词短语>→<形容词><名词短语>,

            ......

            }


S:开始符号

    SVN开始符号(start symbol)表示的是该文法中最大的语法成分。

例:S=<句子>

    

下面来看一下文法的例子

G=({id,+,*,(, ) },{E},P,E)

P={E→E+E,

      E→E*E,

      E→(E),

      E→id }


产生式的简写

对一组由相同左部的α产生式

   α →β1α β2,...,α βn

可以简记为:α β1β2 |...| βn

读作:α定义为β1,....,或者βn

β1β2,...,βn称为α 候选式(Candidate)


例:

E→E+E,

E→E*E,

E→(E),

E→id



E→E+E | E*E(E) | id



为了说明哪些是终结符,哪些是非终结符,这里进行符号约定

下面符号是终结符:

  1. 字母表中排在前面的小写字母,如a,b,c

  2. 运算符,如+、*等

  3. 标点符号,如逗号,括号等

  4. 数字0,1,2、...、9

  5. 粗体字符串,如id,if等

下面符号是非终结符:

  1. 母表中排在前面的大写字母,如A,B,C

  2. 字母S。通常表示开始符号

  3. 小写、斜体的名字,如expr、stmt等

  4. 代表程序构造的大写字母。如E(表达式)、T(项)和F(因子)

字母表中排在后面的大写字母(如X、Y、Z)

表示文法符号(即终结符或非终结符)


字母表中排在后面的小写字母(主要是u、v、...、z)

表示终结符号串(包括空串)


小写希腊字母,如α 、β、γ,表示文法符号串(包括空串)


除非特别说明,第一个产生式的左部就是开始符号





记录
点点滴滴的笔记
欢迎关注,共同学习


小浩笔记

浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐