实验一 词法分析器+【编译原理】

实验一 词法分析器+【编译原理】

  • 前言
  • 推荐
  • 实验一 词法分析器+
    • keywords.txt
    • operators.txt
    • 测试
    • 词法分析器的状态转移图
    • 代码实现
  • 最后

前言

2023-4-2 20:04:46

以下内容源自《【编译原理】》
仅供学习交流使用

推荐

实验一 词法分析器【编译原理】

实验一 词法分析器+

书接上文

要求:代码的高级功能

更多的关键字(运算符)
需要编写keywords.txt

更多的常数(科学计数法 浮点数 字符串常量)
需要重写analyzer

更多的功能(过滤无效字符、数值转换、宏展开、预包含处理)
需要重写analyzer

还有
出错位置没有行数
需要修改loadInput()逻辑
使其每读入一行,就进行语法分析处理
并且需要row行数属性来配合

下面实现C语言的词法分析

keywords.txt

除了32个关键字,还有用户预编译单词
并把34种运算符拆开为符号
有可能仍有遗漏

1      include
2      define
3      ifdef
4      ifndef
5      auto
6      break
7      case
8      char
9      const
10     continue
11     default
12     do
13     double
14     else
15     enum
16     extern
17     float
18     for
19     goto
20     if
21     int
22     long
23     register
24     return
25     short
26     signed
27     sizeof
28     static
29     struct
30     switch
31     typedef
32     union
33     unsigned
34     void
35     volatile
36     while

此处没有了

identifierList
constantList

operators.txt

新建一个运算符表

注意:
虽然有重复的但是他们的功能不一样
需要根据上下文环境确定具体功能

1         #
2         $
345         \
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        &
37        ^
38        |
39        &&
40        ||
41        ?
42        :
43        =
44        +=
45        -=
46        *=
47        /=
48        %=
49        <<=
50        >>=
51        &=
52        ^=
53        |=
54        ,

测试

package s1;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class SeniorLexicalAnalyzer extends AbstractLexicalAnalyzer{

    public List<Symbol> operatorList=new ArrayList<>();//运算符表

    //创建关键字表 根据表3.1实现
    {
        File file = new File("operators.txt");
        if (file.exists()) {
            System.out.println("operators.txt文件存在");
            System.out.println("读取文件,加载运算符表");
            loadOperatorList();
        } else {
            System.out.println("operators.txt文件不存在");
            System.out.println("采用默认的运算符表");
            initOperatorList();
        }
    }

    //读取operators.txt文件的内容加载到operatorList中
    public void loadOperatorList() {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("operators.txt"));
            String line;
            while ((line = reader.readLine()) != null) {
                String[] arr = line.split("\\s+");
                operatorList.add(new Symbol(Integer.parseInt(arr[0]), arr[1]));
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //默认的运算符表
    public void initOperatorList(){
        keywordList.add(new Symbol(1,"="));
        keywordList.add(new Symbol(2,"+"));
        keywordList.add(new Symbol(3,"*"));
        keywordList.add(new Symbol(4,"**"));
        keywordList.add(new Symbol(5,","));
        keywordList.add(new Symbol(6,"("));
        keywordList.add(new Symbol(7,")"));
    }

    //重写 状态转移图实现
    @Override
    public void analyzer() {

    }

    //测试词法分析器
    private void testAnalyzers(){

    }

    //重写出错处理,跳过1下,继续分析
    @Override
    public void procError(){
        System.out.println("词法分析出错"+"\n"+"出错位置为"+position);
        System.out.println("跳过错误,继续分析");
        position++;
        if(ch!=EOF){
            ch=' ';
        }
    }
    //测试关键词表的赋值
    private void testKeywordList(){

        for (Symbol s:keywordList) {
            System.out.println(s);
        }
    }
    
    //测试运算符表的赋值
    private void testOperatorList(){
        for (Symbol s:operatorList) {
            System.out.println(s);
        }
    }


    public static void main(String[] args) {
        SeniorLexicalAnalyzer lex = new SeniorLexicalAnalyzer();
        //测试
        lex.testKeywordList();
        lex.testOperatorList();

        //测试
//        new SeniorLexicalAnalyzer().testAnalyzers();
    }
}

重申:
关键词表中的code没有什么意义
只有单词表中的code有意义
所以运算符表中就没有设置code

测试结果

keywords.txt文件存在
读取文件,加载关键词表
operators.txt文件存在
读取文件,加载运算符表
Symbol{id=1, value='include', code=0}
Symbol{id=2, value='define', code=1}
Symbol{id=3, value='ifdef', code=2}
Symbol{id=4, value='ifndef', code=3}
Symbol{id=5, value='auto', code=4}
Symbol{id=6, value='break', code=5}
Symbol{id=7, value='case', code=6}
Symbol{id=8, value='char', code=7}
Symbol{id=9, value='const', code=8}
Symbol{id=10, value='continue', code=9}
Symbol{id=11, value='default', code=10}
Symbol{id=12, value='do', code=11}
Symbol{id=13, value='double', code=12}
Symbol{id=14, value='else', code=13}
Symbol{id=15, value='enum', code=14}
Symbol{id=16, value='extern', code=15}
Symbol{id=17, value='float', code=16}
Symbol{id=18, value='for', code=17}
Symbol{id=19, value='goto', code=18}
Symbol{id=20, value='if', code=19}
Symbol{id=21, value='int', code=20}
Symbol{id=22, value='long', code=21}
Symbol{id=23, value='register', code=22}
Symbol{id=24, value='return', code=23}
Symbol{id=25, value='short', code=24}
Symbol{id=26, value='signed', code=25}
Symbol{id=27, value='sizeof', code=26}
Symbol{id=28, value='static', code=27}
Symbol{id=29, value='struct', code=28}
Symbol{id=30, value='switch', code=29}
Symbol{id=31, value='typedef', code=30}
Symbol{id=32, value='union', code=31}
Symbol{id=33, value='unsigned', code=32}
Symbol{id=34, value='void', code=33}
Symbol{id=35, value='volatile', code=34}
Symbol{id=36, value='while', code=35}
Symbol{id=1, value='#', code=0}
Symbol{id=2, value='$', code=0}
Symbol{id=3, value='‘', code=0}
Symbol{id=4, value='“', code=0}
Symbol{id=5, value='\', code=0}
Symbol{id=6, value='{', code=0}
Symbol{id=7, value='}', code=0}
Symbol{id=8, value=';', code=0}
Symbol{id=9, value='(', code=0}
Symbol{id=10, value=')', code=0}
Symbol{id=11, value='[', code=0}
Symbol{id=12, value=']', code=0}
Symbol{id=13, value='->', code=0}
Symbol{id=14, value='.', code=0}
Symbol{id=15, value='!', code=0}
Symbol{id=16, value='~', code=0}
Symbol{id=17, value='++', code=0}
Symbol{id=18, value='--', code=0}
Symbol{id=19, value='+', code=0}
Symbol{id=20, value='-', code=0}
Symbol{id=21, value='*', code=0}
Symbol{id=22, value='&', code=0}
Symbol{id=23, value='*', code=0}
Symbol{id=24, value='/', code=0}
Symbol{id=25, value='%', code=0}
Symbol{id=26, value='+', code=0}
Symbol{id=27, value='-', code=0}
Symbol{id=28, value='<<', code=0}
Symbol{id=29, value='>>', code=0}
Symbol{id=30, value='<', code=0}
Symbol{id=31, value='<=', code=0}
Symbol{id=32, value='>', code=0}
Symbol{id=33, value='>=', code=0}
Symbol{id=34, value='==', code=0}
Symbol{id=35, value='!=', code=0}
Symbol{id=36, value='&', code=0}
Symbol{id=37, value='^', code=0}
Symbol{id=38, value='|', code=0}
Symbol{id=39, value='&&', code=0}
Symbol{id=40, value='||', code=0}
Symbol{id=41, value='?', code=0}
Symbol{id=42, value=':', code=0}
Symbol{id=43, value='=', code=0}
Symbol{id=44, value='+=', code=0}
Symbol{id=45, value='-=', code=0}
Symbol{id=46, value='*=', code=0}
Symbol{id=47, value='/=', code=0}
Symbol{id=48, value='%=', code=0}
Symbol{id=49, value='<<=', code=0}
Symbol{id=50, value='>>=', code=0}
Symbol{id=51, value='&=', code=0}
Symbol{id=52, value='^=', code=0}
Symbol{id=53, value='|=', code=0}
Symbol{id=54, value=',', code=0}

词法分析器的状态转移图

C语言的标识符由字母、数字、下划线组成,并且首字母不能是数字(美元符号$也可以作为标识符)

C语言的常量

C语言中的运算符大全(内附优先级表)

代码实现

最后

祝大家逢考必过
点赞收藏关注哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/7018.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程进阶学习12------ConcurrentHashMap详解

JDK 7 HashMap 并发死链 注意&#xff1a;要在 JDK 7 下运行&#xff0c;否则扩容机制和 hash 的计算方法都变了 import java.io.*; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.StringTokenizer; import java.util.concurrent.*; import java.…

AR”将会成为“更加日常化的移动设备应用的一部分”吗

目录 1&#xff1a;AR是什么 2&#xff1a;AR给人类带来的贡献 3&#xff1a;人们在生活中可以遇到许多 AR 技术应用 4&#xff1a;AR 技术的未来发展的趋势&#xff1a; 大学主攻VR&#xff0c;从大一就对VR的知识&#xff0c;设备&#xff0c;已经所涉及的知识伴随我的整…

AI工具(ChatGPT)常用指令,持续更新...

要国内使用AI工具&#xff0c;关注&#xff1a;码视野&#xff0c;回复&#xff1a;1002使用VensiGPT时&#xff0c;当你给的指令越精准&#xff0c;它回复就会越完美&#xff0c;例如&#xff0c;如果你要请它协助撰写文案&#xff0c;如果没有给与指定情景与目标&#xff0c;…

作为大学生,你还不会搭建chatGPT微应用吗?

目录 引言ChatGPT是什么&#xff1f;背景&#xff1a;ChatGPT敢为人先&#xff0c;打破全球僵局示例演示&#xff1a;基于ChatGPT微应用实现的条件及步骤&#xff08;1&#xff09;整体框架&#xff08;2&#xff09;搭建前的准备工作&#xff08;3&#xff09;实际搭建步骤&a…

文件或目录损坏怎么办?4个实用方法!

案例&#xff1a;文件或目录损坏怎么恢复&#xff1f; 【有谁知道为什么文件会突然无法打开且显示损坏了呀&#xff1f;我有一个很重要的文件无法打开了&#xff0c;之前从来没有遇到过这样的问题&#xff0c;这让我很无措&#xff0c;请大家帮我想想办法吧&#xff01;】 我…

ThreeJS-聚光等衰减(二十一)

聚光灯可以联系到现实中的手电筒 衰减分为&#xff1a;距离衰减和边缘衰减 .decay : Float&#xff08;控制的是灯光自身的亮度&#xff09; The amount the light dims along the distance of the light. Default is 2. In context of physically-correct rendering the defa…

pip lanms-neo报错问题

pip lanms-neo报错问题 安装Polygon3的时候&#xff0c;就遇到需要Microsoft Visual C 14.0的问题&#xff0c;以为通过本地whl安装&#xff0c;就能避免。结果&#xff0c;lanms-neo这个库&#xff0c;网上还不好找whl文件&#xff0c;找到的都是csdn里面的付费下载&#xff…

【Java8最优解】P1478 陶陶摘苹果(升级版)

陶陶摘苹果&#xff08;升级版&#xff09; 题目描述 又是一年秋季时&#xff0c;陶陶家的苹果树结了 nnn 个果子。陶陶又跑去摘苹果&#xff0c;这次他有一个 aaa 公分的椅子。当他手够不着时&#xff0c;他会站到椅子上再试试。 这次与 NOIp2005 普及组第一题不同的是&…

HotSpot笔记——共享库操作

共享库操作前言MakefileHotspot的Makefile如何定义需要共享库使用编译选项使用链接器选项dlopendlsym前言 jvm启动时&#xff0c;libjli.so、libjvm.so、libjava.so这些共享库的加载操作&#xff0c;都是c语言的&#xff0c;我们记录一下这些操作函数。 Makefile 以下是一个…

python学习笔记2

使用链接&#xff1a; Python 3 basics - GeeksforGeeks 对应的英文是&#xff1a; 这里联想一下Redis的数据类型: string list set hash zset 列表 有一个细节&#xff0c;可以看到下面的输出里面也带了中括号&#xff1a; 字典 第一行定义的时候是中括号&#xff0c;因为…

文章八:YOLOv5车牌识别系统的Web应用与API开发

在本篇文章中&#xff0c;我们将探讨如何使用YOLOv5车牌识别系统开发一个Web应用&#xff0c;以及如何创建一个车牌识别API供其他开发者使用。我们将介绍Flask框架的基本概念&#xff0c;并实现一个简单的车牌识别Web应用和API。 车牌识别视频Flask框架介绍 Flask是一个轻量级的…

vue-cropper 拖动图片和截图框

现象 开发遇到vue--cropper不能拖动图片和截图框 解决方法 can-move-box设置为true&#xff0c;表示可以拖动截图框 can-move设置为true&#xff0c;表示可以拖动图片 *注意&#xff1a; 我外层套了一个el-col, el-col的宽高一定要大于截图框的宽高&#xff0c;否则移动不了…

网络安全工程师做什么?

​ 网络安全很复杂。数字化转型、远程工作和不断变化的威胁形势需要不同的工具和不同的技能组合。 系统必须到位以保护端点、身份和无边界网络边界。负责处理这种复杂安全基础设施的工作角色是网络安全工程师。 简而言之&#xff0c;网络安全工程师是负责设计和实施组织安全系…

ELK、ELFK企业级日志分析系统

目录 一、ELK简介 1、什么是ELK 2、ELK工作原理及过程​编辑 3、ELK相关名词介绍 ①Elasticsearch介绍 ②Logstash介绍 ③Kibana介绍 ④Fluentd介绍 ⑤Filebeat介绍 二、ELK部署 1、实验环境 2、安装elasticsearch 3、安装logstash ​编辑4、安装kiabana ​编辑…

网站是怎么屏蔽脏话的呢:简单学会SpringBoot项目敏感词、违规词过滤方案

一个社区最重要的就是交流氛围与审查违规&#xff0c;而这两者都少不了对于敏感词进行过滤的自动维护措施。基于这样的措施&#xff0c;我们才能基本保证用户在使用社区的过程中&#xff0c;不至于被敏感违规词汇包围&#xff0c;才能够正常的进行发布帖子和评论&#xff0c;享…

unity3d:asset store上C#代码热重载插件,不需要重运行,重新加载更新后函数

C#热重载插件地址 https://assetstore.unity.com/packages/tools/utilities/hot-reload-edit-code-without-compiling-250972?clickref1011lwHg8abv&utm_sourcepartnerize&utm_mediumaffiliate&utm_campaignunity_affiliate#description 打开热重装有两种方法 …

地库位置复杂如何导航,反向寻车系统解决方案

地库位置复杂如何导航&#xff1f;问路这一行为在迷路时确实比较高效&#xff0c;但是得到的信息往往还是过于碎片和混乱&#xff0c;尤其是在停车场内&#xff0c;通过问路去往目的地既费时又费力。而有了停车场地图&#xff0c;这个问题就迎刃而解了。停车场地图可以帮助驾车…

金山云最新财报的两个历史新高:毛利创新高,亏损创新高

‍数据智能产业创新服务媒体——聚焦数智 改变商业2023年3月29日&#xff0c;中国领先的独立云服务提供商金山云&#xff08;美股代码&#xff1a;KC&#xff09;发布了截至2022年12月31日的四季度财报与年度业绩数据。金山云首席执行官邹涛先生表示&#xff1a;“我们以喜人的…

【IoT】乐鑫WiFI选型指南

目录 1、简介 2、ESP32系列 2.1、ESP32-S2 2.2、ESP32-C3 2.3、ESP32-S3 最近要替换在用的wifi模组&#xff0c;这就涉及到选型。 1、简介 首先来到乐鑫官网&#xff1a;提供 Wi-Fi、蓝牙芯片和 AIoT 解决方案 I 乐鑫科技 可以看到&#xff0c;乐鑫的产品从大的层面分为三…

SpringBoot集成actuator监控服务-自动配置将康检查

前言 SpringBoot监控管理 微服务的特点决定了功能模块的部署是分布式的&#xff0c;大部分功能模块都是运行在不同的机器上&#xff0c;彼此通过服务调用进行交互&#xff0c;前后台的业务流会经过很多个微服务的处理和传递&#xff0c;出现了异常如何快速定位是哪个环节出现了…
最新文章