编译原理——词法分析器(C/C++代码实现)

article/2025/11/1 10:13:07

目录

0 实验目的:

1 实验要求:

2 实验内容:

3 实验思路:

4 实验代码:

5 实验结果:

6 实验总结:

7 实验程序以及实验报告下载链接:


0 实验目的:

设计、编制、实现并调试一个词法分析器,加深对词法分析的理解。


1 实验要求:

根据编译原理理论课所讲授的“单词的转换图”。如下图,编写识别单词的词法分析器,控制台输出识别出的每个单词。


2 实验内容:

1.待分析的简单的词法:

(1).关键字:

begin if then while do end 等等;

(2).运算法和界符:

:= + - * / < <= <> > >= = ; ( ) #

(3).其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID = letter(letter|digit)*

NUM = digit digit*

(4).空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段常被忽略。

2.各种单词符号对应的种别码:

各种单词符号对应的种别码
单词符号种别码单词符号种别码
begin117
if2:=18
then3<20
while4<>21
do5<=22
end6>23
letter(letter|digit)*10>=24
digit digit*11=25
+13;26
-14(27
*15)28
/16#

0

3.词法分析器的功能:
输入:所给文法的源程序字符串。
输出:二元组(syn,token,sum)构成的序列。
其中:syn为单词种别码;
           token为存放的单词自身字符串;
           sum为整型常数。
例如:对源程序begin a:=9 if a>b then x:=2*a+1/3; end的源文件,经过词法分析后输出如下序列:
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)......

3 实验思路:

  1. 首先我们应该确认待分析的五类简单的单词字符(关键字,标识符,常数,运算符,界符)。同时,我们也要知道单词符号的种类值。
  2. 将整个程序分成五个部分:判断关键字函数,判断字母函数,判断数字函数,核心子程序(语法分析程序),主函数。
  3. 设一个token数组,接收控制台输入字符流,并送给语法分析程序。同时,设置一个存放关键字key的数组。语法分析程序读取每个字符并进行判断(字母或者下划线,符号,数字)
    (1).如果是字母或者下划线,读取字符,直到下一个字符不是字母、下划线或者数字,将这一串字符保存到数组。进而与关键字数组比较,确定是关键字还是标识符。
    (2).如果是数字,读取字符直到不是数字。
    (3).如果是运算符或者界符,读取字符,并超前读取一位字符,先确定没有争议的字符,接着判断有争议的字符,如果判断异常,则输出对应的返回值。
  4. 主函数调用核心子程序(语法分析程序),并按照(种别码,单词字符)的形式输出,结束程序。

4 实验代码:

#include <bits/stdc++.h>
using namespace std;
int isDigit();
int isAlpha();
int isKey();
void scan(int &attr, int &i, char s[],int &n); 
char iskey[6][50] = {"if", "then", "begin", "while", "do", "end"};
char token[50];
//主函数 
int main()
{char s[100];printf("请输入字符串(以#结尾)\n"); int flag=0;while (scanf("%s", s)){if(strcmp(s, "#") == 0)break;int i = 0;int n=1;int attr;     if(flag==0){printf("(种别码,单词属性)\n");flag=1;}while (i <strlen(s)){scan(attr, i, s,n);if(n==1)printf("(%d,%s)\n", attr, token);}}return 0;
}
int isAlpha(char ch)//判断是不是字母 
{if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))return 1;elsereturn 0;
}
int isKey(char s[])//判断关键字 
{for (int i = 0; i < 6; i++){if (strcmp(s, iskey[i]) == 0){return i + 1;}}return -1;
}
int isDigit(char ch)//判断是不是数字 
{if (ch >= '0' && ch <= '9')return 1;elsereturn 0;
}
void scan(int &attr, int &i, char s[],int &n)//核心子程序(语法分析程序) 
{int temp = 0;if (s[i] == ' ')i++;if (isAlpha(s[i]))//开头是字母{while (isDigit(s[i]) || isAlpha(s[i])){token[temp++] = s[i];i++;}token[temp] = '\0';attr = isKey(token);if (attr == -1){attr = 10;}}else if (isDigit(s[i]))//开头是数字{while (isDigit(s[i])){token[temp++] = s[i];i++;}token[temp] = '\0';attr = 11;}else//如果是运算符或者界符{switch (s[i]){case '+':attr = 13;token[0] = s[i];token[1] = '\0';break;case '-':attr = 14;token[0] = s[i];token[1] = '\0';break;case '*':attr = 15;token[0] = s[i];token[1] = '\0';break;case '/':attr = 16;token[0] = s[i];token[1] = '\0';break;case '=':attr = 25;token[0] = s[i];token[1] = '\0';break;case ';':attr = 26;token[0] = s[i];token[1] = '\0';break;case '(':attr = 27;token[0] = s[i];token[1] = '\0';break;case ')':attr = 28;token[0] = s[i];token[1] = '\0';break;case '#':attr = 0;token[0] = s[i];token[1] = '\0';break;}if (s[i] == ':'){token[temp++] = s[i];if (s[i + 1] == '='){i++;token[temp++] = s[i];attr = 18;}else{attr = 17;}token[temp] = '\0';}if (s[i] == '<'){token[temp++] = s[i];if (s[i + 1] == '>'){i++;token[temp++] = s[i];attr = 21;}else if (s[i + 1] == '='){i++;token[temp++] = s[i];attr = 22;}else{attr = 20;}token[temp] = '\0';}if (s[i] == '>'){token[temp++] = s[i];if (s[i + 1] == '='){i++;token[temp++] = s[i];attr = 24;}else{attr = 23;}token[temp] = '\0';}i++;}
}

5 实验结果:


6 实验总结:

这个实验的要求不一样,如果你需要的不是这个,你可以稍微改一下,需要探讨的话可以与我私信。 

7 实验程序以及实验报告下载链接:

编译原理实验:包括实验一词法分析器,实验二进制分析,实验三语法分析器,实验四SLR语法分析器等其中含有实验报告,实验代码等等-C++文档类资源-CSDN文库icon-default.png?t=MBR7https://download.csdn.net/download/qq_58773908/87356376

 


http://chatgpt.dhexx.cn/article/ZyBwQYxe.shtml

相关文章

词法分析器的构成(含源代码)

标题&#xff1a;词法分析器 本人最近在学习编译原理&#xff0c;刚刚学到词法分析器&#xff0c;心想着挺好玩&#xff0c;就想着自己写一个&#xff0c;奈何一没有系统的学过c语言&#xff0c;只是粗略的看过一遍K&R的c语言书&#xff0c;所以水平尚浅&#xff0c;代码有…

java实现词法分析器

实现词法分析器 实验内容要求 一、实验目的 加深对词法分析器的工作过程的理解&#xff1b;加强对词法分析方法的掌握&#xff1b;能够采用一种编程 语言实现简单的词法分析程序&#xff1b;能够使用自己编写的分析程序对简单的程序段进行词法分 析。 二、实验内容 自定义一…

python实现词法分析器

基于python3 实现一个简单的词法分析器。 主要使用的库&#xff1a;正则表达式、tkinter 识别关键字&#xff0c;标识符&#xff0c;运算符&#xff0c;分界符&#xff0c;数字&#xff08;整数和浮点数&#xff09; 当以数字开头时报错&#xff0c;标识符超过8个字符长度时报…

词法分析器设计与实现

开篇 编译&#xff0c;简单的说&#xff0c;就是把源程序转换为可执行程序。从hello world 说程序运行机制 里面简单的说明了程序运行的过程&#xff0c;以及一个程序是如何一步步变成可执行文件的。在这个过程中&#xff0c;编译器做了很多重要的工作。对底层该兴趣的我&…

[编译原理]词法分析器的分析与实现

词法分析概述&#xff1a; 编译程序要对高级语言编写的源程序进行分析和合成&#xff0c;生成目标程序。词法分析是对源程序进行的首次分析&#xff0c;实现词法分析的程序成为词法分析程序(或词法分析器)&#xff0c;也称扫描器。像用自然语言书写的文章一样&#xff0c;源程…

词法分析器【编译原理】

实验内容&#xff1a; 基于TEST语言设计相应的词法输入器并且输出二元组 实验目的&#xff1a; 1、理解词法分析器的基本功能 2、理解简单的词法规则的描述方法 3、理解状态转化图及其实现 4、能够编写简单的词法分析器 实验原理&#xff1a; 根据DFA构造词法分析程序 1、…

词法分析器的实现

原文地址为&#xff1a; 词法分析器的实现 开篇 编译&#xff0c;简单的说&#xff0c;就是把源程序转换为可执行程序。从hello world 说程序运行机制 里面简单的说明了程序运行的过程&#xff0c;以及一个程序是如何一步步变成可执行文件的。在这个过程中&#xff0c;编译器…

词法分析器原理简介

词法分析器原理简介 词法分析器读取有字符串组成的输入流&#xff0c;并产生包含单词的输出流&#xff0c;每个单词都标记了其语法范畴&#xff08;syntactic category&#xff09;或类型&#xff0c;等效于英文单词的词类。为了完成这种聚集和分类操作&#xff0c;词法分析器…

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

词法分析器 实验目的单词分类表单词结构描述单词状态转换图算法描述程序结构源代码实验结果 实验目的 对C语言的一个子集设计并实现一个简单的词法分析器&#xff0c;掌握利用状态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程序字符串的词法分析。培养团队合作…

词法分析器(纯c语言)

一、原文章&#xff1a;词法分析器&#xff08;分析C语言&#xff09; 二、该词法分析器种别码表 三、词法分析器实现思路描述&#xff1a; 1.首先用一个数组来存储txt文本中非空白字符&#xff0c;并将存储字符的个数记录下来。 2.用scan()函数扫描数组中的字符&#xff0c…

编译原理--词法分析器(python语言实现)

词法分析器 最近在学习编译原理。由于实验要求有词法分析器&#xff0c;这里我就先记录一下词法分析器实现过程以及具体思路。 目标语言 此处我选择的目标语言是c语言的子集来进行词法分析。 实现语言 此处我选用的语言是python&#xff0c;主要还是考虑到python的数据结构…

词法分析器--C实现

实验目的&#xff1a; 编制一个读单词过程&#xff0c;从输入的源程序中&#xff0c;识别出各个具有独立意义的单词&#xff0c;即基本保留字、标识符、常数、运算符、分隔符五大类(可自主添加类别)。并依次输出各个单词的内部编码及单词符号自身值。 程序及其子程序&#xff1…

c语言实现词法分析器

词法分析器的功能:输入源程序&#xff0c;输出单词字符。单词字符一般可以分为下面五种。 &#xff08;1&#xff09;关键字 是由程序语言定义的具有固定意义的标识符。有时称这些标识符为保留字或者基本字。例如c语言中的int,char,define,strcut,double,if,else.等等 &#xf…

词法分析器(分析C语言)

问题描述&#xff1a; 用C或C语言编写一个简单的词法分析程序&#xff0c;扫描C语言小子集的源程序&#xff0c;根据给定的词法规则&#xff0c;识别单词&#xff0c;填写相应的表。如果产生词法错误&#xff0c;则显示错误信息、位置&#xff0c;并试图从错误中恢复。简单的恢…

词法分析器(c++)

前景提示&#xff1a; 个人觉得单纯是用来完成实验报告的话还行&#xff0c;但仅做参考&#xff0c;因为本人的编程水平有限&#xff0c;怕误人子弟。 本次代码支持以下操作&#xff1a; 单行注释 多行注释 文件形式输入 种别码可以在文件中自由修改 单词字符串识别支持…

词法分析——词法分析器的作用

目录 综述 正文 1 词法分析与语法分析 2 词法单元、模式和词素 3 词法单元的属性 4 词法错误 综述 词法分析是编译的第一阶段。词法分析器的主要作用是读入源程序的输入字符、将它们组成词素&#xff0c;生成并输出一个词法单元序列&#xff0c;每个词法单元对应一个词素。…

词法分析器

词法分析&#xff08;Lexical Analysis&#xff09; 词法分析器在英文中一般叫做 Tokenizer。 有一个计算模型&#xff0c;叫做有限自动机&#xff08;Finite-state Automaton&#xff0c;FSA&#xff09;&#xff0c;或者叫做有限状态自动机&#xff08;Finite-state Machin…

编译原理——词法分析器

1 概述 设计、编制并调试一个简单的C语言词法分析程序&#xff0c;掌握利用状态转换图设计词法分析器的基本方法&#xff0c;利用该词法分析器完成对源程序字符串的词法分析。通过对该词法分析器的设计&#xff0c;加深对词法分析原理、状态转换图等编译原理知识的理解。 2 使…

编译原理词法分析器(C/C++)

前言&思路 词法分析器不用多说&#xff0c;一开始我还不知道是什么样的&#xff0c;看了下别人的博客&#xff0c;再看看书&#xff0c;原来是输出二元组&#xff0c;这不就是字符串操作嘛。然后细看几篇博客&#xff0c;发现大都是用暴力判断来写的。我对代码重复性比较高…

【编译原理】词法分析(C/C++源代码+实验报告)

文章目录 1 实验目的和内容1.1实验目的1.2实验内容 2 设计思想2.1单词种类及其正规式2.2 根据正规式构造NFA2.3根据NFA构造DFA2.3.1根据替换规则构造未化简的DFA2.3.2最小化DFA 3算法流程4源程序5调试数据5.1 测试样例一5.2 测试样例二5.3 测试样例三 6实验调试情况及体会6.1 实…