写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.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++实现词法分析器的更多相关文章

  1. 编译原理 #01# 简易词法分析器(js实现)

    // 实验存档 效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  2. 编译原理-一种词法分析器LEX原理

    1.将所有单词的正规集用正规式描述 2.用正规式到NFA的转换算 得到识别所有单词用NFA 3.用NFA到DFA的转换算法 得到识别所有单词用DFA 4.将DFA的状态转换函数表示成二维数组 并与DF ...

  3. 编译原理(简单自动词法分析器LEX)

    编译原理(简单自动词法分析器LEX)源程序下载地址:  http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7 ...

  4. <编译原理 - 函数绘图语言解释器(1)词法分析器 - python>

    <编译原理 - 函数绘图语言解释器(1)词法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 解释器分为三个实现块: 词法分析器: ...

  5. 编译原理实战——使用Lex/Flex进行编写一个有一定词汇量的词法分析器

    编译原理实战--使用Lex/Flex进行编写一个有一定词汇量的词法分析器 by steve yu 2019.9.30 参考文档:1.https://blog.csdn.net/mist14/artic ...

  6. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

  7. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...

  8. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  9. 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集

    近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...

  10. javac编译原理(一)

    我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的.将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译. 有次面试,面试官问了一道“java的编译原理是什么 ...

随机推荐

  1. linux每日命令(30):Linux 用户及用户组相关文件、命令详解

    一. 用户.用户组概念及其文件结构详解 Linux用户只有两个等级:root及非root.Linux中还有一部分用户,如:apache.mysql.nobody.ftp等,这些也都是非root用户,即 ...

  2. linux每日命令(32):gzip命令

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以用 ...

  3. Retrieve id of record just inserted into a Java DB (Derby) database

    https://stackoverflow.com/questions/4894754/retrieve-id-of-record-just-inserted-into-a-java-db-derby ...

  4. Linux磁盘概念及其管理工具fdisk

    Linux磁盘概念及其管理工具fdisk [日期:2016-08-27] 来源:Linux社区  作者:chawan [字体:大 中 小]   引言:冯诺依曼体系中的数据存储器就是我们常说的磁盘或硬盘 ...

  5. 很好的git教程

    http://www.liaoxuefeng.com/这里的git教程很好,我是从这入的门.

  6. SpringMVC Jsp include 错误404 不显示页面

    一.问题描述: 1. 新建了taglibs.jsp存放jstl标签库和 jsp建站基本变量ctx 和basPath 如下  (位置WEB-INF\common) <%@ page import= ...

  7. 同样的so,放到不同的project中,就会报错

    网上看到的帖子,笔记一下 最近在看蓝斯的一篇文章基于Platinum库的DMS实现(android) 把其中的so文件直接拷贝到了另外一个project中,jin文件也一样,唯一不同的是包名. 运行报 ...

  8. Service 中的 onStart 和 onStartCommand

    在自定义的service中,写了onStart和onStartCommand, public class HttpWebService extends Service { @Override publ ...

  9. MTK 自定义系统服务

    添加系统服务需要添加aidl,service,manager文件,需要修改SystemServer,Context,ContextImpl 下面举例进行说明,主要添加一个服务,用于获取系统时间和版本号 ...

  10. 【CF679D】Bear and Chase 最短路+乱搞

    [CF679D]Bear and Chase 题意:近日,鼠国的头号通缉犯,神出鬼没的怪盗——Joker正于摩登市出没!对于名侦探Jack来说,这正是将其捉拿归案的大号时机.形式化地,摩登市可以看成一 ...