【编译技术实验】词法分析器(C++实现)

词法分析器实现过程(java和c++实现) 词法分析器是编译原理的一个实验,本文将会详细给出实现的具体步骤,利用java进行示例讲解,源码(包含java和c++两种实现方式)可在处下载。 一、 实验目的 设计、编写一个词法分析程序,加深对词法分析原理的理解。 二、 实验原理 词法分析是从左向右一个字符、一个字符地读入源程序,扫描每行源程序的符号,依据词法规则,识别单词。执行词法分析的程序称为词法分析器,将给定的程序通过词法分析器,识别出一个... 阅读详情

很久没有发表csdn博客了,后面会上线个人博客,预计在2022年3月底实现,发份实验代码冒个泡

代码易懂,无需注释就能看懂。

#include<iostream>
#include <unordered_map>
#include<string>
#include<cctype>
#include<vector>
#include<fstream>
using namespace std;

enum TYPE{ERROR,KEYWORD,IDENTIFIER,CONSTANT,OPERATOR,RELATIONAL_OPERATOR,DELIMITER};

class STDOUT{
public:
    STDOUT(string word, TYPE type, int row, int col): word(std::move(word)), type(type), row(row), col(col) {}

    void print(){
        cout<<word<<"     ";
        if(type==ERROR) cout<<"ERROR     ";
        else cout<<"("<<type<<","<<word<<")"<<"     ";
        cout<<OutPutTable[type]<<"     "<<"("<<row<<","<<col<<")"<<endl;
    }

    static unordered_map<int,string> OutPutTable;
private:
    string word;
    TYPE type;
    int row;
    int col;
};

unordered_map<int,string> STDOUT::OutPutTable={
        {ERROR,"ERROR"},{KEYWORD,"关键字"},{IDENTIFIER,"标识符"},
        {CONSTANT,"常数"},{OPERATOR,"运算符"},{RELATIONAL_OPERATOR,"关系运算符"},
        {DELIMITER,"分界符"}
};

class LexivalAnalyzer{
public:
    LexivalAnalyzer(){
        for(string str:{"do","end","for","if","printf","scanf","then","while"})
            keyWordTable[str] = keyWordTable.size();
        for(string str:{".",";","(",")","[","]"})
            delimiterTable[str]=delimiterTable.size();
        for(string str:{"+","-","*","/"})
            operatorTable[str] = operatorTable.size();
        for(string str:{"<","<=","=",">",">=","<>"})
            relationalOperatorTable[str] = relationalOperatorTable.size();
    }

    void run(const string& path){
        identifierTable.clear();
        constTable.clear();
        res.clear();
        string input= formatInput(path);
        cout<<"input file is:\n"<<input<<endl;
        int cur=0,row=1,col=1;
        while(cur < input.size()){
            if(input[cur] == ' '){
                ++cur;
                continue;
            }
            if(isalpha(input[cur])){
                alphaAdvanceSearch(input, cur, row, col);
            }else if(isdigit(input[cur])) {
                digitAdvanceSearch(input, cur, row, col);
            }else if(operatorTable.find(input.substr(cur,1)) != operatorTable.end()){
                normalAdvanceSearch(input, cur, row, col,operatorTable,OPERATOR);
            } else if(relationalOperatorTable.find(input.substr(cur,1))!=relationalOperatorTable.end()){
                normalAdvanceSearch(input, cur, row, col,relationalOperatorTable,RELATIONAL_OPERATOR);
            }else if(delimiterTable.find(input.substr(cur,1)) != delimiterTable.end()){
                res.emplace_back(STDOUT(input.substr(cur,1), DELIMITER, row, col));
                ++cur;
            }else if(input[cur] != '\n'){
                res.emplace_back(STDOUT(input.substr(cur,1), ERROR, row, col));
                ++cur;
            }
            else{
                ++row;
                col=0;
                ++cur;
            }
            ++col;
        }
        for(auto & re : res) re.print();
    }
private:
    static string formatInput(const string& path){
        ifstream readFile(path);
        string input,temp;
        while(!readFile.eof()){
            getline(readFile,temp,'\n');
            input+=temp;
            input+="\n";
        }
        return input;
    }

    void alphaAdvanceSearch(string input, int & cur, int row, int col){
        string instring;
        while(cur < input.size()){
            if(!(isalpha(input[cur]) || isdigit(input[cur]))) break;
            instring+=input[cur];
            ++cur;
        }
        if(keyWordTable.find(instring)!=keyWordTable.end())
            res.emplace_back(STDOUT(instring, KEYWORD, row, col));
        else {
            if (identifierTable.find(instring) == keyWordTable.end())
                identifierTable[instring]=identifierTable.size();
            res.emplace_back(STDOUT(instring, IDENTIFIER, row, col));
        }
    }

    void digitAdvanceSearch(string input, int & cur, int row, int col){
        string instring;
        bool flag=false;
        while(cur < input.size()){
            if(isdigit(input[cur]) || isalpha(input[cur])){
                if(isalpha(input[cur])) flag=true;
            }else break;
            instring+=input[cur];
            ++cur;
        }
        if(flag) res.emplace_back(STDOUT(instring, ERROR, row, col));
        else if(constTable.find(instring)!=constTable.end())
            res.emplace_back(STDOUT(instring, CONSTANT, row, col));
        else{
            constTable[instring]=constTable.size();
            res.emplace_back(STDOUT(instring, CONSTANT, row, col));
        }
    }

    void normalAdvanceSearch(string input, int & cur, int row, int col , unordered_map<string,int> &map,TYPE type){
        string instring;
        while(cur < input.size()){
            if(map.find(input.substr(cur,1)) == map.end()) break;
            instring+=input[cur];
            ++cur;
        }
        if(map.find(instring)!=map.end()) res.emplace_back(STDOUT(instring, type, row, col));
        else res.emplace_back(STDOUT(instring, ERROR, row, col));
    }

    unordered_map<string,int> keyWordTable;
    unordered_map<string,int> delimiterTable;
    unordered_map<string,int> operatorTable;
    unordered_map<string,int> relationalOperatorTable;
    unordered_map<string,int> identifierTable;
    unordered_map<string,int> constTable;
    vector<STDOUT> res;
};

int main(){
    LexivalAnalyzer lexivalAnalyzer;
    lexivalAnalyzer.run("D:\\LexicalAnalyzer\\test1.txt");
}
编译原理——构造词法分析器(基于 Flex 构造和手工构造) 文章目录一、概述二、基于 Flex 构造词法分析器2.1 需求描述2.2 编译流程2.3 Flex 代码三、手工构造词法分析器3.1 需求描述3.2 实现流程3.3 C++ 代码四、测试用例4.1 测试用例一4.1.1 代码输入4.1.2 词法分析结果4.2 测试用例二4.2.1 代码输入4.2.2 词法分析结果4.3 测试用例三4.3.1 代码输入4.3.2 词法分析结果4.4 测试用例四4.4... 阅读详情

相关推荐

编译原理实验1:词法分析设计

通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 用 VC++/VB/JAVA 语言实现对 C 语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;同时进行标识符登记符号表的管理。

u25th_engineer的博客 5296

词法分析器(c++)

c++,编译原理实验,词法分析器

yizhizhazhahui的博客 6695

编译原理实验三 TINY语法分析器

PS:本次语法分析器实验在我的实验一词法分析器的基础上完成,我把实验一的词法器类稍作修改获得代码的token串以支持语法分析器类LL1,参考了其他博主的first follow集求解代码以及预测分析表的生成代码,注意要修改成符合自己代码数据结构的形式 博文传送门 但是他的求Follow集的代码有一点错误:求Follow集那里,只有产生式规则右部的某个非终结符B的右边其他非终结符C、D、E…的First集都包含空串时,这时才可以把产生式规则左部的Follow集加到该非终结符B的Follow集里,而不是只要紧挨

XMPTFQ的博客 5822

【编译原理】词法分析:C/C++实现

这篇史上最全的编译原理之词法分析实验讲解绝对是您的不二选择!汇总了无数专业知识,详解万字,覆盖面广泛,解释细致入微,确保您轻松理解并掌握词法分析的方方面面。无需再寻觅其他资料,只需收藏这一篇,您便能轻松掌握词法分析的精髓,提升编译原理的理解水平,事半功倍,不容错过!

朝花夕拾 2万+

C++词法分析器

这个压缩包是在下编译原理课程实验代码,用c++实现词法分析,并以窗体应用程序的形式显示出来。 实验内容及要求如下: (1)C++源代码扫描程序识别C++记号。 C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。 (2)打开一个C++源文件,打印出所有以上的记号。 (3)要求应用程序应为Windows界面。 (4)选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。因此,程序中还应该有这样的压缩功能。 (5)选作部分:进一步思考或实现——如何进一步实现减小源文件大小的压缩功能。 (6)应该书写完善的软件文档。

c++词法分析器代码 分析c++中的词法源代码

分析c++中的静态代码 功能强大 词法分析 源代码c++实现 可以内嵌入vc中使用方法与c++de

【C++】词法分析器

(代码在在最后面)

ebatudou的博客 944

C# WinForm项目目录结构详解:从入门到精通(附常见问题解决方案)

本文详细解析了C# WinForm项目目录结构,从解决方案与项目基础结构到核心文件功能,再到关键目录解析,帮助开发者快速掌握WinForm项目组织方式。文章还提供了常见问题解决方案,如引用丢失、配置文件不生效等,是WinForm开发从入门到精通的实用指南。

dream的博客 647

C++实现简单词法分析器lexer

c++实现简单词法分析器

Tea_Char的博客 822

BCIC IV 2a数据集:从下载到实战应用全解析

本文全面解析了BCI Competition IV 2a(BCIC IV 2a)数据集的应用流程。从官方渠道下载数据、解析其结构,到在MATLAB和Python环境中进行数据导入、预处理(包括处理特殊受试者A04T),并详细演示了从特征提取(如CSP)到分类(如LDA、SVM)的完整实战步骤,为脑机接口研究者提供了从入门到实践的清晰指南。

weixin_28235513的博客 975

Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌

AI 数字人直播系统是利用人工智能技术创建虚拟主播,并通过数字化技术实现直播互动的系统1。以下是其相关介绍:Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌。

weixin_ggwwsscc的博客 621

词法分析实验报告含代码介绍:深入理解词法分析与实现

词法分析实验报告含代码介绍:深入理解词法分析与实现 去发现同类优质开源项目:https://gitcode.com/ 词法分析实验报告含代码介绍,旨在帮助开发者理解词法分析的基本概念,并提供一个实用的词法分析器设计与实现方法。 项目介绍 在这个数字化时代,编程语言的编译与解析成为计算机科学领域的核心任务之一。词法分析作为编译过程的第一步,负责将源代码中的字符序列转换为记号序列,是编译器设计中的基础...

gitblog_06723的博客 922

Ubuntu20.04安装NVIDIA显卡驱动避坑指南:从.run文件到完美运行

本文详细介绍了在Ubuntu20.04系统上通过.run文件安装NVIDIA显卡驱动的完整流程和避坑技巧。从禁用Nouveau驱动、选择合适显示管理器到处理常见安装问题,提供了一套经过验证的解决方案,帮助用户顺利完成驱动安装并优化性能。

weixin_30776273的博客 604

编译原理--语法分析实验C版资源介绍:深入理解编译原理,提升语法分析能力

编译原理--语法分析实验C版资源介绍:深入理解编译原理,提升语法分析能力 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在计算机科学领域,编译原理是理解程序如何被转换成机器语言的基石。今天,我们为您介绍的是一个开源项目——编译原理--语法分析实验C版资源介绍,这是一个专门为编译原理课程设计的语法分析实验项目。项目以C++语言为基础,旨在通过实践操作,帮助学生掌握语法分...

gitblog_06781的博客 627

三菱CNC数据采集实战:从环境搭建到代码实现的完整指南

本文提供了一份完整的三菱CNC数据采集实战指南,涵盖从开发环境搭建、核心SDK获取、网络配置到基于C#和A2协议的完整代码实现。文章详细解析了初始化、连接管理、数据获取与展示四大核心模块,并分享了错误处理、性能优化及与MES系统集成的关键技巧,帮助工程师快速构建稳定可靠的工业数据采集系统。

wood5的博客 891

Calibre PEX提取HSPICE网表时如何避免‘net 0‘错误?实测解决方案分享

本文详细解析了Calibre PEX提取HSPICE网表时出现的'net 0'错误,提供了从规则文件修改到网表后处理的四步解决方案。通过实战案例和进阶调试技巧,帮助工程师有效避免节点映射错误,确保后仿真精度。特别针对SPICE netlist生成机制提出了优化建议。

weixin_29279153的博客 387

编译原理——词法分析器 C++实现

词法分析器实验目的单词分类表单词结构描述单词状态转换图算法描述程序结构源代码实验结果 实验目的 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程序字符串的词法分析。 培养团队合作精神,体会协同工作在解决问题中的作用。 单词分类表 单词符号 种类 种别码 单词符号 种类 种别码 未定义符号 未定义符号 0 =...

weixin_45693492的博客 2万+

27930-2023与27930-2015区别

描述了27930-2023与27930-2015的更新点

manjixingkong1234的专栏 3850

编译原理——词法分析器实验

实验目的 掌握词法分析器的功能。 掌握词法分析器的实现。 实验内容及要求 对于如下文法所定义的语言子集,试编写并上机调试一个词法分析程序: <程序>→PROGRAM <标识符>;<分程序>. <分程序>→<变量说明>BEGIN<语句表>END <变量说明>→VAR<变量表>:&l...

fortune_cookie的博客 2万+

redhawk如何看高toggle rate instance

1.图形界面View-Power Map - Toggle Map of Instances。redhawk通过报告和图形界面两种方式查看高toggle rate的instance。2.看warning log,在adsRpt/Warn里,搜toggle rate。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 623

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【编译原理-实验-1】词法分析器最详细设计报告(c++版)

一、实验目的 了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA编写通用的词法分析程序。(选做) 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)识别单词的类别并记录类...

计忆芳华的博客 3万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c++实现词法分析器源代码(编译原理)

下面教大家用c++语言实现编译原理中的词法分析器。 一、运行说明: 1、电脑环境:win10+64位 2、编译软件:Dev-C++ 3、将要分析的程序或字符以txt(文本)形式存在文件夹中(我分析的是qq.txt,下图是它的存储路径) 附:qq.txt int main() { char inFile[40]; FILE *fpin; analyse(fpin); return 0; } 4、...

hry1999的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

编译原理实验——C/C++语言实现简易《词法分析器》

大三上学期,学习编译原理这门课,老师布置课后作业,要使用C/C++语言实现C/C++语言词法分析器。 本偏博文适合初学者想用,博主知识挑选了几个词法进行分析,望周知。 1、学习目的 掌握词法分析器程序设计的开发过程,可以实现简单基本的词法分析,掌握基本技能(本篇博客适合初学者,如果想深入探索,请另找资料)。 2、实验步骤 (1)写出需要分析的词的语言说明 标识符:以字母或下划线开头,后跟若干字母、...

冰冻三尺非一日之寒 4878

编译原理词法分析器的c++实现

一、题目的理解和说明 编译原理这门课是计算机专业的核心课程之一,是一门研究软件是什么,为什么可以运行,以及怎么运行的学科。编译系统的改进将会直接对其上层的应用程序的执行效率,执行原理产生深刻的影响。编译原理的目的是将源语言翻译成目标语言。其过程分为词法分析、语法分析、语义分析中间代码生成、中间代码优化、代码生成等五个阶段。而本次实验所解决的问题是编译程序的第一个阶段–词法分析。 实验要求实现一个可...

weixin_42529594的博客 5969

【编译原理】实验一 词法分析器设计与实现

实验类型: 设计性 实验学时: 2 实验要求:必修 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验内容 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 : = + - * / < <= <>...

HPU_LY的博客 2万+

【编译原理|实验】词法分析器的设计与实现

通过设计、编制、调试一个具体的词法分析程序,实现对高级程序设计语言源程序进行扫描过程中将其分解为各种单词的词法分析方法;加深对课堂教学的理解;提高词法分析方法的实践能力。自行编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词, 即关键字、标识符、常数、算符、界符五大类。

爱喝冰红茶的方舟的博客 1万+
上一篇: Kimia Path 24数据集论文Classification and Retrieval of Digital Pathology Scans A New Dataset笔记
下一篇: 传输协议数据单元TPDU的类型及英文全称
RealWeakCoder
博客等级 码龄7年 236粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值