1梳理第二章的内容,写一篇理解与总结。
一种语言必定他的文法去描述,它的完整定义包括语法和语义两个方面。语言和语法是指一组规则,用它可以形成和产生一个合适的程序。目前广泛使用的是上下文无关文法,也就是用上下文无关文法作为程序设计的描述工具,比如用A:=B+C表示是一个合法的赋值语句,则A:=B+就不是合法的赋值语句。
什么是文法?文法相当于语言学(人类语言)中的语义分析,即分析一个句所表示的含义。它是产生中间代码或目标代码的依据。
文法定义:
文法G定义为四元组(Vn,VT,P,S):
VN:为非终结符(语法实体,或变量)集,常用大写字母表示;
VT:为终结符,常用小写字母表示;
P:为规则的集合,规则的左边属于V并且至少包含一个非终结符;
S:为识别符或是开始符,是一个非终结符,至少要在一条规则中作为左部出现。
推导是正向推导,归约是逆向推导。
文法类型:
0型文法/无限制文法:α->β,其中α∈(Vn∪Vt)*且至少含有一个非终结符,β∈(Vn∪Vt)*。
1型文法/上下文有关文法:αAβ->αuβ,其中A∈Vn,α,β∈(Vn∪Vt)*,u∈(Vn∪Vt)+。
2型文法/上下文无关文法:A->β,其中A∈Vn,β∈(Vn∪Vt)*。常用于句法分析。
3型文法/正规文法:常用于词法分析
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
由于不是很会就把规则列出来了。
<程序> -> <分程序>
<分程序> -> [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
<常量说明部分> -> CONST<常量定义>{ ,<常量定义>};
<常量定义> -> <标识符>=<无符号整数>
<无符号整数> -> <数字>{<数字>}
<变量说明部分> -> VAR<标识符>{ ,<标识符>};
<标识符> -> <字母>{<字母>|<数字>}
<过程说明部分> -> <过程首部><分程度>;{<过程说明部分>}
<过程首部> -> procedure<标识符>;
<语句> -> <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空>
<赋值语句> -> <标识符>:=<表达式>
<复合语句> -> begin<语句>{ ;<语句>}<end>
<条件> -> <表达式><关系运算符><表达式>|odd<表达式>
<表达式> -> [+|-]<项>{<加减运算符><项>}
<项> -> <因子>{<乘除运算符><因子>}
<因子> -> <标识符>|<无符号整数>|(<表达式>)
<加减运符> -> +|-
<乘除运算符> -> *|/
<关系运算符> -> =|#|<|<=|>|>=
<条件语句> -> if<条件>then<语句>
<过程调用语句> -> call<标识符>
<当型循环语句> -> while<条件>do<语句>
<读语句> -> read(<标识符>{ ,<标识符>})
<写语句> -> write(<标识符>{,<标识符>})
<字母> -> a|b|c…x|y|z
<数字> -> 0|1|2…7|8|9