编译原理:第七节 及词法分析器的C++和Python实现

从3D相机数据到三维模型:Halcon实战深度图、亮度图与点云转换全流程 本文详细解析了如何利用Halcon将3D相机采集的深度图、亮度图转换为三维点云模型的完整流程。通过实战案例分享,涵盖数据格式处理、点云生成方法(SDK接口与纯Halcon实现)、三维模型可视化优化等关键技术,帮助工程师解决工业检测中的实际难题,提升三维重建精度与效率。 阅读详情

编译原理:词法分析

概述:

词法分析是完成编译程序的第一个阶段的工作。所谓词法分析就是对输入字符串形式的源程序按顺序进行扫描,识别其中的字符串作为输出。词法分析器的作用
就是完成这个阶段。词法分析器的是所有编译器所必须的。例如:

这是Python的架构,我们可以看到Scanner,它所做的就是进行词法分析。
举个简单的C/C++的例子,来直观的看一下词法分析器的功能:

我们看到词法分析器识别出了关键字,标识符,整数和一些特殊的符号,并以二元组的形式输出。我们使用的编译器的词法分析和这个原理上式一致的,只是复杂了很多。

词法分析器的实现:

首先,构造识别单词的状态转换图
然后,编程实现状态转换图

例如我们用DFA来表示可识别的单词:

我们把它们进行合并,如图:

利用此图我们就可以识别标识符,无符号整数,分界符,运算符。接下来我们就可以编程来实现。其实本质来说我们就是利用状态转移,我们可以规定开始时为0状态(即图中的S状态)读入一个字符,如果是字母,则状态变为1,是数字则状态变为2........出口定义为结束状态,可以用一个整数值来表示,若状态为终结状态则输出。上图部分用代码表示:
GETNEXTCHAR( ) ; 
SWITCH(CHCODE);
{
CASE   1: { WHILE  (ISLETTER OR ISDIGIT) DO
                                               { 
                                                     SAVE( ); //  当前字符放入一临时字符数组; 
                                                    GETNEXTCHAR( ) ;//从缓冲区取下一字符
                                                  };
                                    UNGETCH;//回退一字符
                                    OUTPUT(1,标识符名字);
                               };BREAK;
CASE   2: { WHILE ISDIGIT DO
                                                      { 
                                                      SAVE( ); //  当前字符放入一临时字符数组;
                                                       GETNEXTCHAR ;//从缓冲区取下一字符
                                                         };
                                     UNGETCH;//回退一字符
                                     OUTPUT (2, 整数);
                            }; BREAK;  

下面给出一个词法分析器的完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#define MAXSIZE 100//缓冲区大小
#define RESWORD 9
int state = 0;//DFA状态
int index = 0;//用于记录识别文法的长度
char ch;//每次读取的字符
char chserious[MAXSIZE];//用于记录识别的文法(缓冲区)
long ll;//文件读取位置
int line = 0;//行号
int error_count = 0;//不可识别字符的个数
int annotate_count = 0;//注释的个数
char ResWord[][10] = {"int","if","then","else","end","repeat","until","read","write"};//保留字
FILE *file = fopen("N:\\wang.txt","rt+");
struct Error_message//记录不可识别字符信息
{
	int line_number;
	char error_char;
};
struct Annotate_message//记录注释信息
{
	int line_number;
	char annotate[MAXSIZE];
};
bool CheckRes(char *str)//检查是否为保留字
{
	for(int i=0;i<RESWORD;i++)
	{
		if(strcmp(str,ResWord[i])==0)
			return true;
	}
	return false;	
}
struct Error_message message[MAXSIZE];
struct Annotate_message annotateMessage[MAXSIZE];
int main()
{	
	while(!feof(file))
	{
		ch = fgetc(file);
		if(ch == '\n')
			line++;
		switch(state)
		{
			case 0:
				index = 0;
				chserious[0] = ch;
				if(isalpha(ch))
					state = 1;
				else if(isdigit(ch))
					state = 3;
				else if(ch == '+')
					state = 5;
				else if(ch == '-')
					state = 9;
				else if(ch == '*')
					state = 13;
				else if(ch == '/')
					state = 16;
				else if(ch == '=')
					state = 20;
				else if(ch == '<')
					state = 21;
				else if(ch == '{')
					state = 22;
				else if(ch == '}')
					state = 23;
				else if(ch == ';')
					state = 24;
				else if(ch != EOF)
				{	
					if(!isspace(ch)&&(ch!='\n'))
					{
						message[error_count].line_number = line/2;
						message[error_count].error_char = ch;
						error_count++;
					}
					state = 25;
				}
				break;

			case 1:
				while(isalpha(ch)||isdigit(ch))
				{
					index ++;
					chserious[index] = ch;
					ch = fgetc(file);
				}			
				ll = ftell(file);
				if(ch == '\n')
					line++;
				if(ch == EOF)
					fseek(file,ll-1L, SEEK_SET);//回退
				else
					fseek(file,ll-2L, SEEK_SET);//回退
				state = 2;
				break;
			case 2:
				if(CheckRes(chserious))
					printf("(关键字,%s)\n",chserious);
				else
					printf("(标识符,%s)\n",chserious);
				state = 0;
				index = 0;
				memset(chserious,'\0',sizeof(chserious));
				break;
			case 3:
				while(isdigit(ch))
				{
					index++;
					chserious[index] = ch;
					ch = fgetc(file);
				}
				ll = ftell(file);
				if(ch == EOF)
					fseek(file,ll-1L, SEEK_SET);//回退
				else
					fseek(file,ll-2L, SEEK_SET);//回退
				state = 4;
				break;
			case 4:
				if(ch == '\n')
					line++;
				printf("(数,%s)\n",chserious);
				state = 0;
				index = 0;
				memset(chserious,'\0',sizeof(chserious));
				break;
			case 5:
				if(ch == '+')
					state = 6;
				else if(ch == '=')
					state = 7;
				else
					state = 8;
				
				break;
			case 6:
				printf("(特殊符号,++)\n");
				ll = ftell(file);
				if(ch!=EOF)
					fseek(file,ll-1L, SEEK_SET);//回退
				state = 0;
				break;
			case 7:
				printf("(特殊符号,+=)\n");
				ll = ftell(file);
				//printf("%ld",ll);
				if(ch!=EOF)
					fseek(file,ll-1L, SEEK_SET);//回退
			
				state = 0;
				break;
			case 8:
				printf("(特殊符号,+)\n");
				ll = ftell(file);
				fseek(file,ll-2L, SEEK_SET);//回退
				state = 0;
				break;
			case 9:
				if(ch == '-')
					state = 10;
				else if(ch == '=')
					state = 11;
				else
					state = 12;
				break;
			case 10:
				printf("(特殊符号,--)\n");
				ll = ftell(file);
				if(ch!=EOF)
					fseek(file,ll-1L, SEEK_SET);//回退
				state = 0;
				break;
			case 11:
				printf("(特殊符号,-=)\n");
				ll = ftell(file);
				if(ch!=EOF)
					fseek(file,ll-1L, SEEK_SET);//回退
				state = 0;
				break;
			case 12:
				printf("(特殊符号,-)\n");
				ll = ftell(file);
				fseek(file,ll-2L, SEEK_SET);//回退
				state = 0;
				break;
			case 13:
				if(ch == '=')
					state = 14;
				else
					state = 15;
				break;
			case 14:
				printf("(特殊符号,*=)\n");
				ll = ftell(file);
				if(ch!=EOF)
					fseek(file,ll-1L, SEEK_SET);//回退
				state = 0;
				break;
			case 15:
				printf("(特殊符号,*)\n");
				ll = ftell(file);
				fseek(file,ll-2L, SEEK_SET);//回退
				state = 0;
				break;
			case 16:
				if(ch == '/')
					state = 17;
				else if(ch == '=')
					state = 18;
				else
					state = 19;
				break;

			case 17:
				{
					printf("(特殊符号,//)\n");
					ll = ftell(file);
					fseek(file,ll-1L, SEEK_SET);//回退
					state = 0;

					ch = fgetc(file);
					//printf("line:%d\n",line/2);
					annotateMessage[annotate_count].line_number = line/2;
					int j = 0;
					while(ch!='\n'&&ch!=EOF)
					{
						//printf("---------%c******\n",ch);
						annotateMessage[annotate_count].annotate[j] = ch;
						ch = fgetc(file);
						j++;
					}
					line+=2;
					annotate_count++;
					//exit(0);

					break;
				}
			case 18:
				printf("(特殊符号,/=)\n");
				ll = ftell(file);
				if(ch!=EOF)
					fseek(file,ll-1L, SEEK_SET);//回退
				state = 0;
				break;
			case 19:
				printf("(特殊符号,/)\n");
				ll = ftell(file);
				fseek(file,ll-2L, SEEK_SET);//回退
				state = 0;
				break;
			case 20:
				printf("(特殊符号,=)\n");
				if(ch != EOF)
				{
				    ll = ftell(file);
				    fseek(file,ll-1L, SEEK_SET);//回退
				}
				state = 0;
				break;
			case 21:
				printf("(特殊符号,<)\n");
				if(ch != EOF)
				{
				    ll = ftell(file);
				    fseek(file,ll-1L, SEEK_SET);//回退
				}
				state = 0;
				break;
			case 22:
				printf("(特殊符号,{)\n");
				if(ch != EOF)
				{
				    ll = ftell(file);
				    fseek(file,ll-1L, SEEK_SET);//回退
				}
				state = 0;
				break;
			case 23:
				printf("(特殊符号,})\n");
				if(ch != EOF)
				{
				    ll = ftell(file);
				    fseek(file,ll-1L, SEEK_SET);//回退
				}
				state = 0;
				break;
			case 24:
				printf("(特殊符号,;)\n");
				if(ch != EOF)
				{
				    ll = ftell(file);
				    fseek(file,ll-1L, SEEK_SET);//回退
				}
				state = 0;
				break;
			case 25:
				if(isspace(ch))
					printf("(特殊符号,空格)\n");
				//printf("****%c****\n",ch);
				if(ch != EOF)
				{
				    ll = ftell(file);
				    fseek(file,ll-1L, SEEK_SET);//回退
				}
				state = 0;
			default:
				break;
		}
	}
	fclose(file);
	//printf("%d\n",state);
	//printf("%s\n",chserious);
	printf("注释内容的个数为:%d 分别为:\n",annotate_count);
	for(int j=0;j<annotate_count;j++)
	{
		printf("(%d,%s)\n",annotateMessage[j].line_number,annotateMessage[j].annotate);
	}
	printf("不可识别的字符个数为:%d 分别为:\n",error_count);
	for(int i=0;i<error_count;i++)
	{
		printf("(%d,%c)\n",message[i].line_number,message[i].error_char);
	}	
	return 0;
}

下面我用Python重写了这个词法分析器,更加简洁,每次读入文件一行进行处理(上面C++版本每次读入一个字符),代码如下:

# -*- coding: cp936 -*-
'''
DFA有限自动机Python实现
作者:王灿
2015-9-27于中国矿业大学
'''
class DFA:
    file_object = ''#文件句柄
    line_number = 0 #记录行号
    state = 0 #状态
    ResWord = ['int','if','then','else','end','repeat','until','read','write']#保留字
    error_message = []#保存错误信息,存储元组,元组第一个参数是行号,第二个参数是错误字符
    annotate_message = []#注释信息,存储元组,元组第一个参数是行号,第二个参数是注释
    char_message = []#识别的字符串,存储元组,元组第一个参数是类型,第二个参数是该字符串

    def __init__(self,file_name):
        self.file_object = file_name
        self.state = 0
        self.line_number = 0
        self.error_message = []
        self.annotate_message = []
        self.char_message = []
    def Start_convert(self):
        for line in self.file_object:#一行行的处理
            line = line.strip('\n')#去除换行fu
            self.line_number += 1#没处理一行行号加一
            line_length = len(line)
            i = 0
            string = ''#存储一个字符串
            while i < line_length:
                ch = line[i]#读取该行的一个字符
                i += 1
                if self.state == 0:#初始状态
                    string = ch
                    if ch.isalpha():
                        self.state = 1
                    elif ch.isdigit():
                        self.state = 3
                    elif ch == '+':
                        self.state = 5
                    elif ch == '-':
                        self.state = 9
                    elif ch == '*':
                        self.state = 13
                    elif ch == '/':
                        self.state = 16
                    elif ch == '=':
                        self.state = 20
                        i -= 1
                    elif ch == '<':
                        self.state = 21
                        i -= 1
                    elif ch == '{':
                        self.state = 22
                        i -= 1
                    elif ch == '}':
                        self.state = 23
                        i -= 1
                    elif ch == ';':
                        i -= 1
                        self.state = 24
                    elif ch.isspace():
                        self.state = 25
                    else:
                        self.state = 26#不可识别状态
                        i -= 1
                elif self.state == 1:#判断字母数字
                    while ch.isalpha() or ch.isdigit():
                        string += ch                       
                        if i < line_length:
                            ch = line[i]
                            i += 1
                        else:
                            break
                    self.state = 2
                    i -= 2#回退2个字符
                elif self.state == 2:
                    if string in self.ResWord:
                        content = '(关键字,' + string + ')'                    
                    else:
                        content = '(标识符,' + string + ')'
                    #print content
                    self.char_message.append(content)
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 3:
                    while ch.isdigit():
                        string += ch                       
                        if i < line_length:
                            ch = line[i]
                            i += 1
                        else:
                            break
                    self.state = 4
                    i -= 2#回退2个字符
                elif self.state == 4:
                    content = '(数字,' + string + ')'
                    self.char_message.append(content)
                    #print string
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 5:
                    if ch == '+':
                        self.state = 6
                        i -= 1
                    elif ch == '=':
                        self.state = 7
                        i -= 1
                    else:
                        self.state = 8
                        i -= 2
                elif self.state == 6:#判断++
                    content = '(特殊符号,' + string + ch + ')'
                    self.char_message.append(content)
                    #print string + ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 7:#判断+=
                    content = '(特殊符号,' + string + ch + ')'
                    self.char_message.append(content)
                    #print string + ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 8:#判断+
                    content = '(特殊符号,' + ch + ')'
                    self.char_message.append(content)
                    #print ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 9:
                    if ch == '-':
                        self.state = 10
                        i -= 1
                    elif ch == '=':
                        self.state = 11
                        i -= 1
                    else:
                        self.state = 12
                        i -= 2
                elif self.state == 10:
                    content = '(特殊符号,' + string + ch + ')'
                    self.char_message.append(content)
                    #print string + ch#判断--
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 11:#判断-=
                    content = '(特殊符号,' + string + ch + ')'
                    self.char_message.append(content)
                    #print string + ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 12:#判断-
                    content = '(特殊符号,' + ch + ')'
                    self.char_message.append(content)
                    #print ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 13:
                    if ch == '=':
                        self.state = 14
                        i -= 1
                    else:
                        self.state = 15
                        i -= 2
                elif self.state == 14:#判断*=
                    content = '(特殊符号,' + string + ch + ')'
                    self.char_message.append(content)
                    #print string + ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 15:#判断*
                    content = '(特殊符号,' + ch + ')'
                    self.char_message.append(content)
                    #print ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 16:
                    if ch == '/':
                        self.state = 17
                        i -= 1
                    elif ch == '=':
                        self.state = 18
                        i -= 1
                    else:
                        self.state = 19
                        i -= 2
                elif self.state == 17:#判断//
                    content = '(特殊符号,' + string + ch + ')'
                    self.char_message.append(content)
                    content = '(注释,'+ line[i:] +')'
                    self.annotate_message.append(content)
                    #print content          
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 18:#判断/=
                    content = '(特殊符号,' + string + ch + ')'
                    self.char_message.append(content)
                    #print string + ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 19:#判断/
                    content = '(特殊符号,' + ch + ')'
                    self.char_message.append(content)
                    #print ch
                    string = ''#回到初始情况
                    self.state = 0#回到状态0
                elif self.state == 20:
                    content = '(特殊符号,=)'
                    self.char_message.append(content)
                    #print '='
                    self.state = 0
                    string = ''
                elif self.state == 21:
                    content = '(特殊符号,<)'
                    self.char_message.append(content)
                    #print '<'
                    self.state = 0
                    string = ''
                elif self.state == 22:
                    content = '(特殊符号,{)'
                    self.char_message.append(content)
                    #print '{'
                    self.state = 0
                    string = ''
                elif self.state == 23:
                    content = '(特殊符号,})'
                    self.char_message.append(content)
                    #print '}'
                    self.state = 0
                    string = ''
                elif self.state == 24:
                    content = '(特殊符号,;)'
                    self.char_message.append(content)
                    #print ';'
                    self.state = 0
                    string = ''
                elif self.state == 25:
                    while ch.isspace():
                        if i < line_length:
                            ch = line[i]
                            i += 1
                        else:
                            break
                    self.state = 0
                    i -= 1
                elif self.state == 26:
                    content = '(行号:'+str(self.line_number)+',' + ch + ')'
                    self.error_message.append(content)
                    #print 'error:' + ch
                    self.state = 0
                    string = ''
        #print self.state
    def Get_error(self):#获取错误信息
        return self.error_message

    def Get_annotate(self):#获取注释信息
        return self.annotate_message

    def Get_char(self):#获取识别信息
        return self.char_message
'''
*****************测试内容************************
try:
    file_object = open("N:\\wang4.txt")
    dfa = DFA(file_object)
    dfa.Start_convert()
    content = dfa.Get_char()
    for item in content:
        print item
    content = dfa.Get_annotate()
    for item in content:
        print item
    content = dfa.Get_error()
    for item in content:
        print item
finally:  
    file_object.close()  
'''

利用面向对象的机制,我们很容易做到数据,数据处理和GUI端的分离,便于代码复用和重构,把上面Python代码做成一个简单的GUI如下:


从PCB走线到天线:用史密斯圆图搞定2.4GHz频段的阻抗匹配陷阱 本文深入探讨了2.4GHz频段PCB设计中阻抗匹配的挑战与解决方案,重点介绍了史密斯圆图在射频和天线阻抗匹配中的应用。通过实战案例和详细步骤,帮助工程师有效解决高频信号传输中的阻抗失配问题,提升物联网设备的通信性能。 阅读详情

相关推荐

避开内存陷阱:手把手教你用RKNN零拷贝接口正确管理输入输出Tensor

本文深入解析RKNN零拷贝接口在边缘计算中的高效内存管理策略,通过YOLOX实例演示如何避免内存对齐错误和数据错位。详细介绍了`rknn_tensor_mem`系列API的正确使用方法,包括内存创建、绑定、释放全流程,以及性能优化技巧如内存池技术和多核NPU负载均衡,帮助开发者提升推理效率并避开常见陷阱。

weixin_33686714的博客 160

编译原理课设 词法分析 语法分析 C++实现

https://github.com/McFly-byte/compiler/tree/master 文章目录课程设计总览课程设计要求项目基本内容词法分析器语法分析器项目结构文件说明:项目结构:词法分析器(Lexer)实现原理识别类型正规文法重要类与结构定义NFA 不确定的有穷自动机LA 词法分析isEquallALL 比较类(在map中根据second找key)重要函数运行结果输入源程运行时相关信息运行结果语法分析器(Parser)实现原理原理文法重要类与结构定义LR(0)LR(1)重要函数运行结果运行时

weixin_45665700的博客 5577

BOM 数据模型设计

字段名数据类型必填说明物料编码 (Part Number)字符串是唯一标识,主键。建议包含分类前缀(如STD-GEN-CUS-物料名称 (Part Name)字符串是版本 (Revision)字符串是如AB1.0,与编码组合构成唯一实例。状态 (Status)枚举是设计中(Draft)已发布(Released)已归档(Archived)已作废(Obsoleted)类型 (Type)枚举是专用件(Custom)借用件(Borrowed)通用件(Generic)标准件(Standard)

Davina_yu的博客 1756

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

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

朝花夕拾 2万+

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

本文详细介绍了OpenWrt虚拟机磁盘扩容的完整流程,重点对比了SquashFS和ext4文件系统在扩容操作上的关键差异。通过五步安全迁移法和直接分区调整方案,帮助用户有效解决磁盘空间不足问题,同时提供高级技巧和故障排除指南,确保扩容过程顺利无坑。

weixin_29251131的博客 229

Anthropic API接入指南:连接失败、403鉴权与Claude Code集成排查

在AI应用开发中,API接入与鉴权机制是开发者绕不开的基础工程问题。无论是调用云端模型服务还是自建网关,网络连通性、HTTP状态码语义、模型路由映射都会直接影响服务可用性。本文从通用的网络诊断与鉴权原理出发,梳理了从TCP连接失败到403权限拒绝的典型链路,并深入解析网关模型路由匹配机制。在此基础上,进一步说明如何通过环境变量完成Claude Code与VS Code的本地集成,以及一套基于Python的可复现接入方案。内容涵盖Anthropic API高频报错定位、curl冒烟测试、SDK工程化实践,适合

weixin_28743405的博客 467

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

词法分析器不用多说,一开始我还不知道是什么样的,看了下别人的博客,再看看书,原来是输出二元组,这不就是字符串操作嘛。然后细看几篇博客,发现大都是用暴力判断来写的。我对代码重复性比较高的方法不太感冒,不是说我编程有多好,就是单纯的不喜欢。于是我就想到了用偏移量的方法,先弄好单词分类器,再用几个数组将关键字、运算符、界符的所有定义的字符串保存为全局变量,顺序要按单词分类器的顺序,然后根据这三种字符串在表中的位置,定一个偏移量。

沉在海里的鱼的博客 2万+

带你学习Android中的ContentObserver

通过使用,开发者可以有效地监听系统设置的变化,例如屏幕亮度等。这种机制使得应用能够动态响应系统设置的更改,提升用户体验。在实现需要与系统设置交互的应用时,合理使用是非常重要的。

执剑人 1311

编译原理:C++词法分析器

编译原理之C++词法分析器 1.明确实验目的: 对于每一个以文件形式给出的C或C++项目,对其进行词法分析 如图所示 2.分析实验需求: 第一:需要对文件进行读取,则需要用到文件读取流 第二:既然是词法分析,那就涉及到需要对每一个字符进行分析和归类 第三:既然是对每个字符进行分析,那代码的架构就是基于每一个字符,所以函数的编写是基于读取到的每一个字符。 3.进行实验: 首先我需要对所有的 首先我需要写出实验中所要用到的函数名和它的功能 bool isKey() //判断是否为关键字的嵌套函数,给出C++中

weixin_44219441的博客 1999

Qt Creator设计器里也能拖拽?5步将你的QML自定义控件变成可视化插件(Qt6.5+)

本文详细介绍了如何在Qt Creator设计器中实现QML自定义控件的可视化拖拽功能(Qt6.5+)。通过5个步骤,从构建可插件化的QML控件基础到部署插件到设计器环境,帮助开发者将自定义控件转化为设计器插件,提升团队协作效率。特别适合需要频繁调整UI样式的开发场景。

weixin_29214559的博客 171

模型预测控制(MPC)解析(三):多输入多输出系统

本文为阅读笔记,仅供学习交流使用!!! 在之前的文章中,为了简单起见,以单输入单输出系统为例介绍了MPC控制的实现方法。因为使用的是状态空间方程作为系统模型,这种方法可以轻松的扩展到多输入多输出系统中。 ...

行者无疆的博客 1万+

编译原理---词法分析器的简单实现(c++)

什么是词法分析器 简单来说,词法分析器,就是将用户输入的代码(一个个字符)通过某种方式拼接成有意义的一个个字符片段,什么是有意义呢?不同语言的定义不太相同,但大体来说,有意义表示这五类:关键字、标识符、数字串、运算符和分隔符、空白字符。拼接的方式多种多样,可以使用DFA也可以单纯的进行字符的拼接。 大致思路 这里就使用字符的拼接,由于这个程序比较简单,就每次判断下一个字符是字母、数字或者下划...

weixin_43919032的博客 5061

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python实现c语言词法分析器

一、构造程序设计语言的描述 <程序>→<类型说明>main(){ <函数体> } <类型说明>→char|int <函数体>→<变量声明部分>|<常量定义>|<输入语句>|<条件语句>|<循环语句>|<表达式>|<输出语句><返回语句> <常量定义>→<类型说明><赋值语句>;|<赋值语句>; <变量

小多的博客 3360

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

编译原理实践:C++实现语义分析器(学习笔记)

编译原理实践:C++实现语义分析器(学习笔记)实践说明输入举例(input.txt)输出举例(output.txt)编程平台代码实现基本思路语义分析部分预定义主函数定义语义分析部分函数语法分析主函数语句串分析函数语句分析函数(等号右边的)表达式分析函数项分析函数因子分析函数 实践说明 【题目要求】 基于已编写的C++语法分析器,分析当前目录下input.txt文件中的语义并生成中间代码。 input.txt中的待分析代码必须以begin开头、以end结尾,文件最后以#结束。 输出结果存放到当前目录下的out

XXX 8713

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

编译原理实践:C++实现语法分析器(学习笔记)

编译原理实践:C++实现语法分析器(学习笔记)实践说明输入举例(input.txt)输出举例(output.txt)编程平台代码实现基本思路语法分析部分预定义主函数定义语法分析主函数语句串分析函数语句分析函数(等号右边的)表达式分析函数项分析函数因子分析函数特殊处理 实践说明 【题目要求】 基于已编写的C++词法分析器,分析当前目录下input.txt文件中的词法和语法,input.txt中的待分析代码必须以begin开头、以end结尾,文件最后以#结束。 词法和语法正确则输出success,词法错误则输出

XXX 1万+

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

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

weixin_45693492的博客 2万+

《编译原理》实验一:词法分析器 C++ 版

《编译原理》实验一:词法分析器 C++ 版 考虑如下C语言子集: 单词 | 类别编码 | 助记符 | 值 -------- | ----- | ----- | ----- | ----- break | 1 | BREAK | _ char | 2 | CHAR | _ do | 3 | DO | _ double | 4 | DOUBLE | _ else | 5 | ELSE | _ if | 6 | IF | _ int | 7 | INT | _ retur

weixin_45655332的博客 5418

C++:编译原理实验之词法分析器

一、实验目的 学会针对DFA转换图实现相应的高级语言源程序。 深刻领会状态转换图的含义,逐步理解有限自动机。 掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。 加强对C语言的掌握 二、实验内容 C计算机语言的编译程序的词法分析部分实现。 从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。 为了简化程序的编写,有具体的要求如下: 空白符仅仅是空格、回车符、制表符。 代码是自由格式。 注释应放在花括号之内,并且不允许嵌套 C语言的单词

赵和范 3485

词法分析器 【编译原理】C++实现}

通过文件输入输出

sddya的博客 6100

简单词法分析器——C++实现 (编译原理作业)

词法分析器——C++实现 单词符号表示 (1)标识符:以字母开头的包含字母和数字的符号 (2)保留字:while、if、else、switch、case (3)常数:数字0~9 (4)运算符:+、-、*、<、<=、==、= (5)界符:; (6)需略除的:空格、制表符、换行符 主要函数 concatenation() //连接token和character中字符作为token中新的字符串 letter ()//判断是否字母 digit() //判断是否数字 reserve() //按照tok

qq_53485165的博客 5934

词法分析器-python

python写的词法分析器

weixin_51155298的博客 974

编译原理(1)简单词法分析程序(C++实现)

(1)判断由科学计数法表示的整数的正则表达式不完整,存在缺漏。(2)以逗号分割单句表达式,当char或string语句中存在逗号时,会出错。改进思路:当逗号存在于char或string中时,进行优先级判断。

CH_whale的博客 1782

【C++】编译原理+预测分析方式构造语法分析器

(代码在最后面)

ebatudou的博客 3156

编译原理实验一:词法分析(附完整C/C++代码)

本文讲述了对C语言进行简单的词法分析的代码如何实现。文中把所有c语言单词分为基本保留字,标识符,常数,运算符,分隔符五大类,并给出了状态转换图组合成的状态转换机。首先要准备三个文件:源程序.txt,预处理.txt,词法分析.txt(注意编码格式为ASCLL,不然中文会乱码把要分析的代码放到源程序.txt中,程序首先会读取此文件中的代码进行预处理(去除注释),把处理好的代码放到预处理.txt。源代码如下//预处理预处理后的代码。

W_Wmwmwm的博客 5537

【编译原理】C++简单词法分析器的实现

编译原理中确定的有限无穷DFA的C++实现,识别字符串,可进行错误处理。

PengZyi的博客 3714

【编译原理】Python编译原理词法分析

目录 一、实验目的 二、实验任务 三、实验原理 1 词法分析的基本概念 2 直接扫描法 3 有限状态自动机 4 flex简介 四、实验过程 1 直接扫描法 2 用flex词法分析生成器进行词法分析 五、实验结果 1 直接扫描法 2 flex词法分析生成器进行词法分析 参考资料 附录 1 直接扫描法代码 2 hide-digits.l文件 一、实验目的 1、掌握直接扫描法; 2、了解正则表达式与有限状态自动机; 3、了解如何使用FLEX等工具完成词法分析。 ..

weixin_43442778的博客 4011
上一篇: 编译原理:第六节
下一篇: Android:unable to start Activity ...的几种原因
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值