编译原理之扫描器
来源:互联网 发布:山东网络教育大学 编辑:程序博客网 时间:2024/04/30 18:50
Preset.h
#ifndef PRESET_H_INCLUDED#define PRESET_H_INCLUDED#define AnsNum 100010#define AnsLen 110#define TableNum 110#define DeliNum 12#define KeyNum 7/*int main(){ int a=0; int b=123; int c=a<b?41:2; cout << c << endl; return 0;}*/int consttop=0;int identtop=0;const int DelimeterNum=11;const int Keynum=7;char Delimeters[TableNum][TableNum]={"(",")","<<","{","}",";","=","+","-","*","/"}; //3-13 i+3char Key[TableNum][TableNum]={"int","main","cout","endl","return","char","cin"}; //14-20 i+14char Constant[TableNum][TableNum];char Identifier[TableNum][TableNum];#endif // PRESET_H_INCLUDED
main.cpp
#include <iostream>#include <cstring>#include <windows.h>#include "Preset.h"using namespace std;typedef struct token{ char target[AnsLen]; int num; //Token类别 Identifier——1 Constant——2 Key——3 Delimeters——4}Token;Token AnsToken[AnsNum];int main(){ string Str; int top=0; char temp[100]; while(cin >> Str) //输入源代码 { int Ttop=0; for(int i=0;Str[i]!=0;) { //判断标识符 if(Str[i]=='_' || isalpha(Str[i])) { for(;Str[i]!=0 && Str[i]!=' ';i++) //结束标志-1即为0或者' ' { if(Str[i]=='_' || isalpha(Str[i]) || isdigit(Str[i])) { temp[Ttop++]=Str[i]; } else { break; } } temp[Ttop]=0; strcpy(AnsToken[top].target,temp); AnsToken[top].num=1; Ttop=0; //判断是不是关键字 int flag=1; for(int j=0;j<KeyNum;j++) { if(strcmp(temp,Key[j])==0) { AnsToken[top].num=j+14; flag=0; break; } } top++; if(flag) { strcpy(Identifier[identtop++],temp); } } else if(isdigit(Str[i])) //只能识别常数 { for(;Str[i]!=0 && Str[i]!=' ';i++) //结束标志-1即为0或者' ' { if(isdigit(Str[i])) { temp[Ttop++]=Str[i]; } else { break; } } temp[Ttop]=0; strcpy(AnsToken[top].target,temp); AnsToken[top++].num=2; strcpy(Constant[consttop++],temp); } else if(Str[i]==' ') { i++; } else { //无法识别三目运算符 for(;Str[i]!=0 && Str[i]!=' ' && !isalpha(Str[i]) && !isdigit(Str[i]) && Str[i]!='_';i++) //结束标志-1即为0或者' ' { temp[Ttop++]=Str[i]; } temp[Ttop]=0; for(int j=0;j<DelimeterNum;j++) { if(strcmp(temp,Delimeters[j])==0) { strcpy(AnsToken[top].target,temp); AnsToken[top++].num=j+3; break; } } Ttop=0; } } } for(int i=0;i<top;i++) cout << "< " << AnsToken[i].target << " , " << AnsToken[i].num << " >" << endl; return 0;}
0 0
- 编译原理之扫描器
- 编译原理之扫描器(二)
- 编译原理之基于扫描器的表达式语法分析+逆波兰表达式生成
- 编译原理之概述
- 编译原理之语法分析
- 编译原理之文法
- 编译原理之序言
- 编译原理之引论
- 编译原理之文法
- 扫描器之王-----nmap教程
- C#之电脑端口扫描器...
- 扫描器之王-----nmap教程
- JAVA入门之Scanner扫描器
- Python之端口扫描器编写
- 漏洞扫描器的扫描原理 ZZ
- linux多线程端口扫描器原理与实现
- 条形码扫描器识别条形码的原理
- 【编译原理之】Bison 源文件结构原理
- DBCP数据源
- 设置Maven默认的JDK为1.7,解决Update Maven Project默认为1.5和Maven打包报错2个问题
- 写反转二叉树中遇到的一个小Bug
- 面向对象new
- linux下搭建pentaho服务器
- 编译原理之扫描器
- iOS_XCode升级插件失效解决方法
- 创建自己的yum 仓库
- android去广告
- Redhat关闭SELinux和防火墙的办法
- 《UNIX网络编程》读书笔记1---简介和TCP/IP
- 在线程函数中使用主窗口的成员变量
- 600,000,002,200,300,400等开头的股票都是什么意思
- 黑马程序员_java多线程