词法、语法、语义分析编译原理设计

发布于:2023-01-01 ⋅ 阅读:(170) ⋅ 点赞:(0)

目录
1 目的 4
2 设计思路与实现 4
2.1 编译过程概述 4
2.2 Flex与Bison工具的简介 5
2.2.1 Flex文件内容结构 5
2.2.2 Bison文件内容结构 6
2.2.3 Flex-Bison协作关系 6
2.2.4 结构体含义 7
2.3 文法的设计 7
3 程序实现 8
3.1 程序总体思想 8
3.2 词法分析设计 8
3.3 语法分析设计 9
3.4 抽象语法树的生成 12
3.5 AST图片的设计 13
3.6 MakeFile文件的设计 14
4 测试用例以及实验结果 15
4.1 文件测试用例 15
4.2 使用说明 15
4.3 文件测试 15
4.3.1 文件1测试 15
4.3.2 文件2测试 18
4.3.3 文件3测试 20
5 技术问题以及解决方案 22
5.1 技术问题 22
5.2 心得体会 23
6 备注 23
3程序实现
3.1程序总体思想
首先应当对使用指定文法的源文件进行词法分析,将整个文本分解为一个一个词素,然后 为每个终结符建立一个语法节点。将上述过程看作是一个解析函数,每次调用就生成语法节点 并返回词素的类型。
接着需要对其进行语法分析(事实上词法分析和语法分析是同时进行的)。使用 LR 分析技 术,按照产生式规则生成项集,然后构造项集的 goto 函数。此过程事实上完成了一个可以识别 此文法的 DFA,根据此 DFA 构造此文法的语法分析表,接着根据上一步词法分析器返回的终结 符类型来选择执行移入或规约的动作,在规约的同时生成新的语法节点并使其与子语法节点建 立连接关系。重复以上直到状态栈中的状态达到 Acc 也就是接收状态,说明输入字符串被此文 法接收。
上述动作执行完毕后,即构造出一棵完整的抽象语法树。
3.2词法分析设计
词法分析过程借助GNU Flex工具使用正则表达式描述每一个单词的组成,即Flex会为每一个单词构建相应的DFA,其作用是构造出相应的yylex()函数,返回下一个输入流的单词类型,同时yyparse()函数每一次的语法分析,都需要调用相应的yylex()函数。利用Flex工具会生成lex.yy.c文件,该文件中包含了对于词法分析的相应的函数等。
本文转载自:http://www.biyezuopin.vip/onews.asp?id=15780

#include <stdio.h>
#include <unistd.h>
#include "node.h"

int yyparse(struct Node **);

int main(int argc, char **argv) {
  int mode = 1;
  char ch;
  fp = fopen("cifafenxi.txt", "w+"); //打开存词法分析的文件
  fprintf(fp,"%s","..........词法分析结果为.............\n");
  fprintf(fp,"%s","类型   Token   符号\n");
  while ((ch = getopt(argc, argv, "tc")) != -1) {
    switch (ch) {
    case 't':
      mode = 0;
      break;
    case 'c':
      mode = 1;
      break;
    default:
      fprintf(stderr, "unknown option: %c\n", ch);
    }
  }
  // 抽象语法树
  struct Node *AST;
  if (yyparse(&AST) == 0) {
    if (mode) {
      genTAC(AST);
    } else {
      printAST(AST);
    }
  }
  fclose(fp);
  return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到