美文网首页
【编译原理】第二章:语言和文法

【编译原理】第二章:语言和文法

作者: littlefogcat | 来源:发表于2021-01-11 20:44 被阅读0次

    一、词法语法分析基本概念

    • 字母表 \Sigma
    • 字母表的乘积
    • 字母表的正闭包\Sigma^+)和克林闭包\Sigma^*
    • (String)和空串\epsilon)及其运算

    二、文法的定义

    • G:文法,G=(V_T, V_N, P, S)
    • V_T:终结符集合,不可再分;(Token)
    • V_N:非终结符集合,可再分;
    • P:产生式集合,将终结符和非终结符组合成串的方法,记作 \alpha \to \beta,也就是句子构成规则;
      其中\alpha \in (V_T \cup V_N)^+\beta \in (V_T \cup V_N)^*
      例:
      P= \begin{cases} <句子>\rightarrow<名词短语><动词短语>,\\ <名词短语>\rightarrow<形容词><名词短语>,\\ ... \end{cases}
    • S:开始符号;
      例:上例P中的开始符号为<句子>

    1. 示例

    G=(\{id,+,*,(,)\}, \{E\},P,E)
    P= \begin{cases} E\rightarrow E+E,\\ E\rightarrow E*E,\\ E\rightarrow (E),\\ E\rightarrow id \end{cases}
    上述文法G表示,该文法由终结符集合V_T=\{id,+,*,(,)\},非终结符集合V_N= \{E\},产生式集合P,以及开始符号S构成。
    而产生式P表示,一个表达式(Expression)E,可以由一个标识符(Identifier)id、或者两个表达式由加号+或乘号*连接、或者另一个表达式用括号包裹((E))构成。

    约定:在不引起歧义的情况下,可以只写产生式。如以上文法可以简写为:
    \begin{aligned} G: \ &E \rightarrow E+E \\ &E \rightarrow E*E \\ &E \rightarrow (E) \\ &E \rightarrow id \end{aligned}

    2. 产生式的简写

    产生式
    P= \begin{cases} \alpha \rightarrow \beta_1,\\ \alpha \rightarrow \beta_2,\\ \alpha \rightarrow \beta_3,\\ \alpha \rightarrow \beta_4 \end{cases}
    可以简写为:
    P=\alpha \rightarrow \beta_1\ |\ \beta_2\ |\ \beta_3\ |\ \beta_4

    如上例中,
    P= \begin{cases} E\rightarrow E+E,\\ E\rightarrow E*E,\\ E\rightarrow (E),\\ E\rightarrow id \end{cases}
    可以简写为:
    P = E \rightarrow E+E\ |\ E*E\ |\ (E)\ |\ id

    三、语言的定义

    1. 推导和规约

    给定文法G=(V_T, V_N, P, S),如果有\alpha \rightarrow \beta,那么可以将符号串\gamma\alpha\delta重写\gamma\beta\delta,记作\alpha \rightarrow \beta \Rightarrow \gamma\beta\delta,这个过程称为推导
    如上例中,E+E可以推导出E+E+EE*E+EE+id等等。

    如果\alpha_0\Rightarrow\alpha_1,\alpha_1\Rightarrow\alpha_2,\alpha_2\Rightarrow\alpha_3,...,\alpha_{n-1}\Rightarrow\alpha_n
    可以记作\alpha_0\Rightarrow\alpha_1\Rightarrow\alpha_2\Rightarrow\alpha_3...\alpha_{n-1}\Rightarrow\alpha_n,则称为\alpha_0经过n步推导出\alpha_n,记作\alpha_0\Rightarrow^n\alpha_n

    推导的反过程称为归约

    2. 句型和句子

    如果S \Rightarrow^* \alpha, \alpha \in (V_T \cup V_N)^*,则称\alphaG的一个句型(sentential form)。

    3. 语言的形式化定义

    由文法G的开始符号S推导出的所有句子构成的集合称为文法G生成的语言,记作L(G)
    即:
    L(G) = \{w|S\Rightarrow^*w,w\in V_T^*\}

    文法G = E+E|E*E|(E)|id 包含了无穷多个句子。


    文法
    G= \begin{cases} S\rightarrow L|LT,\\ T\rightarrow L|D|TL|TD,\\ L\rightarrow a|b|c|...|z,\\ D\rightarrow 0|1|2|...|9 \end{cases}
    表示什么呢?
    L代表小写字母;
    D代表数字;
    T表示若干个字母和数字构成的字符串;
    S\rightarrow L|LT说明S是一个字母、或者是字母开头的字符串。
    那么这个文法表示的即是,以字母开头的、非空的字符串,即标识符的构成方式。

    4. 语言上的运算

    并、连接、幂、克林闭包、正闭包。
    如上例表示为:G = L(L\cup D)^*

    四、文法的分类

    0型文法(无限制文法,PSG)

    \alpha \rightarrow \beta

    \alpha中必须包含一个非终结符

    1型文法(上下文有关文法,CSG)

    \alpha \rightarrow \beta

    \forall \alpha \rightarrow\beta\in P, |\alpha|\leq|\beta|
    产生式一般形式:\alpha_1A\alpha_2\rightarrow\alpha_1\beta\alpha_2(\beta\neq\epsilon)
    即上式中只有当上下文满足\alpha_1\alpha_2时,才能进行从A\beta的推导。

    上下文有关文法不包含空产生式(\epsilon)。

    2型文法(上下文无关文法,CFG)

    \alpha \rightarrow \beta

    \forall \alpha \rightarrow\beta\in P, |\alpha|\in V_N
    产生式的一般形式:A\rightarrow\beta
    即产生式左边都是非终结符。

    3型文法(正则文法,RG)

    \alpha \rightarrow \beta

    右线性文法A\rightarrow wB或A\rightarrow w
    左线性文法A\rightarrow Bw或A\rightarrow w
    以上都成为正则文法。
    即产生式的右侧只能有一个终结符,且所有终结符只能在同一侧。

    例:(右线性文法)
    \begin{aligned} G: \ &S \rightarrow a|b|c|d \\ &S \rightarrow aT|bT|cT|dT \\ &T \rightarrow a|b|c|d|0|1|2|3|4|5 \\ &T \rightarrow aT|bT|cT|dT|0T|1T|2T|3T|4T|5T \end{aligned}
    以上文法满足右线性文法。
    以上文法生成一个以字母开头的字母数字串(标识符)。
    以上文法等价于上下文无关文法
    \begin{aligned} G:\ &S\rightarrow L|LT,\\ &T\rightarrow L|D|TL|TD,\\ &L\rightarrow a|b|c|...|z,\\ &D\rightarrow 0|1|2|...|9 \end{aligned}

    练习:将以上右线性文法改写为左线性文法。

    正则文法能描述程序设计语言中的多数单词。

    四种文法之间的关系

    • 逐级限制
      0型文法:\alpha中至少包含1个非终结符;
      1型文法:|\alpha|\leq|\beta|
      2型文法:|\alpha|\in V_N
      3型文法:A\rightarrow wB或A\rightarrow wA\rightarrow Bw或A\rightarrow w

    • 逐级包含
      3型文法\in2型文法\in1型文法\in0型文法。

    五、CFG(上下文无关文法)的分析树

    正则文法能描述程序设计语言中的多数单词,但不能表示句子构造,所以用到最多的是CFG。

    1. 分析树

    分析树

    根节点表示文法开始符号S;
    内部节点表示对产生式A\rightarrow \beta的应用;该节点的标号是产生式左部,子节点从左到右表示了产生式的右部;
    叶节点(又称边缘)既可以是非终结符也可以是终结符。

    2. (句型的)短语

    给定一个句型,其分析树的每一棵子树的边缘称为该句型的一个短语
    如果子树高度为2,那么这棵子树的边缘称为该句型的一个直接短语

    短语

    直接短语一定是某产生式的右部,但反之不一定。

    3. 二义性文法

    如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的

    二义性

    二义性原因:多个if只有一个else;
    消岐规则:每个else只与最近的if匹配。

    相关文章

      网友评论

          本文标题:【编译原理】第二章:语言和文法

          本文链接:https://www.haomeiwen.com/subject/clhjaktx.html