【编译原理】c++实现词法分析器
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!
本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/8867199.html
Talk is cheap, show you my source code:
/*
this code was first initiated by TZ
contact email:xmb028@163.com
personal website:wnm1503303791.github.io
personal blogs:www.cnblogs.com/acm-icpcer/
this code has been posted on my personal blog,checking url:www.cnblogs.com/acm-icpcer/p/8867199.html
Copyright © 2018 TZ.
All Rights Reserved.
*/ #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std; char buffer[];
char remains[][]=
{
"begin",
"call",
"const",
"do",
"end",
"if",
"odd",
"procedure",
"read",
"then",
"var",
"while",
"write"
};
char r_output[][]=
{
"beginsym",
"callsym",
"constsym",
"dosym",
"endsym",
"ifsym",
"oddsym",
"proceduresym",
"readsym",
"thensym",
"varsym",
"whilesym",
"writesym"
}; int number(int i)
{
char temp[];
int t=;
while(buffer[i]>=&&buffer[i]<=)
{
temp[t++]=buffer[i++];
}
cout<<"(number,"<<temp<<")"<<endl;
return i;
} int letter(int i)
{
char temp[];
memset(temp,'\0',strlen(temp));
int t=;
while((buffer[i]>=&&buffer[i]<=)||(buffer[i]>=&&buffer[i]<=)||(buffer[i]>=&&buffer[i]<=))//判断基本字和标识符
{
temp[t++]=buffer[i++];
}
for(int a=;a<;a++)
{
if(strcmp(temp,remains[a])==)
{
cout<<"("<<r_output[a]<<","<<remains[a]<<")"<<endl;
return i;
}
}
cout<<"(ident,"<<temp<<")"<<endl;//默认该语法的标识符不可以以数字开头,否则此代码需重构
return i;
} int delimiter(int i)
{
char temp=buffer[i];
switch (temp)
{
case '(':
cout<<"(lparen, "<<buffer[i]<<" )"<<endl;
break;
case ')':
cout<<"(rparen, "<<buffer[i]<<" )"<<endl;
break;
case ',':
cout<<"(comma, "<<buffer[i]<<" )"<<endl;
break;
case ';':
cout<<"(semicolon, "<<buffer[i]<<" )"<<endl;
break;
case '.':
cout<<"(period, "<<buffer[i]<<" )"<<endl;
break;
}
return ++i;
} int operators(int i)
{
char temp=buffer[i];
switch (temp)
{
case '+':
cout<<"(plus, "<<buffer[i]<<" )"<<endl;
return ++i;
case '-':
cout<<"(minus, "<<buffer[i]<<" )"<<endl;
return ++i;
case '*':
cout<<"(times, "<<buffer[i]<<" )"<<endl;
return ++i;
case '/':
cout<<"(slash, "<<buffer[i]<<" )"<<endl;
return ++i;
case '=':
cout<<"(eql, "<<buffer[i]<<" )"<<endl;
return ++i; case '<':
if(buffer[i+]=='>')
{
cout<<"(neq, "<<buffer[i]<<buffer[i+]<<" )"<<endl;
return (i+);
}
if(buffer[i+]=='=')
{
cout<<"(leq, "<<buffer[i]<<buffer[i+]<<" )"<<endl;
return (i+);
}
cout<<"(less, "<<buffer[i]<<" )"<<endl;
return ++i; case '>':
if(buffer[i+]=='=')
{
cout<<"(geq, "<<buffer[i]<<buffer[i+]<<" )"<<endl;
return (i+);
}
cout<<"(gtr, "<<buffer[i]<<" )"<<endl;
return ++i; case ':':
if(buffer[i+]=='=')
{
cout<<"(becomes, "<<buffer[i]<<buffer[i+]<<" )"<<endl;
return (i+);
}
else return i;
}
} int main()
{
memset(buffer,'\0',strlen(buffer));
while(scanf("%s",&buffer))
{
int pointer=;
//processing
while(pointer<strlen(buffer))
{
//1:number
if( buffer[pointer]>=
&&buffer[pointer]<= )//go to the number process
pointer=number(pointer);
//2:letter
else if( (buffer[pointer]>=&&buffer[pointer]<=)
||(buffer[pointer]>=&&buffer[pointer]<=) )//go to letter process
pointer=letter(pointer);
//3:delimiter
else if( buffer[pointer]=='('
||buffer[pointer]==')'
||buffer[pointer]==','
||buffer[pointer]==';'
||buffer[pointer]=='.' )//prcessing delimiter,in chinese we call:jie fu~
pointer=delimiter(pointer);
//4:operators
else if( buffer[pointer]=='+'
||buffer[pointer]=='-'
||buffer[pointer]=='*'
||buffer[pointer]=='/'
||buffer[pointer]=='=' ||buffer[pointer]=='<'
||buffer[pointer]=='>'
||buffer[pointer]==':' )//prcessing operators
pointer=operators(pointer);
else
{
cout<<"ERROR!"<<endl;
break;
}
}
} return ;
}
源码运行结果:

将源代码改为使用文件输出后的结果:


tz@COI HZAU
2018/4/17
【编译原理】c++实现词法分析器的更多相关文章
- 编译原理 #01# 简易词法分析器(js实现)
// 实验存档 效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- 编译原理-一种词法分析器LEX原理
1.将所有单词的正规集用正规式描述 2.用正规式到NFA的转换算 得到识别所有单词用NFA 3.用NFA到DFA的转换算法 得到识别所有单词用DFA 4.将DFA的状态转换函数表示成二维数组 并与DF ...
- 编译原理(简单自动词法分析器LEX)
编译原理(简单自动词法分析器LEX)源程序下载地址: http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7 ...
- <编译原理 - 函数绘图语言解释器(1)词法分析器 - python>
<编译原理 - 函数绘图语言解释器(1)词法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 解释器分为三个实现块: 词法分析器: ...
- 编译原理实战——使用Lex/Flex进行编写一个有一定词汇量的词法分析器
编译原理实战--使用Lex/Flex进行编写一个有一定词汇量的词法分析器 by steve yu 2019.9.30 参考文档:1.https://blog.csdn.net/mist14/artic ...
- 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...
- 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...
- javac编译原理(一)
我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的.将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译. 有次面试,面试官问了一道“java的编译原理是什么 ...
随机推荐
- [Android实例] Activity实例StartActivity出现NullPointer异常
[Android实例] Activity实例StartActivity出现NullPointer异常 [android实例教程] 在Android低版本(如2.3.3)中出现如下“界面跳转”的错误: ...
- Spring Boot 2.0 整合 FreeMarker 模板引擎
本篇博文将和大家一起使用Spring Boot 2.0 和FreeMarker 模板引擎整合实战. 1. 创建新的项目 2. 填写项目配置信息 3. 勾选web 模块 4. 勾选freemarker模 ...
- HTTP Status 500 - Unable to create directory
分析原因: 例如:java web项目 上传图片创建文件夹cd /data/apps/static-web/sjk/driver/attachment/编号/文件名称.jpg 在创建文件目录 /dat ...
- 【Tomcat】Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
- 每日英语:Dashing the China Dream
Much has been said about what the 'China Dream' really means to many Chinese -- whether it is nation ...
- Selenium和firefox兼容性问题
Selenium和firefox兼容性问题 2016-07-10 若出现兼容性问题,会报如下错误: org.openqa.selenium.firefox.NotConnectedException: ...
- mxnet:背景介绍
学习的过程 使用mxnet作为教程的深度学习库,重点介绍高层抽象包gluon 双轨学习法,既教授大家从零实现,也教授大家使用gluon实现模型:前者为了理解深度学习的底层设计,后者将大家从繁琐的模型设 ...
- 如何在Excel中提取小数点后面的数字?
Excel中,如果某个单元格中包含一个带小数,要用公式提取该数值小数点后面的数字,例如A1单元格中包含一个数值“59178.68”,在B1单元格中输入下面的公式: =RIGHT(A1,LEN(A1)- ...
- Java如何检查文件是否在服务器上被修改了?
在Java编程中,如何检查文件是否在服务器上被修改了? 以下示例显示如何检查文件是否在服务器上进行了修改. package com.yiibai; import java.net.URL; impor ...
- Error - SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
I find using the following works quite well for SQL min/max dates after many DB related errors: Date ...