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


    目录
    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 
    #include 
    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

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

  • 相关阅读:
    fastdds库架构
    如何设计一个线程池
    IPWorks WebSockets Delphi版
    C#------Circle圆类
    装修干货|卧室常见3个软装搭配问题。福州中宅装饰,福州装修
    EEG时频主成分分析(TF-PCA)实用教程(附示例数据和代码)
    Electron Forge 打包
    华为云云耀云服务器L实例评测|使用clickhouse-benchmark工具对ClickHouse的性能测试
    Zookeeper: 配置参数解读
    .NET 8 Video教程介绍(开篇)
  • 原文地址:https://blog.csdn.net/newlw/article/details/126659566