5) 错误类型 5: 赋值号两边的表达式类型不匹配 6) 错误类型 6: 赋值号左边出现一个只有右值的表达式 7) 错误类型 7: 操作数类型不匹配或操作数类型与操作符不匹配 ( 例如整型变量与数组变量相加减, 或数组 ( 或结构体 ) 变量与数组 ( 或结构体 ) 结构体变量相加减 ) 8) 错误

Size: px
Start display at page:

Download "5) 错误类型 5: 赋值号两边的表达式类型不匹配 6) 错误类型 6: 赋值号左边出现一个只有右值的表达式 7) 错误类型 7: 操作数类型不匹配或操作数类型与操作符不匹配 ( 例如整型变量与数组变量相加减, 或数组 ( 或结构体 ) 变量与数组 ( 或结构体 ) 结构体变量相加减 ) 8) 错误"

Transcription

1 3. 语义分析 本章实验为实验二, 任务是在词法分析和语法分析程序的基础上编写一个程序, 对 C 源代码进行语义分析和类型检查, 并打印分析结果 与实验一不同的是, 实验二不再借助已有的工具, 所有的任务都必须手写代码来完成 另外, 虽然语义分析在整个编译器的实现中并不是难度最大的任务, 但却是最细致 琐碎的任务 因此需要用心地设计诸如符号表 变量类型等数据结构的实现细节, 从而正确 高效地实现语义分析的各种功能 需要注意的是, 由于在后面的实验中还会用到本次实验已经写好的代码, 因此保持一个良好的代码风格 系统地设计代码结构和各模块之间的接口对于整个实验来讲相当重要 3.1 实验内容 实验要求在本次实验中, 我们对 C 语言做如下假设, 你可以认为这些就是 C 语言的特性 ( 注意, 假设 可能因后面的不同选做要求而有所改变 ): 1) 假设 1: 整型 (int) 变量不能与浮点型 (float) 变量相互赋值或者相互运算 2) 假设 2: 仅有 int 型变量才能进行逻辑运算或者作为 if 和 while 语句的条件 ; 仅有 int 型和 float 型变量才能参与算术运算 3) 假设 3: 任何函数只进行一次定义, 无法进行函数声明 4) 假设 4: 所有变量 ( 包括函数的形参 ) 的作用域都是全局的, 即程序中所有变量均不能重名 5) 假设 5: 结构体间的类型等价机制采用名等价 (Name Equivalence) 的方式 6) 假设 6: 函数无法进行嵌套定义 7) 假设 7: 结构体中的域不与变量重名, 并且不同结构体中的域互不重名 以上假设 1 至 7 也可视为要求, 违反即会导致各种语义错误, 不过我们只对后面讨论的 17 种错误类型进行考察 此外, 你可以安全地假设输入文件中不包含注释 八进制数 十六进制数 以及指数形式的浮点数, 也不包含任何词法或语法错误 ( 除了特别说明的针对选做要求的测试 ) 你的程序需要对输入文件进行语义分析 ( 输入文件中可能包含函数 结构体 一维和高维数组 ) 并检查如下类型的错误 : 1) 错误类型 1: 变量在使用时未经定义 2) 错误类型 2: 函数在调用时未经定义 3) 错误类型 3: 变量出现重复定义, 或变量与前面定义过的结构体名字重复 4) 错误类型 4: 函数出现重复定义 ( 即同样的函数名出现了不止一次定义 ) 40

2 5) 错误类型 5: 赋值号两边的表达式类型不匹配 6) 错误类型 6: 赋值号左边出现一个只有右值的表达式 7) 错误类型 7: 操作数类型不匹配或操作数类型与操作符不匹配 ( 例如整型变量与数组变量相加减, 或数组 ( 或结构体 ) 变量与数组 ( 或结构体 ) 结构体变量相加减 ) 8) 错误类型 8:return 语句的返回类型与函数定义的返回类型不匹配 9) 错误类型 9: 函数调用时实参与形参的数目或类型不匹配 10) 错误类型 10: 对非数组型变量使用 [ ] ( 数组访问 ) 操作符 11) 错误类型 11: 对普通变量使用 ( ) 或 () ( 函数调用 ) 操作符 12) 错误类型 12: 数组访问操作符 [ ] 中出现非整数 ( 例如 a[1.5]) 13) 错误类型 13: 对非结构体型变量使用. 操作符 14) 错误类型 14: 访问结构体中未定义过的域 15) 错误类型 15: 结构体中域名重复定义 ( 指同一结构体中 ), 或在定义时对域进行初始化 ( 例如 struct A { int a = 0; }) 16) 错误类型 16: 结构体的名字与前面定义过的结构体或变量的名字重复 17) 错误类型 17: 直接使用未定义过的结构体来定义变量 其中, 要注意两点 : 一是关于数组类型的等价机制, 同 C 语言一样, 只要数组的基类型和维数相同我们即认为类型是匹配的, 例如 int a[10][2] 和 int b[5][3] 即属于同一类型 ; 二是我们允许类型等价的结构体变量之间的直接赋值 ( 见后面的测试样例 ), 这时的语义是, 对应的域相应赋值 ( 数组域也如此, 按相对地址赋值直至所有数组元素赋值完毕或目标数组域已经填满 ) 除此之外, 你的程序可以选择完成以下部分或全部的要求 : 1) 要求 2.1: 修改前面的 C 语言假设 3, 使其变为 函数除了在定义之外还可以进行声明 函数的定义仍然不可以重复出现, 但函数的声明在相互一致的情况下可以重复出现 任一函数无论声明与否, 其定义必须在源文件中出现 在新的假设 3 下, 你的程序还需要检查两类新的错误和增加新的产生式 : a) 错误类型 18: 函数进行了声明, 但没有被定义 b) 错误类型 19: 函数的多次声明互相冲突 ( 即函数名一致, 但返回类型 形参数量或者形参类型不一致 ), 或者声明与定义之间互相冲突 c) 由于 C 语言文法中并没有与函数声明相关的产生式, 因此你需要先对该文法进行适当修改 对于函数声明来说, 我们并不要求支持像 int foo(int, float) 这样省略参数名的函数声明 在修改的时候要留意, 你的改动应该以不影响其它错误类型的检查为原则 41

3 2) 要求 2.2: 修改前面的 C 语言假设 4, 使其变为 变量的定义受可嵌套作用域的影响, 外层语句块中定义的变量可在内层语句块中重复定义 ( 但此时在内层语句块中就无法访问到外层语句块的同名变量 ), 内层语句块中定义的变量到了外层语句块中就会消亡, 不同函数体内定义的局部变量可以相互重名 在新的假设 4 下, 完成错误类型 1 至 17 的检查 3) 要求 2.3: 修改前面的 C 语言假设 5, 将结构体间的类型等价机制由名等价改为结构等价 (Structural Equivalence) 例如, 虽然名称不同, 但两个结构体类型 struct a { int x; float y; } 和 struct b { int y; float z; } 仍然是等价的类型 注意, 在结构等价时不要将数组展开来判断, 例如 struct A { int a; struct { float f; int i; } b[10]; } 和 struct B { struct { int i; float f; } b[10]; int b;} 是不等价的 在新的假设 5 下, 完成错误类型 1 至 17 的检查 输入格式你的程序的输入是一个包含 C 源代码的文本文件, 该源代码中可能会有语义错误 你的程序需要能够接收一个输入文件名作为参数 例如, 假设你的程序名为 cc 输入文件名为 test1 程序和输入文件都位于当前目录下, 那么在 Linux 命令行下运行./cc test1 即可获得以 test1 作为输入文件的输出结果 输出格式实验二要求通过标准输出打印程序的运行结果 对于那些没有语义错误的输入文件, 你的程序不需要输出任何内容 对于那些存在语义错误的输入文件, 你的程序应当输出相应的错误信息, 这些信息包括错误类型 出错的行号以及说明文字, 其格式为 : Error type [ 错误类型 ] at Line [ 行号 ]: [ 说明文字 ]. 说明文字的内容没有具体要求, 但是错误类型和出错的行号一定要正确, 因为这是判断输出的错误提示信息是否正确的唯一标准 请严格遵守实验要求中给定的错误分类, 否则将影响你的实验评分 输入文件中可能包含一个或者多个错误 ( 但每行最多只有一个错误 ), 你的程序需要将它们全部检查出来 当然, 有些时候输入文件中的一个错误会产生连锁反应, 导致别的地方出现多个错误 ( 例如, 一个未定义的变量在使用时由于无法确定其类型, 会使所有包含该变量的表达式产生类型错误 ), 我们只会去考察你的程序是否报告了较本质那个的错误 ( 如果难以确定哪个错误更本质一些, 建议你报告所有发现的错误 ) 但是, 如果源程序里有错而你的程序没有报错或报告的错误类型不对, 又或者源程序里没有错但你的程序却报错, 都会影响你的实验评分 测试环境 你的程序将在如下环境中被编译并运行 : 42

4 1) GNU Linux Release: Ubuntu 12.04, kernel version ; 2) GCC version 4.6.3; 3) GNU Flex version ; 4) GNU Bison version 2.5 一般而言, 只要避免使用过于冷门的特性, 使用其它版本的 Linux 或者 GCC 等, 也基本上不会出现兼容性方面的问题 注意, 实验二的检查过程中不会去安装或尝试引用各类方便编程的函数库 ( 如 glib 等 ), 因此请不要在你的程序中使用它们 提交要求实验二要求提交如下内容 : 1) Flex Bison 以及 C 语言的可被正确编译运行的源程序 2) 一份 PDF 格式的实验报告, 内容包括 : a) 你的程序实现了哪些功能? 简要说明如何实现这些功能 清晰的说明有助于助教对你的程序所实现的功能进行合理的测试 b) 你的程序应该如何被编译? 可以使用脚本 makefile 或逐条输入命令进行编译, 请详细说明应该如何编译你的程序 无法顺利编译将导致助教无法对你的程序所实现的功能进行任何测试, 从而丢失相应的分数 c) 实验报告的长度不得超过一页! 所以实验报告中需要重点描述的是你的程序中的亮点, 是你认为最个性化 最具独创性的内容, 而相对简单的 任何人都可以做的内容则可不提或简单地提一下, 尤其要避免大段地向报告里贴代码 实验报告中所出现的最小字号不得小于五号字 ( 或英文 11 号字 ) 样例 ( 必做内容 ) 实验二的样例包括必做内容样例与选做要求样例两部分, 分别对应于实验要求中的必做内 容和选做要求 请仔细阅读样例, 以加深对实验要求以及输出格式要求的理解 这节列举必做 内容样例 样例 1: 3 int i = 0; 4 j = i + 1; 样例输入中变量 j 未定义, 因此你的程序可以输出如下的错误提示信息 : Error type 1 at Line 4: Undefined variable "j". 43

5 样例 2: 3 int i = 0; 4 inc(i); 样例输入中函数 inc 未定义, 因此你的程序可以输出如下的错误提示信息 : Error type 2 at Line 4: Undefined function "inc". 样例 3: 3 int i, j; 4 int i; 样例输入中变量 i 被重复定义, 因此你的程序可以输出如下的错误提示信息 : Error type 3 at Line 4: Redefined variable "i". 样例 4: 1 int func(int i) 3 return i; 4 } 5 6 int func() 7 { 8 return 0; 9 } } 样例输入中函数 func 被重复定义, 因此你的程序可以输出如下的错误提示信息 : Error type 4 at Line 6: Redefined function "func". 样例 5: 3 int i; 4 i = 3.7; 44

6 样例输入中错将一个浮点常数赋值给一个整型变量, 因此你的程序可以输出如下的错误提 示信息 : 息 : Error type 5 at Line 4: Type mismatched for assignment. 样例 6: 3 int i; 4 10 = i; 样例输入中整数 10 出现在了赋值号的左边, 因此你的程序可以输出如下的错误提示信 样例 7: Error type 6 at Line 4: The left-hand side of an assignment must be a variable. 3 float j; j; 样例输入中表达式 10 + j 的两个操作数的类型不匹配, 因此你的程序可以输出如下的错 误提示信息 : 息 : Error type 7 at Line 4: Type mismatched for operands. 样例 8: 3 float j = 1.7; 4 return j; 样例输入中 main 函数返回值的类型不正确, 因此你的程序可以输出如下的错误提示信 Error type 8 at Line 4: Type mismatched for return. 样例 9: 1 int func(int i) 3 return i; 4 } 45

7 5 6 int main() 7 { 8 func(1, 2); 9 } 样例输入中调用函数 func 时实参数目不正确, 因此你的程序可以输出如下的错误提示 信息 : Error type 9 at Line 8: Function "func(int)" is not applicable for arguments 样例 10: "(int, int)". 3 int i; 4 i[0]; 样例输入中变量 i 非数组型变量, 因此你的程序可以输出如下的错误提示信息 : Error type 10 at Line 4: "i" is not an array. 样例 11: 3 int i; 4 i(10); 样例输入中变量 i 不是函数, 因此你的程序可以输出如下的错误提示信息 : Error type 11 at Line 4: "i" is not a function. 样例 12: 3 int i[10]; 4 i[1.5] = 10; 样例输入中数组访问符中出现了非整型常数 1.5, 因此你的程序可以输出如下的错误提 示信息 : Error type 12 at Line 4: "1.5" is not an integer. 样例 13: 1 struct Position 46

8 3 float x, y; 4 }; 5 6 int main() 7 { 8 int i; 9 i.x; 10 } 样例输入中变量 i 非结构体类型变量, 因此你的程序可以输出如下的错误提示信息 : Error type 13 at Line 9: Illegal use of ".". 样例 14: 1 struct Position 3 float x, y; 4 }; 5 6 int main() 7 { 8 struct Position p; 9 if (p.n == 3.7) 10 return 0; 11 } 样例输入中结构体变量 p 访问了未定义的域 n, 因此你的程序可以输出如下的错误 提示信息 : Error type 14 at Line 9: Non-existent field "n". 样例 15: 1 struct Position 3 float x, y; 4 int x; ; 6 7 int main() 8 { 9 } 样例输入中结构体的域 x 被重复定义, 因此你的程序可以输出如下的错误信息 : Error type 15 at Line 4: Redefined field "x". 样例 16: 1 struct Position 3 float x; 4 }; 5 6 struct Position 47

9 7 { 8 int y; 9 }; } 样例输入中两个结构体的名字重复, 因此你的程序可以输出如下的错误信息 : Error type 16 at Line 6: Duplicated name "Position". 样例 17: 3 struct Position pos; 4 } 样例输入中结构体 Position 未经定义, 因此你的程序可以输出如下的错误信息 : Error type 17 at Line 3: Undefined structure "Position" 样例 ( 选做要求 ) 这节列举选做要求样例 样例 1: 1 int func(int a); 2 3 int func(int a) 4 { 5 return 1; 6 } 7 8 int main() 9 { 10 } 如果你的程序需要完成要求 2.1, 这个样例输入不存在任何词法 语法或语义错误, 因此不 需要输出 如果你的程序不需要完成要求 2.1, 这个样例输入存在语法错误, 因此你的程序可以输出如 下的错误提示信息 : Error type B at Line 1: Incomplete definition of function "func". 样例 2: 1 struct Position 3 float x,y; 4 }; 5 48

10 6 int func(int a); 7 8 int func(struct Position p); 9 10 int main() 11 { 12 } 如果你的程序需要完成要求 2.1, 这个样例输入存在两处语义错误 : 一是函数 func 的两 次声明不一致 ; 二是函数 func 未定义, 因此你的程序可以输出如下的错误提示信息 : Error type 19 at Line 8: Inconsistent declaration of function "func". Error type 18 at Line 6: Undefined function "func". 注意, 我们对错误提示信息的顺序不做要求 如果你的程序不需要完成要求 2.1, 这个样例输入存在两处语法错误, 因此你的程序可以输 出如下的错误提示信息 : Error type B at Line 6: Incomplete definition of function "func". Error type B at Line 8: Incomplete definition of function "func". 样例 3: 1 int func() 3 int i = 10; 4 return i; 6 7 int main() 8 { 9 int i; 10 i = func(); 11 } 如果你的程序需要完成要求 2.2, 这个样例输入不存在任何词法 语法或语义错误, 因此不 需要输出 如果你的程序不需要完成要求 2.2, 样例输入中的变量 i 被重复定义, 因此你的程序可以 输出如下的错误提示信息 : Error type 3 at Line 9: Redefined variable "i". 样例 4: 1 int func() 3 int i = 10; 4 return i; 6 7 int main() 8 { 9 int i; 10 int i, j; 49

11 11 i = func(); 12 } 如果你的程序需要完成要求 2.2, 样例输入中的变量 i 被重复定义, 因此你的程序可以输 出如下的错误提示信息 : Error type 3 at Line 10: Redefined variable "i". 如果你的程序不需要完成要求 2.2, 样例输入中的变量 i 被重复定义了两次, 因此你的程 序可以输出如下的错误提示信息 : Error type 3 at Line 9: Redefined variable "i". Error type 3 at Line 10: Redefined variable "i". 样例 5: 1 struct Temp1 3 int i; 4 float j; ; 6 7 struct Temp2 8 { 9 int x; 10 float y; 11 }; int main() 14 { 15 struct Temp1 t1; 16 struct Temp2 t2; 17 t1 = t2; 18 } 如果你的程序需要完成要求 2.3, 这个样例输入不存在任何词法 语法或语义错误, 因此不 需要输出 如果你的程序不需要完成要求 2.3, 样例输入中的语句 t1 = t2; 其赋值号两边变量的类型 不匹配, 因此你的程序可以输出如下的错误提示信息 : Error type 5 at Line 17: Type mismatched for assignment. 样例 6: 1 struct Temp1 3 int i; 4 float j; ; 6 7 struct Temp2 8 { 9 int x; 10 }; int main() 50

12 13 { 14 struct Temp1 t1; 15 struct Temp2 t2; 16 t1 = t2; 17 } 如果你的程序需要完成要求 2.3, 样例输入中的语句 t1 = t2; 其赋值号两边变量的类型不 匹配, 因此你的程序可以输出如下的错误提示信息 : Error type 5 at Line 16: Type mismatched for assignment. 如果你的程序不需要完成要求 2.3, 应该输出与上述一样的错误提示信息 : Error type 5 at Line 16: Type mismatched for assignment. 3.2 实验指导除了词法和语法分析之外, 编译器前端所要进行的另一项工作就是对输入程序进行语义分析 进行语义分析的原因很简单 : 一段语法上正确的源代码仍可能包含严重的逻辑错误, 这些逻辑错误可能会对编译器后面阶段的工作产生影响 首先, 我们在语法分析阶段所借助的理论工具是上下文无关文法, 从名字上就可以看出上下文无关文法没有办法处理一些与输入程序上下文相关的内容 ( 例如变量在使用之前是否已经被定义过, 一个函数内部定义的变量在另一个函数中是否允许使用等 ) 这些与上下文相关的内容都会在语义分析阶段得到处理, 因此也有人将这一阶段叫做上下文相关分析 (Context-sensitive Analysis) 其次, 现代程序设计语言一般都会引入类型系统, 很多语言甚至是强类型的 引入类型系统可以为程序设计语言带来很多好处, 例如它可以提高代码在运行时刻的安全性, 增强语言的表达力, 还可以使编译器为其生成更高效的目标代码 对于一个具有类型系统的语言来说, 编译器必须要有能力检查输入程序中的各种行为是否都是类型安全的, 因为类型不安全的代码出现逻辑错误的可能性很高 最后, 为了使之后的阶段能够顺利进行, 编译器在面对一段输入程序时不得不从语法之外的角度进行理解 比如, 假设输入程序中有一个变量或函数 x, 那么编译器必须要提前确定 : 1) 如果 x 是一个变量, 那么变量 x 中存储的是什么内容? 是一个整数值 浮点数值, 还是一组整数值或其它自定义结构的值? 2) 如果 x 是一个变量, 那么变量 x 在内存中需要占用多少字节的空间? 3) 如果 x 是一个变量, 那么变量 x 的值在程序的运行过程中会保留多长时间? 什么时候应当创建 x, 而什么时候它又应该消亡? 4) 如果 x 是一个变量, 那么谁该负责为 x 分配存储空间? 是用户显式地进行空间分配, 还是由编译器生成专门的代码来隐式地完成这件事? 5) 如果 x 是一个函数, 那么这个函数要返回什么类型的值? 它需要接受多少个参数, 这些参数又都是什么类型? 51

13 以上这些与变量或函数 x 有关的信息中, 几乎所有都无法在词法或语法分析过程中获得, 即输入程序能为编译器提供的信息要远超过词法和语法分析能从中挖掘出的信息 从编程实现的角度看, 语义分析可以作为编译器里单独的一个模块, 也可以并入前面的语法分析模块或者并入后面的中间代码生成模块 不过, 由于其牵扯到的内容较多而且较为繁杂, 我们还是将语义分析单独作为一块内容 我们下面先对语义分析所要用到的属性文法做简要介绍, 然后对 C 语言编译中的符号表和类型表示这两大重点内容进行讨论, 最后提出帮助顺利完成实验二的一些建议 属性文法在词法分析过程中, 我们借助了正则文法 ; 在语法分析过程中, 我们借助了上下文无关文法 ; 现在到了语义分析部分, 为什么我们不能在文法体系中更上一层, 采用比上下文无关文法表达力更强的上下文相关文法呢? 之所以不继续采用更强的文法, 原因有两个 : 其一, 识别一个输入是否符合某一上下文相关文法, 这个问题本身是 P-Space Complete 1 的, 也就是说, 如果使用上下文相关文法那么编译器的复杂度会很高 ; 其二, 编译器需要获取的很多信息很难使用上下文相关文法进行编码, 这就迫使我们需要为语义分析寻找其它更实用的理论工具 目前被广泛使用的用于语义分析的理论工具叫做属性文法 (Attribute Grammar), 它是由 Knuth 在 50 年代所提出 属性文法的核心思想是, 为上下文无关文法中的每一个终结符或非终结符赋予一个或多个属性值 对于产生式 A X 1 X n 来说, 在自底向上分析中 X 1 X n 的属性值是已知的, 这样语义动作只会为 A 计算属性值 ; 而在自顶向下分析中,A 的属性值是已知的, 在该产生式被应用之后才能知道 X 1 X n 的属性值 终结符号的属性值通过词法分析可以得到, 非终结符号的属性值通过产生式对应的语义动作来计算 属性值可以分成不相交的两类 : 综合属性 (Synthesized Attribute) 和继承属性 (Inherited Attribute) 在语法树中, 一个结点的综合属性值是从其子结点的属性值计算而来的, 而一个结点的继承属性值则是由该结点的父结点和兄弟结点的属性值计算而来的 如果对一个文法 P, A X 1 X n P 都有与之相关联的若干个属性定义规则, 则称 P 为属性文法 如果属性文法 P 只包含综合属性而没有继承属性, 则称 P 为 S 属性文法 如果每个属性定义规则中的每个属性要么是一个综合属性, 要么是 X j 的一个继承属性, 并且该继承属性只依赖于 X 1 X j 1 的属性和 A 的继承属性, 则称 P 为 L 属性文法 以属性文法为基础可衍生出一种非常强大的翻译模式, 我们称之为语法制导翻译 (Syntax- Directed Translation 或 SDT) 在 SDT 中, 人们把属性文法中的属性定义规则用计算属性值的语义动作来表示, 并用花括号 { 和 } 括起来, 它们可被插入到产生式右部的任何合适的

14 位置上, 这是一种语法分析和语义动作交错的表示法 事实上, 我们在之前使用 Bison 时已经 用到了属性文法和 SDT 符号表符号表对于编译器至关重要 在编译过程中, 编译器使用符号表来记录源程序中各种名字的特性信息 所谓 名字 包括 : 程序名 过程名 函数名 用户定义类型名 变量名 常量名 枚举值名 标号名等, 所谓 特性信息 包括 : 上述名字的种类 具体类型 维数 参数个数 数值及目标地址 ( 存储单元地址 ) 等 符号表上的操作包括填表和查表两种 当分析到程序中的说明或定义语句时, 应将说明或定义的名字, 以及与之有关的特性信息填入符号表中, 这便是填表操作 查表操作则使用得更为广泛, 需要使用查表操作的情况有 : 填表前查表, 包括检查在输入程序的同一作用域内名字是否被重复定义, 检查名字的种类是否与说明一致, 对于那些类型要求更强的语言, 则要检查表达式中各变量的类型是否一致等 ; 此外生成目标指令时, 也需要查表以取得所需要的地址或者寄存器编号等 符号表的组织方式也有多种, 可以将程序中出现的所有符号组织成一张表, 也可以将不同种类的符号组织成不同的表 ( 例如, 所有变量名组织成一张表, 所有函数名组织成一张表, 所有临时变量组织成一张表, 所有结构体定义组织成一张表, 等等 ) 你可以针对每个语句块 每个结构体都新建一张表, 也可以将所有语句块中出现的符号全部插入到同一张表中 符号表可以仅支持插入操作而不支持删除操作 ( 此时如果要实现作用域则需要将符号表组织成层次结构 ), 也可以组织一张既可以插入又可以删除的 支持动态更新的表 不同的组织方式各有利弊, 你可仔细思考并为实验二做出决定 至于在符号表里应该填些什么, 这与不同程序设计语言的特性相关, 更取决于编译器的设计者本身 只要觉得方便, 可以向符号表里填任何内容! 毕竟符号表就是为了支持编写编译器而设置的 就实验二而言, 对于变量至少要记录变量名及其类型, 对于函数至少要记录其返回类型 参数个数以及参数类型 至于符号表应该采用何种数据结构实现, 这个问题同样没有统一的答案 不同的数据结构有不同的时间复杂度 空间复杂度以及编程难度, 我们下面讨论几种最常见的选择 线性链表 : 符号表里所有的符号 ( 假设有 n 个, 下同 ) 都用一条链表串起来, 插入一个新的符号只需将该符号放在链表的表头, 其时间复杂度是 O(1) 在链表中查找一个符号需要对其进行遍历, 时间复杂度是 O(n) 删除一个符号只需要将该符号从链表里摘下来, 不过在摘之前由于我们必须要执行一次查找操作以找到待删除的结点, 因此时间复杂度也是 O(n) 链表的最大问题是它的查找和删除效率太低, 一旦符号表中的符号数量较大, 查表操作将变得十分耗时 不过, 使用链表的好处也是显而易见 : 它的结构简单, 编程容易, 可以被快速 53

15 实现 如果你事先能够确定表中的符号数目较少 ( 例如, 在结构体定义中或在面向对象语言的 一些短方法中 ), 链表是一个非常不错的选择 平衡二叉树 : 相对于只能执行线性查找的链表而言, 在平衡二叉树上进行查找天生就是二分查找 在一 个典型的平衡二叉树实现 ( 例如 AVL 树 红黑树或伸展树 1 等 ) 上查找一个符号的时间复杂度 是 O(logn) 插入一个符号相当于进行一次失败的查找而找到待插入的位置, 时间复杂度也是 O(logn) 删除一个符号可能需要做更多的维护操作, 但其时间复杂度仍然维持在 O(logn) 的级 别 平衡二叉树相对于其它数据结构而言具有很多优势, 例如较高的搜索效率 ( 在绝大多数应 用中 O(logn) 的搜索效率已经完全可以接受 ) 以及较好的空间效率 ( 它所占用的空间随树中结 点的增多而增长, 不像散列表那样每张表都需要大量的空间 ) 平衡二叉树的缺点是编程难度 高, 成功写完并调试出一个能用的红黑树所需要的时间不亚于你完成实验二所需的时间 不过 如果你真的想要使用类似于红黑树的数据结构, 也可以从其它地方 ( 例如 Linux 内核代码中 ) 寻找别人写好的红黑树源代码 散列表 : 散列表是一种可以达到搜索效率极致的数据结构 一个好的散列表实现可以让插入 查找 和删除的平均时间复杂度都达到 O(1) 同时, 与红黑树等操作复杂的数据结构不同, 散列表在 代码实现上也很简单 : 申请一个大数组, 计算一个散列函数的值, 然后根据该值将对应的符号 放到数组相应下标的位置即可 对于符号表来说, 一个最简单的散列函数 ( 即 hash 函数 ) 可以 把符号名中的所有字符相加, 然后对符号表的大小取模 你可以寻找更好的 hash 函数, 这里我 们提供一个不错的选择, 由 P.J. Weinberger 2 所提出 : 1 unsignedinthash_pjw(char* name) 3 unsignedint val = 0, i; 4 for (; *name; ++name) 5 { 6 val = (val << 2) + *name; 7 if (i = val & ~0x3fff) val = (val ^ (i >> 12)) & 0x3fff; 8 } 9 return val; 10 } 需要注意的是, 代码第 7 行的常数 (0x3fff) 确定了符号表的大小 ( 即 16384), 用户可根据 实际需要调整此常数以获得大小合适的符号表 如果散列表出现冲突, 则可以通过在相应数组 元素下面挂一个链表的方式 ( 称为 open hashing 或 close addressing 3 方法, 推荐使用 ), 或再次 1 数据结构与算法分析 C 语言描述,Mark Allen Weiss 著, 冯舜玺译, 机械工业出版社, 第 和 89 页,2004 年 计算机程序设计艺术第 3 卷排序与查找,Donald E. Knuth 著, 苏运霖译, 国防工业出版社, 第 496 页,2002 年 54

16 计算散列函数的值而为当前符号寻找另一个槽的方式 ( 称为 open addressing 或者 rehashing 1 方法 ) 来解决 如果你还知道一些更酷的技术, 如 multiplicative hash function 以及 universal hash function 2, 那将会使你的散列表的元素分布更加平均一些 由于散列表无论在搜索效率和编程难度上的优异表现, 它已经成为符号表的实现中最常被采用的数据结构 Multiset Discrimination: 虽然散列表的平均搜索效率很高, 但在最坏情况下它会退化为 O(n) 的线性查找, 而且几乎任何确定的散列函数都存在某种最坏的输入 另外, 散列表所要申请的内存空间往往比输入程序中出现的所有符号的数量还要多, 较为浪费 如果我们能只为输入程序中出现的每个符号单独分配一个编号和空间, 那岂不是既省空间又不会有冲突吗?Multiset discrimination 3 就是基于这种想法 在词法分析部分, 我们先统计输入程序中出现的所有符号 ( 包括变量名 函数名等 ), 然后把这些符号按照名字进行排序, 最后申请一张与符号总数量一样大的符号表, 查表功能可通过基于符号名的二分查找实现 支持多层作用域的符号表 如果你的编译器不需要支持变量的作用域 ( 即不需要实现选做要求 2.2), 那可以跳过本节 内容, 不会对实验二的完成产生负面的影响 否则, 请考虑下面这段代码 : 1 2 int f() 3 { 4 int a, b, c; 5 6 a = a + b; 7 if (b > 0) 8 { 9 int a = c * 2; 10 b = b - a; 11 } } 14 函数 f 中定义了变量 a, 在 if 语句中也定义了一个变量 a 如果要支持作用域, 那么 : 第一, 编译器不能在 int a = c * 2; 这个地方报错 ; 第二, 语句 a = a + b; 中的 a 的值应该取外层 定义中 a 的值, 语句 b = b a; 中的 a 的值应该是 if 语句内部定义的 a 的值, 而这两个语句中 b 的值都应该取外层定义中 b 的值 4 那么如何使得我们的符号表支持这样的行为呢? 1 计算机程序设计艺术第 3 卷排序与查找,Donald E. Knuth 著, 苏运霖译, 国防工业出版社, 第 501 页,2002 年 2 算法导论,Thomas H. Corman 等著, 潘金贵 顾铁成 李成法和叶懋译, 机械工业出版社, 第 138 和 139 页, 2007 年 3 Engineering a Compiler, 第 2 版,Keith D. Cooper 和 Linda Torczon 著,Morgan Kaufmann 出版社, 第 256 和 751 页,2011 年 4 我们通常使用的程序设计语言 ( 包括 C C++ 以及 Java) 其作用域规则都来源于 Algol, 即内层的变量定义总会覆 盖外层的变量定义 55

17 Stack Hash table a i i x j j var 图 1. 基于十字链表和 open hashing 散列表的符号表 第一种方法是维护一个符号表栈 假设当前函数 f 有一个符号表, 表里有 a b c 这三个变量的定义 当编译器发现函数中出现了一个被 { 和 } 包含的语句块 ( 在 C 中就相当于发现了 CompSt 语法单元 ) 时, 它会将 f 的符号表压栈, 然后新建一个符号表, 这个符号表里只有变量 a 的定义 当语句块中出现任何表达式使用到某个变量时, 编译器先查找当前的符号表, 如果找到就使用这个符号表里的该变量, 如果找不到则顺着符号表栈向下逐个符号表进行查找, 使用第一个查找成功的符号表里的相应变量 如果查遍所有的符号表都找不到这个变量, 则报告当前语句出现了变量未定义的错误 每当编译器离开某个语句块时, 会先销毁当前的符号表, 然后从栈中弹一个符号表出来作为当前的符号表 这种符号表的维护风格被称为 Functional Style 该维护风格最多会申请 d 个符号表, 其中 d 为语句块的最大嵌套层数 这种风格比较适合于采用链表或红黑树数据结构的符号表实现 假如你的符号表采用的是散列表数据结构, 申请多个符号表无疑会占用大量的空间 另一种维护风格称作 Imperative Style, 它不会申请多个符号表, 而是自始至终在单个符号表上进行动态维护 假设编译器在处理到当前函数 f 时符号表里有 a b c 这三个变量的定义 当编译器发现函数中出现了一个被 { 和 } 包含的语句块, 而在这个语句块中又有新的变量定义时, 它会将该变量插入 f 的符号表里 当语句块中出现任何表达式使用某个变量时, 编译器就查找 f 的符号表 如果查找失败, 则报告一个变量未定义的错误 ; 如果查表成功, 则返回查到的变量定义 ; 如果出现了变量既在外层又在内层被定义的情况, 则要求符号表返回最近的那个定义 每当编译器离开某个语句块时, 会将这个语句块中定义的变量全部从表中删除 Imperative Style 对符号表的数据结构有一定的要求 图 1 是一个满足要求的基于十字链表和 open hashing 散列表的 Imperative Style 的符号表设计 这种设计的初衷很简单 : 除了散列表本身为了解决冲突问题所引入的链表之外, 它从另一维度也引入链表将符号表中属于同一层作用域 56

18 的所有变量都串起来 在图中,a x 同属最外层定义的变量,i j var 同属中间一层定义的变量,i j 同属最内层定义的变量 其中 i j 这两个变量有同名情况, 被分配到散列表的同一个槽内 每次向散列表中插入元素时, 总是将新插入的元素放到该槽下挂的链表以及该层所对应的链表的表头 每次查表时如果定位到某个槽, 则按顺序遍历这个槽下挂的链表并返回这个槽中符合条件的第一个变量, 如此一来便可以保证 : 如果出现了变量既在外层又在内层被定义的情况, 符号表能够返回最内层的那个定义 ( 当然最内层的定义不一定在当前这一层, 因此我们还需要符号表能够为每个变量记录一个深度信息 ) 每次进入一个语句块, 需要为这一层语句块新建一个链表用来串联该层中新定义的变量 ; 每次离开一个语句块, 则需要顺着代表该层语句块的链表将所有本层定义变量全部删除 如何处理作用域是语义分析的一大重点也是难点 考虑到实现难度, 实验二并没有对作用域作过多要求, 但现实世界中的动态作用域将更难实现, 某些与作用域相关的问题甚至涉及代码生成与运行时刻环境! 类型表示 类型 包含两个要素 : 一组值, 以及在这组值上的一系列操作 当我们在某组值上尝试去执行其不支持的操作时, 类型错误就产生了 一个典型程序设计语言的类型系统应该包含如下四个部分 : 1) 一组基本类型 在 C 语言中, 基本类型包括 int 和 float 两种 2) 从一组类型构造新类型的规则 在 C 语言中, 可以通过定义数组和结构体来构造新的类型 3) 判断两个类型是否等价的机制 在 C 语言中, 默认要求实现名等价, 如果你的程序需要完成要求 2.3, 则需实现结构等价 4) 从变量的类型推断表达式类型的规则 目前程序设计语言的类型系统分为两种 : 强类型系统 (Strongly Typed System) 和弱类型系统 (Weakly Typed System) 前者在任何时候都不允许出现任何类型错误, 而后者可以允许某些类型错误出现在运行时刻 强类型系统的语言包括 Java Python LISP Haskell 等, 而弱类型系统的语言最典型的代表就是 C 和 C++ 语言 1 编译器尝试去发现输入程序中的类型错误的过程被称为是类型检查 根据进行检查的时刻的不同, 类型检查可被划分为两类, 即静态类型检查 (Static Type Checking) 和动态类型检查 (Dynamic Type Checking) 前者仅在编译时刻进行类型检查, 不会生成与类型检查有关的任何目标代码, 而后者则需要生成额外的代码在运行时刻检查每次操作的合法性 静态类型 1 有关类型系统强弱的定义在不同的文献中不尽相同, 例如另一种说法是, 强类型系统要求每个变量在定义时都必须赋予一个类型, 并且语言本身很少做隐式类型转换 按照这种标准,C 和 C++ 语言就应该算是强类型语言, 而那些类型系统比 C 还弱的像 Basic JavaScript 才算是弱类型语言 57

19 Variable Name: a Type: Array Size: 10 Type: Array Size: 3 Type: int 检查的好处是生成的目标代码效率高, 缺点是粒度比较粗, 某些运行时刻的类型错误可能检查 不出来 动态类型检查的好处是更加精确与全面, 但由于在运行时执行了过多的检查和维护工 作, 故目标代码的运行效率往往比不上静态类型检查 关于什么样的类型系统更好, 人们进行了长期 激烈而又没有结果的争论 动态类型检查 语言更适合快速开发和构建程序原型 ( 因为这类语言往往不需要指定变量的类型 1 ), 而使用 静态类型检查语言写出来的程序通常拥有更少的错误 ( 因为这类语言往往不允许多态 ) 强类 型系统语言更加健壮, 而弱类型系统语言更加高效 总之, 不同的类型系统特点不一, 目前还 没有哪种选择在所有情况下都比其它选择来得更好 介绍完基本概念后, 我们来考察实现上的问题 如果整个语言中只有基本类型, 那么类型 的表示将会极其简单 : 我们只需用不同的常数代表不同的类型即可 但是, 在引入了数组 ( 尤 其是多维数组 ) 以及结构体之后, 类型的表示就不那么简单了 想像一下如果某个数组的每一 个元素都是结构体类型, 而这个结构体中又有某个域是多维数组, 那么该如何去表示呢? 最简单的表示方法还是链表 多维数组的每一维都可以作为一个链表结点, 每个链表结点 存两个内容 : 数组元素的类型, 以及数组的大小 例如,int a[10][3] 可以表示为图 2 所示的形 式 结构体同样也可以使用链表保存 例如, 结构体 struct SomeStruct { float f; float array[5]; int array2[10][10]; } 可以表示为图 3 所示的形式 图 2. 多维数组的链表表示示例 在代码实现上, 你可以使用如下定义的 Type 结构来表示 C 语言中的类型 : 1 typedef struct Type_* Type; 2 typedef struct FieldList_* FieldList; 3 4 struct Type_ 5 { 6 enum { BASIC, ARRAY, STRUCTURE } kind; 7 union 8 { 9 // 基本类型 10 int basic; 11 // 数组类型信息包括元素类型与数组大小构成 12 struct { Type elem; int size; } array; 13 // 结构体类型信息是一个链表 14 FieldList structure; 1 u; 1 对于那些对变量没有类型限制的语言, 有一种生动形象的说法是, 这类语言采用了 鸭子类型系统 (duck typing): 如果一个东西走起来像一只鸭子 叫起来也像一只鸭子, 那么它就是一只鸭子 (if it walks like a duck and quacks like a duck, it s a duck) 58

20 Structure Name: somestruct Type: StructureField Name: f Type: float StructureField Name: array Type: Array Size: 5 Type: float StructureField Name: array2 Type: Array Size: 10 Type: Array Size: 10 Type: int 16 }; struct FieldList_ 19 { 20 char* name; // 域的名字 21 Type type; // 域的类型 22 FieldList tail; // 下一个域 23 }; 同作用域一样, 类型系统也是语义分析的一个重要的组成部分 C 语言属于强类型系 统, 并且进行静态类型检查 当我们尝试着向 C 语言中添加更多的性质, 例如引入指针 面 向对象机制 显式 / 隐式类型转换 类型推断等时, 你会发现实现编译器的复杂程度会陡然上 升 一个严谨的类型检查机制需要通过将类型规则转化为形式系统, 并在这个形式系统上进行 逻辑推理 为了控制实验的难度我们可以无需这样费事, 但应该清楚实用的编译器内部类型检 查要复杂的多 图 3. 结构体的链表表示示例 语义分析提示实验二需要在实验一的基础上完成, 特别是需要在实验一所构建的语法树上完成 实验二仍然需要对语法树进行遍历以进行符号表的相关操作以及类型的构造与检查 你可以模仿 SDT 在 Bison 代码中插入语义分析的代码, 但我们更推荐的做法是,Bison 代码只用于构造语法树, 而把和语义分析相关的代码都放到一个单独的文件中去 如果采用前一种做法, 所有语法结点的属性值请尽量使用综合属性 ; 如果采用后一种做法, 就没有这些限制 每当遇到语法单元 ExtDef 或者 Def, 就说明该结点的子结点们包含了变量或者函数的定义信息, 这时候应当将这些信息通过对子结点们的遍历提炼出来并插入到符号表里 每当遇到语法单元 Exp, 说明该结点及其子结点们会对变量或者函数进行使用, 这个时候应当查符号表以确认这些变量或者函数是否存在以及它们的类型是什么 具体如何进行插入与查表, 取决于你的符号表和类型系统的实现 实验二要求检查的错误类型较多, 因此你的代码需要处理的内容也 59

21 较复杂, 请仔细完成 还有一点值得注意, 在发现一个语义错误之后不要立即退出程序, 因为实验要求中有说明需要你的程序有能力查出输入程序中的多个错误 实验要求的必做内容共有 17 种语义错误需要检查, 大部分只涉及到查表与类型操作, 不过有一个错误例外, 那就是有关左值的错误 简单地说, 左值代表地址, 它可以出现在赋值号的左边或者右边 ; 右值代表数值, 它只能出现在赋值号的右边 变量 数组访问以及结构体访问一般既有左值又有右值, 但常数 表达式和函数调用一般只有右值而没有左值 例如, 赋值表达式 x = 3 是合法的, 但 3 = x 是不合法的 ;y = x + 3 是合法的, 但 x + 3 = y 是不合法的 简单起见, 你可以只从语法层面来检查左值错误 : 赋值号左边能出现的只有 ID Exp LB Exp RB 以及 Exp DOT ID, 而不能是其它形式的语法单元组合 最后 5 种语义错误都与结构体有关, 结构体我们前面提到过, 可以使用链表进行表示 选做要求 2.1 与函数声明有关, 函数声明需要你在语法中添加产生式, 并在符号表中记录每个函数当前的状态 : 是被实现了, 还是只被声明未被实现 要求 2.2 涉及作用域, 作用域的实现方法前文已经讨论过 要求 3.3 为实现结构等价, 对于结构等价来说, 你只需要在判断两个类型是否相等时不是直接去比较类型名, 而是针对结构体中的每个域逐个进行类型比较即可 60

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

STRUCT Tag OptTag ID Tag ID 7..4 Declarators VarDec ID VarDec LB INT RB FunDec ID LP VarList RP ID LP RP VarList ParamDec COMMA VarList ParamDec Param

STRUCT Tag OptTag ID Tag ID 7..4 Declarators VarDec ID VarDec LB INT RB FunDec ID LP VarList RP ID LP RP VarList ParamDec COMMA VarList ParamDec Param 7. 附录 A:C 语言文法 在本附录中, 我们给出 C 语言的文法定义和补充说明 7. 文法定义 7.. Tokens INT /* A sequence of digits without spaces */ FLOAT /* A real number consisting of digits and one decimal point. The decimal point must be surrounded

More information

大侠素材铺

大侠素材铺 编译原理与技术 语法制导翻译 Ⅱ 计算机科学与技术学院 李诚 22/10/2018 Announcement Tutorial on Thursday (25/10/2018) 3B201, Class time Assignment review Q & A Cheng @ Compiler Fall 2018, USTC 2 主要内容 源程序 词法分析器 token 语法分析器 分析树 语义分析

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

大侠素材铺

大侠素材铺 编译原理与技术 词法分析 Ⅱ 计算机科学与技术学院李诚 13/09/2018 主要内容 记号 (token) 源程序 词法分析器 getnexttoken 语法分析器 符号表 词法分析器的自动生成 正则表达式 NFA DFA 化简的 DFA 词法分析器的生成器 Lex: flex jflex Fst lexicl nlyzer genertor 2/51 Regulr Expr to NFA 正则表达式

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

教学输入与学习者的语言输出 温晓虹 本文从三个方面探讨了语言的输入与输出的关系 首先从理论研究的角度讨 论了从语言输入到语言输出的习得过程 实验研究表明 输入的语言素材必须被学习者所接收 即使接收了的内容也并不会自动进入中介语的体系 而是需要进一步对输入语言进行 分解 归类等分析性与综合性的处理 在语言 内化 的基础上 学习者的中介语系统才能 够不断地得到重新组合 趋于目的语 另外 学习者在语言输出前和输出时需要调节

More information

PowerPoint Presentation

PowerPoint Presentation 数据结构与算法 ( 六 ) 张铭主讲 采用教材 : 张铭, 王腾蛟, 赵海燕编写高等教育出版社,2008. 6 ( 十一五 国家级规划教材 ) http://www.jpk.pku.edu.cn/pkujpk/course/sjjg 第 6 章树 C 树的定义和基本术语 树的链式存储结构 子结点表 表示方法 静态 左孩子 / 右兄弟 表示法 动态表示法 动态 左孩子 / 右兄弟 表示法 父指针表示法及其在并查集中的应用

More information

什么是函数式编程?

什么是函数式编程? 函数式编程 FUNCTIONAL PROGRAMMING byvoid@byvoid.com 什么是函数式编程? 真相是 从停机问题开始 Bug 假设有停机判定算法 function halting(func, input) { } return if_func_will_halt_on_input; 充分利用停机判定 function ni_ma(func) { if (halting(func,

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i;

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

Microsoft PowerPoint - L9-v3.pptx

Microsoft PowerPoint - L9-v3.pptx Lecture 9: 语法制导的翻译 -I Xiaoyuan Xie 谢晓园 xxie@whu.edu.cn 计算机学院 E301 Introduction 9.1 概述 语义分析在编译程序中的作用 词法分析 目标代码生成 语法分析 中间代码优化 语义分析 分析 中间代码生成 合成 语法和语义的区别 语法 是描述一个合法定义的程序结构的规则 例如 id( ) 语义 说明一个合法定义的程序的含义

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期  开放本科  期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默 试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默认扩展名为 ( ) A. cpp B. c C. exe D. obj 2. 设 x 和 y 均为逻辑值,

More information

IDEO_HCD_0716

IDEO_HCD_0716 IDEO HCD Toolkit Tencent CDC ...? Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC

More information

工程项目进度管理 西北工业大学管理学院 黄柯鑫博士 甘特图 A B C D E F G 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 甘特图的优点 : 直观明了 ( 图形化概要 ); 简单易懂 ( 易于理解 ); 应用广泛 ( 技术通用 ) 甘特图的缺点 : 不能清晰表示活动间的逻辑关系 WBS 责任分配矩阵 ( 负责〇审批

More information

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 第十一讲 运算符重载 与类型转换 运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 为什么要运算符重载 预定义的运算符只针对基本数据类型, 若要对类的对象进行类似的运算, 需要重新定义运算符的功能 运算符重载实质就是函数重载 : 对已有的运算符赋予多重含义, 使得同一个运算符作用于不同类型的数据时导致不同的行为

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式] 用户定义类型 User-defined Datatypes classes and structs 几何向量 (Geometry Vector) 二维平面上的向量由起点和终点构成 每个点包含两个坐标 (x, y), 因此一个向量需要四个实数表示 Start= (0.9,1.5) Start= (0.4,0.8) int main() { double xstart = 0.4; double xend

More information

ebook14-4

ebook14-4 4 TINY LL(1) First F o l l o w t o p - d o w n 3 3. 3 backtracking parser predictive parser recursive-descent parsing L L ( 1 ) LL(1) parsing L L ( 1 ) L L ( 1 ) 1 L 2 L 1 L L ( k ) k L L ( 1 ) F i r s

More information

表 1. 中间代码的形式及操作规范 语法 LABEL x : 定义标号 x 描述 FUNCTION f : 定义函数 f x := y 赋值操作 x := y + z 加法操作 x := y - z 减法操作 x := y * z 乘法操作 x := y / z 除法操作 x := &y 取 y 的

表 1. 中间代码的形式及操作规范 语法 LABEL x : 定义标号 x 描述 FUNCTION f : 定义函数 f x := y 赋值操作 x := y + z 加法操作 x := y - z 减法操作 x := y * z 乘法操作 x := y / z 除法操作 x := &y 取 y 的 4. 中间代码生成 本章实验为实验三, 任务是在词法分析 语法分析和语义分析程序的基础上, 将 C 源代码翻译为中间代码 理论上中间代码在编译器的内部表示可以选用树形结构 ( 抽象语法树 ) 或者线形结构 ( 三地址代码 ) 等形式, 为了方便检查你的程序, 我们要求将中间代码输出成线性结构, 从而可以使用我们提供的虚拟机小程序 ( 附录 B) 来测试中间代码的运行结果 需要注意的是, 由于在后面的实验中还会用到本次实验已经写好的代码,

More information

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

Microsoft PowerPoint - 5 Syntax-Directed Translation.pptx

Microsoft PowerPoint - 5 Syntax-Directed Translation.pptx 第五章语法制导的翻译 陈林 引言 使用上下文无关文法引导语言的翻译 CFG 的非终结符号代表了语言的某个构造 程序设计语言的构造由更小的构造组合而成 一个构造的语义可以由小构造的含义综合而来 比如 : 表达式 x+y 的类型由 x y 的类型和运算符 + 决定 也可以从附近的构造继承而来 比如 : 声明 int x; 中 x 的类型由它左边的类型表达式决定 语法制导定义和语法制导翻译 语法制导定义

More information

Microsoft PowerPoint - L12-v3.pptx

Microsoft PowerPoint - L12-v3.pptx Lecture 12: 中间代码生成 -II Xiaoyuan Xie 谢晓园 xxie@whu.edu.cn 计算机学院 E301 控制流翻译 控制流语句的翻译 文法 B表示布尔表达式 S代表语句 S if (B) S1 S if (B) S1 else S2 S while (B) S1 代码的布局见右图 继承属性 B.true B为真的跳转目标 B.false B为假的跳转目标 S.next

More information

Microsoft PowerPoint - typecheck

Microsoft PowerPoint - typecheck 本章内容 类型检查 编译原理和技术 张昱 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 记号流 语法分析器 语法树语法树类型中间代码中间检查器生成器表示 符号表 语义检查中最典型的部分 类型检查 类型系统 类型检查 符号表的作用 多态函数 重载 其他的静态检查 ( 不详细介绍 ) 控制流检查 唯一性检查 关联名字检查 张昱 : 编译原理和技术

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i 2013.12.8 7.4 修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 2013.12.1 6.12 下面是一个 C 语言程序 : long f1( i ) long i; { return(i 10); long f2(long i) { return(i

More information

骨头的故事

骨头的故事 头 1 图 206 33 7 12 5 5 4 12 2 54 10 200-400 3 500 图 类 图 图 动 节 4 5 图 发 图 节 180 Youtube 180 [1] 7 2 7 6 9 270 6 图 树懒 块颈 13-25 14 17 25 7 图 扭头 头鹰 鹅 8 图 红 为 关节 绿 为 关节 9 图 类 10 图 类 11 图 盘 动 类 图 阴 犸 艺 你可能会以为图

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

Microsoft Word - 11900電腦軟體設計.doc

Microsoft Word - 11900電腦軟體設計.doc 技 能 檢 定 規 範 之 一 一 九 電 腦 軟 體 行 政 院 勞 工 委 員 會 職 業 訓 練 局 編 印 軟 體 技 術 士 技 能 檢 定 規 範 目 錄 一 軟 體 技 術 士 技 能 檢 定 規 範 說 明... 1 二 丙 級 軟 體 技 術 士 技 能 檢 定 規 範... 3 三 乙 級 軟 體 技 術 士 技 能 檢 定 規 範... 5 四 甲 級 軟 體 技 術 士 技

More information

Microsoft PowerPoint - ch4.ppt [兼容模式]

Microsoft PowerPoint - ch4.ppt [兼容模式] 第四章 语法制导的翻译 本章内容 1 介绍语义描述的一种形式方法: 语法制导的翻译 (syntax-directed translation), 它包括两种具体形式 语法制导的定义 (syntax-directed definition) E E 1 + T E.code = E 1.code T.code + 可读性好, 更适于描述规范 翻译方案 (translation scheme) E E

More information

器之 间 向一致时为正 相反时则为负 ③大量电荷的定向移动形成电 流 单个电荷的定向移动同样形成电流 3 电势与电势差 1 陈述概念 电场中某点处 电荷的电势能 E p 与电荷量 q Ep 的比值叫做该点处的电势 表达式为 V 电场中两点之间的 q 电势之差叫做电势差 表达式为 UAB V A VB 2 理解概念 电势差是电场中任意两点之间的电势之差 与参考点的选择无关 电势是反映电场能的性质的物理量

More information

PowerPoint Presentation

PowerPoint Presentation 第六章中间代码生成 许畅 南京大学计算机系 2018 年春季 本章内容 中间代码表示 表达式的有向无环图 DAG 三地址代码 :x = y op z 类型检查 类型 类型检查 表达式的翻译 中间代码生成 控制流 回填 2 编译器前端的逻辑结构 前端是对源语言进行分析并产生中间表示 处理与源语言相关的细节, 与目标机器无关 前端后端分开的好处 : 不同的源语言 不同的机器可以得到不同的编译器组合 3

More information

1 A 组测试用例 本组测试用例共 9 个, 每个仅包含单个的词法或者语法错误 除特殊说明外, 不可多报 多报 漏报错误, 或者打印语法树都会导致扣分 错误编号和行号之后的说明文字不要求与给出的输出完全一致, 仅供助教理解使用, 不作为评分依据 1.1 A-1 输入 1 int func_a1()

1 A 组测试用例 本组测试用例共 9 个, 每个仅包含单个的词法或者语法错误 除特殊说明外, 不可多报 多报 漏报错误, 或者打印语法树都会导致扣分 错误编号和行号之后的说明文字不要求与给出的输出完全一致, 仅供助教理解使用, 不作为评分依据 1.1 A-1 输入 1 int func_a1() 编译原理第一次实验测试用例 : 目录 1 A 组测试用例 2 1.1 A-1............................................. 2 1.2 A-2............................................. 2 1.3 A-3............................................. 3 1.4 A-4.............................................

More information

《C语言程序设计》

《C语言程序设计》 C 语言程序设计 实验教学大纲 信息科学与技术学院 2015 年 6 月 C 语言程序设计 课程实验教学大纲 课程名称 :C 语言程序设计英文名称 :The C Programming Language 课程编号 : 课程性质 : 非独立设课课程属性 : 专业课实验教材或指导书类型 : 统编课程总学时 :75 学分 :4 实验学时 :30 实验学分 :1 适用专业 : 数字媒体技术实验室名称 : 先修课程

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点 复习 Protected 可以被子类 / 同一包中的类访问, 不能被其他类访问 弱化的 private 同时赋予 package access class MyType { public int i; public double d; public

More information

.size main,.lfe1-main.local b.comm b,4,4.comm c,4,4.ident "GCC: (GNU) egcs /Linux (egcs release)" 修改图 6.5 中计算声明名字

.size main,.lfe1-main.local b.comm b,4,4.comm c,4,4.ident GCC: (GNU) egcs /Linux (egcs release) 修改图 6.5 中计算声明名字 实验 : 1 阅读并理解 PL/0 语言前端编译器中的词法分析器, 扩展 PL/0 语言及其编译器, 以增加对上述多行注释的支持 2 [11 月 8 日开始检查 ] 参考 flex-examples, 将 PL/0 编译器中的词法分析部分的实现改造成两种构造方式 : 手工构造 ( 即使用原先在 pl0.c 中定义的 getch 和 getsym 函数 ) 用 flex 自动生成词法分析程序 ( 即编写描述

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

编译原理原理与技术

编译原理原理与技术 编译原理与技术 语法制导翻译 2015/10/12 编译原理与技术 讲义 1 属性文法 语法制导翻译 S- 属性定义 L- 属性定义 语法制导定义与翻译方案 自底向上翻译 S- 属性定义自底向上计算 自底向上计算继承属性 自顶向下翻译 2015/10/12 编译原理与技术 讲义 2 属性文法 属性文法 (Attributed Grammar) 上下文无关文法 + 属性 + 属性计算规则 属性 - 用来描述文法符号的语义特征,

More information

编译原理与技术

编译原理与技术 编译原理与技术 中间代码生成 2015/11/7 编译原理与技术 讲义 1 中间代码生成 - 布尔表达式翻译 - 控制流语句翻译 2015/11/7 编译原理与技术 讲义 2 布尔表达式的翻译 布尔表达式文法 G 4 E E 1 or E 2 E 1 and E 2 not E 1 ( E 1 ) id 1 relop id 2 true false id 3 布尔运算符 or and 和 not(

More information

胡 鑫 陈兴蜀 王海舟 刘 磊 利用基于协议分析和逆向工程的主动测量方法对 点播系统进行了研究 通过对 点播协议进行分析 获悉该协议的通信格式和语义信息 总结出了 点播系统的工作原理 在此基础上设计并实现了基于分布式网络爬虫的 点播系统主动测量平台 并对该平台获取的用户数据进行统计分析 获得了 点播系统部分用户行为特征 研究结果对 点播系统的监控及优化提供了研究方法 点播 协议分析 爬虫 主动测量

More information

PowerPoint Presentation

PowerPoint Presentation Typed Lambda Caculus,+, 程序设计语言理论 张昱 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 References PFPL Chapters: 4 Statics, 5 Dynamics, 6 Type Safety, 7 Evaluation Dynamics Chapters: 10 Product Types,

More information

Microsoft PowerPoint - syntaxdirect

Microsoft PowerPoint - syntaxdirect 本章内容 语法制导的翻译 编译原理和技术 张昱 055-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 语义描述的一种形式方法 语法制导的定义 (syntax-directed definition) + E.code = E.code.code + 可读性好, 更适于描述规范 翻译方案 (translation scheme) + { pr + 陈述了实现细节

More information

领导,我不想写CSS代码.key

领导,我不想写CSS代码.key 领导 我不想写 CSS 张鑫旭 25MIN 2018-03-31 YUEWEN USER EXPERIENCE DESIGN 01 1 YUEWEN USER EXPERIENCE DESIGN 砖家 02 CSS - 艺术家 YUEWEN USER EXPERIENCE DESIGN 03 CSS - 砖家 艺术家 YUEWEN USER EXPERIENCE DESIGN 04 领导, 我不想写

More information

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

More information

试卷代号 : 座位号 I II 中央广播电视大学 学年度第二学期 " 开放本科 " 期末考试 数据结构试题 2011 年 7 月! 题号 I - I 二 三 四! 五! 六 总分 分数 I I I 1 1- I ---1 I 得分 评卷人 一 单项选择

试卷代号 : 座位号 I II 中央广播电视大学 学年度第二学期  开放本科  期末考试 数据结构试题 2011 年 7 月! 题号 I - I 二 三 四! 五! 六 总分 分数 I I I 1 1- I ---1 I 得分 评卷人 一 单项选择 试卷代号 : 1 0 1 0 座位号 I II 中央广播电视大学 2 0 1 0-2 0 1 1 学年度第二学期 " 开放本科 " 期末考试 数据结构试题 2011 年 7 月! 题号 I - I 二 三 四! 五! 六 总分 分数 I I I 1 1- I ---1 I 得分 评卷人 一 单项选择题 ( 在括号内填写所选择的标号 每小题 2 分, 共 1 8 分 ) 1. 一种抽象数据类型包括数据和

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 1 章程序设计和 C 语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C 语言的发展及其特点 1.4 最简单的 C 语言程序 1.5 运行 C 程序的步骤与方法 1.6 程序设计的任务 1.1 什么是计算机程序 程序 : 一组计算机能识别和执行的指令 只要让计算机执行这个程序, 计算机就会自动地 有条不紊地进行工作 计算机的一切操作都是由程序控制的, 离开程序, 计算机将一事无成

More information

李 琼 评扎迪 史密斯的 白牙 要是他 指艾伯特 加勒比海移民 真的回去 了 那么他将要面临的失败是明摆在那儿的 因为当地并没有发生什么变化 这就是移民的悲剧 他们比他们离弃的故乡变化得更 快 于是他们永远也不可能因回到家乡而感 到幸福 可是 他们在移居的国家也不幸福 因为这不是家乡 瞿世镜

李 琼 评扎迪 史密斯的 白牙 要是他 指艾伯特 加勒比海移民 真的回去 了 那么他将要面临的失败是明摆在那儿的 因为当地并没有发生什么变化 这就是移民的悲剧 他们比他们离弃的故乡变化得更 快 于是他们永远也不可能因回到家乡而感 到幸福 可是 他们在移居的国家也不幸福 因为这不是家乡 瞿世镜 略论英国移民族群认同的发展和走向 李 琼 李 琼 评扎迪 史密斯的 白牙 要是他 指艾伯特 加勒比海移民 真的回去 了 那么他将要面临的失败是明摆在那儿的 因为当地并没有发生什么变化 这就是移民的悲剧 他们比他们离弃的故乡变化得更 快 于是他们永远也不可能因回到家乡而感 到幸福 可是 他们在移居的国家也不幸福 因为这不是家乡 瞿世镜 年 外国文学 第 期 这些天来 我觉得来到这个国家 就像是和魔鬼签了协议

More information

网C试题(08上).doc

网C试题(08上).doc 学习中心 姓名 学号 西安电子科技大学网络与继续教育学院 高级语言程序设计 (C) 全真试题 ( 闭卷 90 分钟 ) 题号一二三总分 题分 60 20 20 得分 一 单项选择题 ( 每小题 3 分, 共 60 分 ) 1.C 语言程序的基本单位是 A) 程序行 B) 语句 C) 函数 D) 字符 2. 下列四组选项中, 均是不合法的用户标识符的选项是 A)A B)getc C)include D)while

More information

2.1.2 输入格式你的程序的输入是一个包含 C 源代码的文本文件, 程序需要能够接收一个输入文件名作为参数 例如, 假设你的程序名为 cc 输入文件名为 test1 程序和输入文件都位于当前目录下, 那么在 Linux 命令行下运行./cc test1 即可获得以 test1 作为输入文件的输出结

2.1.2 输入格式你的程序的输入是一个包含 C 源代码的文本文件, 程序需要能够接收一个输入文件名作为参数 例如, 假设你的程序名为 cc 输入文件名为 test1 程序和输入文件都位于当前目录下, 那么在 Linux 命令行下运行./cc test1 即可获得以 test1 作为输入文件的输出结 2. 词法分析与语法分析 本章实验为实验一, 任务是编写一个程序对使用 C 语言书写的源代码进行词法分析和语法分析 (C 语言的文法参见附录 A), 并打印分析结果 实验要求使用词法分析工具 GNU Flex 和语法分析工具 GNU Bison, 并使用 C 语言来完成 在两个强大工具的帮助下, 编写一个能进行词法分析和语法分析的程序是一件相当轻松愉快的事情 需要注意的是, 由于在后面的实验中还会用到本次实验已经写好的代码,

More information

幻灯片 1

幻灯片 1 第一课 C 与 C++ 互联网新技术在线教育领航者 1 内容概述 第一部分 : C++ 综述 1. C++ 历史背景 2. Why C++ 3. 推荐书籍第二部分 : C VS C++ 1. C 语法回顾 2. 例 :C 实现动态数组 3. C++ 的 vector 第三部分 :C++ 对 C 的扩展 ( 上 ) 1. 命名空间 2. 输入输出 3. 基本类型转换 4. 声明 列表初始化 5. 指针和引用

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章流程控制和数组 3.1 实验目的 (1) 熟练掌握控制台应用程序的代码编写和调试, 以及运行方法 (2) 掌握选择结构的一般语法格式和应用 (3) 掌握 switch 语句的用法 (4) 掌握选择结构的嵌套的用法, 能灵活使用选择结构解决实际问题 (5) 掌握 while 循环语句的一般语法格式 (6) 掌握 for 循环语句的一般语法格式 (7) 掌握循环嵌套的语法格式 (8) 掌握一维数组的定义

More information

Microsoft PowerPoint - SyntaxDirectedTranslation [Compatibility Mode]

Microsoft PowerPoint - SyntaxDirectedTranslation [Compatibility Mode] Outline rror Handling Syntax-Directed Translation xtensions of CFG for parsing Precedence declarations rror handling Semantic actions Constructing a parse tree Originated from Prof. Aiken CS 14 Modified

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

PowerPoint Presentation

PowerPoint Presentation 结合开源软件的 编译原理教学实践探索 张昱 中国科学技术大学计算机科学与技术学院 2017 年高等院校计算机系统类课程联合研讨会 2017.8.26 恩施 中科大的编译原理课程 计算机专业分两个级别, 同时间段授课, 学生可以选择 英才班 (30+) 从 2010 级开始 54+40 加大实验强度, 基础实验 + 扩展实验, 占总分 50% 普通班 54+40 基础实验, 实验占总分 20~30%

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Microsoft PowerPoint - C语言课件-9-结构体.pptx

Microsoft PowerPoint - C语言课件-9-结构体.pptx 第九章结构体 郎大鹏 第九章结构体 9.1 结构体类型的声明方法 9.2 结构体类型变量的定义与使用 9.3 结构体数组 9.4 编程举例 9.5 习题 9.1 结构体类型的声明方法 结构体声明的语法形式如下 : struct 结构体标识符 成员变量列表 ; }; 例如, 为了描述班级 ( 假设仅仅包括班级编号 专业 人数等信息 ), 可以声明如下的结构体类型 struct Class char Code[10];

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 Protected 可以被子类 / 同一包中的类访问, 不能被其他类访问 弱化的 private 同时赋予 package access class MyType { public int i; public double d; public char

More information

长 安 大 学 硕 士 学 位 论 文 基 于 数 据 仓 库 和 数 据 挖 掘 的 行 为 分 析 研 究 姓 名 : 杨 雅 薇 申 请 学 位 级 别 : 硕 士 专 业 : 计 算 机 软 件 与 理 论 指 导 教 师 : 张 卫 钢 20100530 长安大学硕士学位论文 3 1 3系统架构设计 行为分析数据仓库的应用模型由四部分组成 如图3 3所示

More information

ebook8-30

ebook8-30 3 0 C C C C C C++ C + + C++ GNU C/C++ GNU egcs UNIX shell s h e l l g a w k P e r l U N I X I / O UNIX shell awk P e r l U N I X C C C C C C U N I X 30.1 C C U N I X 70 C C U N I X U N I X U N I X C Dennis

More information

2/80 2

2/80 2 2/80 2 3/80 3 DSP2400 is a high performance Digital Signal Processor (DSP) designed and developed by author s laboratory. It is designed for multimedia and wireless application. To develop application

More information

编译原理与技术

编译原理与技术 编译原理与技术 -- 文法和分析 2015/9/17 编译原理与技术 讲义 1 文法和分析 形式语言中若干基本概念 语言 文法 ( 上下文无关文法 ) 分析树与二义性 形式语言分类 乔姆斯基分类 2015/9/17 编译原理与技术 讲义 2 语言 语言 L={ s s 是 上任一字符串 }, s 称为语言 L 的一个句子 字母表 - 符号 / 字符的非空有限集合 e.g. 二进制数的 ={0,1},

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作 * 夏传玲 : 本文简要回顾了国内外定性研究在最近 多年的发展概况, 总结 了定性研究的六个发展趋势和分析策略上的三种流派 在上述两种背景下, 本文探讨了计算机辅助的定性分析给定性研究带来的机遇和挑战, 特别是它和手工操作对比时的优势和劣势, 以及应用这种定性分析技术所可能面临的困难 : 定性研究定性分析 文化差异,, (, ),,,, ( - ) ( - ) ( - ) ( - ) ( - ) (

More information

第 三 条 基 金 管 理 人 基 金 托 管 人 和 基 金 份 额 持 有 人 的 权 利 义 务, 依 照 本 法 在 基 金 合 同 中 约 定 基 金 管 理 人 基 金 托 管 人 依 照 本 法 和 基 金 合 同 的 约 定, 履 行 受 托 职 责 通 过 公 开 募 集 方 式

第 三 条 基 金 管 理 人 基 金 托 管 人 和 基 金 份 额 持 有 人 的 权 利 义 务, 依 照 本 法 在 基 金 合 同 中 约 定 基 金 管 理 人 基 金 托 管 人 依 照 本 法 和 基 金 合 同 的 约 定, 履 行 受 托 职 责 通 过 公 开 募 集 方 式 中 华 人 民 共 和 国 证 券 投 资 基 金 法 (2003 年 10 月 28 日 第 十 届 全 国 人 民 代 表 大 会 常 务 委 员 会 第 五 次 会 议 通 过 2012 年 12 月 28 日 第 十 一 届 全 国 人 民 代 表 大 会 常 务 委 员 会 第 三 十 次 会 议 修 订 ) 目 录 第 一 章 总 则 第 二 章 基 金 管 理 人 第 三 章 基 金

More information

%!

%! 黑龙江社会科学 李春玲 经济改革以来 随着中国经济稳定发展 一个被称之为中产阶级! 的社会群体逐步增长 尤其 自本世纪开始以来 由于连续多年的高速经济增长和城市化的迅速推进以及物质文化水平的提高 中产人群 数量增长更为明显 它已成为一个具有相当规模并有极大社会影响的社会群体 不过 中国社会目前还是以农民和工人占绝大多数的社会结构 要发展成为以中产阶级为主体的社会还需要一个相当长的时期 另外 作为一个正在形成的社会阶层

More information

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 描述 JSP 表达式语言的语法 认识使用 JSP 表达式的优点 在 JSP 中使用表达式语言 表达式语言简介 5 1 EL 为表达式语言 由两个组开发 JSP 标准标签库专家组 JSP 2.0 专家组 JSP 表达式语言的语法 ${EL Expression} JSP EL 表达式用于以下情形 静态文本 标准标签和自定义标签 表达式语言简介

More information

OpenCASCADE Expression Interpreter by Flex & Bison

OpenCASCADE Expression Interpreter by Flex & Bison OpenCASCADE Expression Interpreter by Flex & Bison eryar@163.com Abstract. OpenCASCADE provide data structure of any expression, relation or function used in mathematics. Flex and Bison are tools for building

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

<4D F736F F D20B5DACAAED5C220CBABCFDFD0D4BAAFCAFDA3A8BDB2D2E5A3A92E646F63>

<4D F736F F D20B5DACAAED5C220CBABCFDFD0D4BAAFCAFDA3A8BDB2D2E5A3A92E646F63> 高等代数第十章双线性函数 第十章双线性函数 10.1 线性函数 1. 设 V 是数域 F 上的一个线性空间, f 是 V 到 F 的一个映射, 若 f 满足 : (1) f( α + β) = f( α) + f( β); (2) f( kα) = kf( α), 式中 α, β 是 V 中任意元素, k 是 F 中任意数, 则称 f 为 V 上的一个线性函数. 2. 简单性质 : 设 f 是 V

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7> 能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO

More information

Microsoft PowerPoint - ch4.ppt [兼容模式]

Microsoft PowerPoint - ch4.ppt [兼容模式] 第四章语法制导的翻译 本章内容 1 介绍语义描述的一种形式方法 : 语法制导的翻译 (sytax-directed traslatio), 它包括两种具体形式 语法制导的定义 (sytax-directed defiitio) E.code = E 1.code.code 可读性好, 更适于描述规范 翻译方案 (traslatio scheme) { prit } 陈述了实现细节 ( 如语义规则的计算时机

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

Microsoft PowerPoint - 10 模板 Template.pptx

Microsoft PowerPoint - 10 模板 Template.pptx 模板 Tempalte 泛型编程的需要 Why Templates? 设想你对整数类型实现了一个排序算法 : void sort(int *is,int n); 用该函数可以对实 复数或工资单排序吗? 模板可以复用源代码 - 泛型编程. inline void Swap( int &x, int &y){ int t = x; x = y; y =t; inline void Swap(double

More information

中国人民大学哲学系 北京 哲学是民族化 个性化的 只有民族的语言 才能建构与这种民族的语言形 式相适应的哲学形态 和合语言哲学力图在语言结构与民族文化 民族精神融突而和合的基点上运用并整合言 象 意范畴 语言符号与形象是言与象的关系 言 象与意义 意境是 言与意 象与意的关系 言尽象与不尽象 言尽意与不尽意的争论 以及由 得象忘言 得 意忘象 而推致 得意忘言 历来见仁见智 在和合语言哲学语境中 尽与不尽

More information