1.梳理第二章的内容,写一篇理解与总结。
编译器:最基本的数学模型是有穷状态机FSM和正则表达式。它们用来描述词法单位(关键字,标识符)以及被编译器用来识别这些单位的算法。此外,上下文无关文法用于描述程序设计语言的语法结构。
标识符:是一个字符串。所有的标识符都是名字,但有些名字也可以是表达式,变量指向存储中的某个特定位置。
一个函数通常有一个返回值,而一个过程不返回任何值。方法在OO语言中和特定类相关联。
声明:告诉我们事务的类型,而定义告诉我们它们的值。
语法:描述该语言的正确形式。语义定义程序的含义。
词法:单元由各名字和属性值组成,这些词法单元也称为终结符号。
一个文法描述了程序的层次结构。文法的定义使用了称为终结符号的基本符号和称为非终结符号的变量符号。这些符号代表了语言的构造。文法分成4种类型,即0型、1型、2型、3型。区别在于产生式施加的限制不同;以上下文无关文法文法为例:设G(Vn,Vt,P,S),若P中的每个产生式的形式都是A->aB或A->a,其中A和B都是非终结符,a€Vt,则G是3型文法或正规文法,每一种正规文法都是上下文无关的。
语法树,一般一个文法只存在一种语法树,即最左推导和最右边推导的语法树是一样的,不存在二义性。
词法分析器:从输入中逐个读取字符,并输出一个词法单元的流。
语法分析:从一个文法开始符号推导出一个给定的终结符号串。推导的方法是反复将某个非终结符替换为它的某个产生式的体。
语法分析的结构是中间代码,具体有抽象语法树AST和三地址代码TAC。
词法分析器扫描源程序并输出一个由词法单元组成的序列。
2. 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)
Pl/0语言文法的BNF表示:
〈程序〉→〈分程序〉.
〈分程序〉→ [<常量说明部分>][<变量说明部分>][<过程说明部分>]〈语句〉
<常量说明部分> → CONST<常量定义>{ ,<常量定义>};
<常量定义> → <标识符>=<无符号整数>
<无符号整数> → <数字>{<数字>}
<变量说明部分> → VAR<标识符>{ ,<标识符>};
<标识符> → <字母>{<字母>|<数字>}
<过程说明部分> → <过程首部><分程序>;{<过程说明部分>}
<过程首部> → procedure<标识符>;
<语句> → <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空>
<赋值语句> → <标识符>:=<表达式>
<复合语句> → begin<语句>{;<语句>}end
<条件> → <表达式><关系运算符><表达式>|odd<表达式>
<表达式> → [+|-]<项>{<加减运算符><项>}
<项> → <因子>{<乘除运算符><因子>}
<因子> → <标识符>|<无符号整数>|(<表达式>)
<加减运符> → +|-
<乘除运算符> → *|/
<关系运算符> → =|#|<|<=|>|>=
<字母> → a|b|c…x|y|z
<数字> → 0|1|2…7|8|9
<条件语句> → if<条件>then<语句>
<过程调用语句> → call<标识符>
<当型循环语句> → while<条件>do<语句>
<读语句> → read(<标识符>{,<标识符>})
<写语句> → write(<表达式>{,<表达式>})