コンパイラの原則4

1.第二章をカーディング、概要を理解し、書きます。


文がするとき、私たちは言語を記述したいとき、私たちは文章の数は必要が記載されていたときに、限られた数の利用できる言語のすべての文章を与える必要がある
ときにそれを非可算無限である無限集合であり、それは、ルール文のそれらの構造又は組成物によって表されるメソッドの説明を与えることができます。この
規則は、文法です。

文法構造及び所定の(または文法)を記述として正式に知られています

まず、文法定義:

文法Gは、4つのタプル(VN、VT、P、Sのように定義される ) 、請求
また、非S又は開始記号と呼ばれる識別子が、; Pは、生産を組み込まれ、非終端記号のVNセットは、VTはターミネーターを設定しましたターミネータは、少なくともで
左の生産の下に表示されます。

いくつかの用語の出現、ターミネータ、非終端生産、識別子/スタートシンボル。これらの用語や文法の定義については、次の具体的な話。

非終端記号を少なくとも年末まで:非終端記号のVNセットは、非終端記号Nは文字または一連ことができるスプリットを指し、それは再帰的定義を取り
端部に対応する、からなる非終端記号列フーは、文字の言語を使用して、分割されません。従ってVNが全てに格納されている
非終端記号、VTは、すべてのターミネータに格納されています。

単純に言う:ターミネータはターミネーターの派生で、もはや行く導き出すことはできません。代わりに、ターミネータは、それを引き出すために続けることができます。

Pは、すべてのストレージ生産のセットです。それの生産は何ですか?生産は、派生ルールです。例えば→Bは、の生産という規則である
生式は、Bによって誘導することができます。

彼は、フロント・コントロール・非終端及びターミネーターは、ターミネーターができません導出されるので、左側にのみ非終端記号は、生成されることが理解されるべきであると述べ
て行きます。右は、端末と非終端記号を持っているかもしれないが。数学の知識表現のセットで、それは次のとおりです。

生産はα→βの形であり、α生産は、β生産は右の部分と呼ばれ、左側の部分と呼ばれるαは、VNに属し、β∈(VN∪VT)*、α∉ε

最後に、S、Sは、非終端の農産物左側の部分の始まりで開始記号、である、それはすべての導出が始まりました。例えば

B→A
B→C | D
C→E
→Bは生産の始まりであり、Aは非終端記号の始まりはSであります 非終端記号S、S∈VNそう。
第二に、文法や言語の導出

例えば:
G(E):

E => E + T | T

T => T * F | F

F =>(E)|私は
私は私が式を導出+ *見つける:
E => E + T
=> T + T
=> T * F. + T
=> F. * F. + T
=>私はF. + Tを*
=> T + IがI *
=>を私はF.を+ * I
=>私は* +
元素変換を左右する権利を導出する。同様。
第三に、文、文
:文法Gのために[S]
場合:S => A、そしてGの文と呼ばれ、
開始記号は、最も簡単な文章です。
場合:AはG文の[S]、およびVTの一部であり、
それは、文と呼ばれるG [S]と呼ばれ、
それは、すべての文文はターミネーターその存在です。
IV。木と曖昧解析
我々は別の文の導出に一文から見つけることがユニークではありません。例えば、E + E-から>私は2つの派生あり、Iを+。

E+E->E+i->i+i 最右推导,每个推导过程都是从最右边的非终结符号的替换开始
E+E->i+E->i+i 最左推导,每个推导过程都是从最左边的非终结符号的替换开始
当然为了对句子的结构进行一个确定性的分析,我们一般只考虑最左推导或者最右推导。

前面我们提到过用一种树形的图示来表示这个句型的推导过程,这棵树就被称为”语法分析树“,简称”语法树“。
对于一个文法,如果它的某些句子对应两棵不同的语法树,这个文法就属于“二义性文法”。
注意,文法的二义性和我们通常所说的语言的二义性不同,我们可能有两个不同的文法G1,G2,一个是二义性,
一个是非二义性,但是可能L(G1) = L(G2)。对于程序语言来说,我们常常希望它的文法是非二义性的,但
是,只要我们能够控制和驾驭文法的二义性,文法二义性的存在也不一定是坏事。

现在已经证明了,文法二义性是不可判定的。也就是说不存在一个算法,在有限步骤内算出一个文法是不是二义
性的。我们能做的事儿,就是找一组充分条件来说明非二义性。比如,规定运算符号的优先级和结合性。

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

整数n

标识符i

表达式e

条件语句

赋值语句

复合语句

函数

程序

...
答:
整数n <整数n>::=int <标识符n>=<无符号整数>|<有符号整数>;
标识符i <标识符i>::= <字符类型> <字母|数字>;
表达式e <表达式> ::= [+ | -] <项> { <加法运算符><项>}
条件语句 <表达式>{语句} ;|<表达式>{句子}
赋值语句 <标识符>=<无符号整数>|<有符号整数>;
<复合语句> ::= BEGIN <语句> {;<语句>} END
函数 <数据类型> <标识符>(形式参数...){句子;...}
<程序> ::= <分程序>.
<分程序> ::= [<常量说明部分>] [<变量说明部分>]
[<过程说明部分>] <语句>
...

おすすめ

転載: www.cnblogs.com/huangwenshuo/p/11588342.html