基于Python实现语义分析

1, 需求分析 能分析以下几类语句,并建立符号表及生成中间代码(三地址指令和 四元式形式): - 声明语句(包括变量声明,数组声明,记录声明和过程声明) - 表达式及赋值语句(包括数组元素的引用和赋值) - 分支语句:if_then_else - 循环语句:do_while - 过程调用语句 能够识别出测试用例中的语义错误

本文包含相关资料包-----> 点击直达获取<-------

1. 需求分析

能分析以下几类语句,并建立符号表及生成中间代码(三地址指令和 四元式形式): - 声明语句(包括变量声明、数组声明、记录声明和过程声明) - 表达式及赋值语句(包括数组元素的引用和赋值) - 分支语句:if_then_else - 循环语句:do_while - 过程调用语句

能够识别出测试用例中的语义错误,包括 - 变量(包括数组、指针、结构体)或过程未经声明就使用 - 变量(包括数组、指针、结构体)或过程名重复声明 - 运算分量类型不匹配(也包括赋值号两边的表达式类型不匹配) - 操作符与操作数之间的类型不匹配 - 赋值号左边出现一个只有右值的表达式 - 数组下标不是整数 - 对非数组变量使用数组访问操作符 - 对非结构体类型变量使用“.”操作符 - 对非过程名使用过程调用操作符 - 过程调用的参数类型或数目不匹配 - 函数返回类型有误

能准确给出错误所在位置。输出的错误提示信息格式如下: Semantic error at Line [行号]:[说明文字]

2. 文法设计

要求:给出如下语言成分所对应的语义动作

  • 声明语句(包括变量声明、数组声明、记录声明和过程声明)

  • 表达式及赋值语句(包括数组元素的引用和赋值)

  • 分支语句:if_then_else

  • 循环语句:do_while

  • 过程调用语句

3. 系统设计

要求:分为系统概要设计和系统详细设计。

  • 系统概要设计:给出必要的系统宏观层面设计图,如系统框架图、数据流图、功能模块结构图等以及相应的文字说明。

  • 系统详细设计:对如下工作进行展开描述

核心数据结构的设计

该结构为语法分析树的节点,用于存放单词的内容、属性、深度和子节点信息。

支持返回所有类中的所有实例。在返回属性信息时,如果该节点不具备该属性,会进行报错。

子节点信息和属性信息可以进行增加。

该结构为四元组,用于存放四元组内容。

同时对四元组的分析操作也包含在内

  • 主要功能函数说明

该函数用于读取语法分析后形成的语法树,并形成新的语法分析树。

该函数用于将符号信息加入到符号表中。

加入到内容包括符号本身、符号表的类型、符号表的偏置

该函数用于计算数据类型对应的字符长度,用于辅助计算偏置长度

该函数用于计算偏置。

该函数用于生成临时变量

该函数为语义分析主体内容。函数根据生成的语法分析树来生成符号表与四元式

  • 程序核心部分的程序流程图

4. 系统实现及结果分析

要求:对如下内容展开描述。

  • 系统实现过程中遇到的问题;

该系统没有办法处理未经声明就使用的变量。因为在存储变量的属性时,使用了字典,在调用变量时,如果该变量未经声明,那么符号表中就没有它,也就没有关于它的字典的 key,那么程序会进行 keyerror 报错。

  • 针对一测试程序输出其语义分析结果;

测试样例如下:

```c++ struct student { int age; }

int sum(int x, int y) { int ret; ret = x + y; return ret; }

int main() { float a; a = 1.567; int b; int[5][5] c; c[1][1] = 10; b = c[1][1]; int d; int *e;

d = sum(b, c[1][1]);

if(d > 10) {
    a = 1.0;
} else {
    a = 2.0;
}

while(b < 10) {
    d = d + 1;
    b = b + 1;
}

return 0;

} ```

语义分析结果如下:

c++ L0: (+, 0, 4, t1) t1 = 0 + 4 L1: (=, t1, -, 8) 8 = t1 L2: (=, 8, -, ret) ret = 8 L3: (pop, -, -, t2) pop t2 L4: (j, -, -, t2) goto t2 L5: (=, $1.567, -, t3) t3 = $1.567 L6: (=, t3, -, 12) 12 = t3 L7: (=, $1, -, t4) t4 = $1 L8: (=, $1, -, t5) t5 = $1 L9: (=, $10, -, t6) t6 = $10 L10: (=, t6, -, 44) 44 = t6 L11: (=, $1, -, t7) t7 = $1 L12: (=, $1, -, t8) t8 = $1 L13: (=, 44, -, 16) 16 = 44 L14: (=, $1, -, t9) t9 = $1 L15: (=, $1, -, t10) t10 = $1 L16: (=, 44, -, x) x = 44 L17: (=, 16, -, y) y = 16 L18: (push, L20, -, -) push L20 L19: (j, -, -, L0) goto L0 L20: (=, ret, -, t11) t11 = ret L21: (=, t11, -, 120) 120 = t11 L22: (=, $10, -, t12) t12 = $10 L23: (j>, 120, t12, 25) if 120>t12 goto L25 L24: (j, -, -, 28) goto L28 L25: (=, $1.0, -, t13) t13 = $1.0 L26: (=, t13, -, 12) 12 = t13 L27: (j, -, -, 30) goto L30 L28: (=, $2.0, -, t14) t14 = $2.0 L29: (=, t14, -, 12) 12 = t14 L30: (=, $10, -, t15) t15 = $10 L31: (j<, 16, t15, 33) if 16<t15 goto L33 L32: (j, -, -, 40) goto L40 L33: (=, $1, -, t16) t16 = $1 L34: (+, 120, t16, t17) t17 = 120 + t16 L35: (=, t17, -, 120) 120 = t17 L36: (=, $1, -, t18) t18 = $1 L37: (+, 16, t18, t19) t19 = 16 + t18 L38: (=, t19, -, 16) 16 = t19 L39: (j, -, -, 30) goto L30 L40: (=, $0, -, t20) t20 = $0 L41: (=, t20, -, ret) ret = t20 L42: (pop, -, -, t21) pop t21 L43: (j, -, -, t21) goto t21

  • 输出针对此测试程序经过语义分析后的符号表;

c++ int 0 y int 4 ret int 8 a float 12 b int 16 c int 20 d int 120 e int* 124

三列内容分别为变量名、变量的数据类型、变量的偏置

  • 输出针对此测试程序对应的语义错误报告;

重复声明:

数据类型不匹配:

数组下表非整数:

  • 对实验结果进行分析。

实验结果均正确无误。

参考文献

  • 文本分析资源与任务管理系统的设计与实现(北京交通大学·宋奕文)
  • 网络新闻语料库建设及其分布式检索系统研究(华中师范大学·鲁松)
  • 基于web的数据可视化方法研究与实现(西安电子科技大学·曹东升)
  • 基于文本情感分析的个性化推荐系统的研究(武汉邮电科学研究院·刘师培)
  • 文本分析资源与任务管理系统的设计与实现(北京交通大学·宋奕文)
  • 基于Spring Cloud的分布式语义分析挖掘平台中管理子系统的设计与实现(北京邮电大学·任聚才)
  • 基于数据挖掘的用户语义智能分析系统设计与开发(湖南大学·彭盛兰)
  • 基于联合学习的知识库问答研究(内蒙古科技大学·张晨荣)
  • 文本分析资源与任务管理系统的设计与实现(北京交通大学·宋奕文)
  • 面向特定领域评论文本的情感分析(兰州交通大学·秦晓雅)
  • 基于Spring Cloud的分布式语义分析挖掘平台中管理子系统的设计与实现(北京邮电大学·任聚才)
  • 基于云计算的用户网络行为挖掘分析系统的研究与设计(湖北大学·皮健夫)
  • 电子商务环境下用户观点的情感挖掘研究(四川师范大学·陈苹)
  • 基于知识图谱的问句语义理解技术研究与实现(国防科技大学·韩晗)
  • 分布式主题网络爬虫研究与设计(电子科技大学·单文远)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码工厂 ,原文地址:https://bishedaima.com/yuanma/36157.html

相关推荐

发表回复

登录后才能评论