【转载】简单词法分析器的实现
来源:互联网 发布:广联达钢筋抽样软件 编辑:程序博客网 时间:2024/05/17 02:38
本文转载自http://www.cnblogs.com/yanlingyin/
最近做课程设计,实现一个简单的词法分析器,先找了一个比较好用的研究一下。
代码在visual studio 2015调试通过。详细说明请看原博主博客。
// lexicalAnalysis.cpp : 定义控制台应用程序的入口点。//#include<stdafx.h>#include<string.h>#include<stdlib.h>#include<iostream>using namespace std;char prog[80], token[8];char ch;int syn, p, m = 0, n, row, sum = 0;char *rwtab[6] = { "begin","if","then","while","do","end" };void scaner(){/*共分为三大块,分别是标示符、数字、符号,对应下面的 if else if 和 else*/for (n = 0; n<8; n++) token[n] = NULL;ch = prog[p++];while (ch == ' '){ch = prog[p];p++;}if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z')) //可能是标示符或者变量名 {m = 0;while ((ch >= '0'&&ch <= '9') || (ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z')){token[m++] = ch;ch = prog[p++];}token[m++] = '\0';p--;syn = 10;for (n = 0; n<6; n++) //将识别出来的字符和已定义的标示符作比较, if (strcmp(token, rwtab[n]) == 0){syn = n + 1;break;}}else if ((ch >= '0'&&ch <= '9')) //数字 {{sum = 0;while ((ch >= '0'&&ch <= '9')){sum = sum * 10 + ch - '0';ch = prog[p++];}}p--;syn = 11;if (sum>32767)syn = -1;}else switch (ch) //其他字符 {case'<':m = 0; token[m++] = ch;ch = prog[p++];if (ch == '>'){syn = 21;token[m++] = ch;}else if (ch == '='){syn = 22;token[m++] = ch;}else{syn = 23;p--;}break;case'>':m = 0; token[m++] = ch;ch = prog[p++];if (ch == '='){syn = 24;token[m++] = ch;}else{syn = 20;p--;}break;case':':m = 0; token[m++] = ch;ch = prog[p++];if (ch == '='){syn = 18;token[m++] = ch;}else{syn = 17;p--;}break;case'*':syn = 13; token[0] = ch; break;case'/':syn = 14; token[0] = ch; break;case'+':syn = 15; token[0] = ch; break;case'-':syn = 16; token[0] = ch; break;case'=':syn = 25; token[0] = ch; break;case';':syn = 26; token[0] = ch; break;case'(':syn = 27; token[0] = ch; break;case')':syn = 28; token[0] = ch; break;case'#':syn = 0; token[0] = ch; break;case'\n':syn = -2; break;default: syn = -1; break;}}int main(){p = 0;row = 1;cout << "Please input string:" << endl;do{cin.get(ch);prog[p++] = ch;} while (ch != '#');p = 0;do{scaner();switch (syn){case 11: cout << "(" << syn << "," << sum << ")" << endl; break;case -1: cout << "Error in row " << row << "!" << endl; break;case -2: row = row++; break;default: cout << "(" << syn << "," << token << ")" << endl; break;}} while (syn != 0);system("PAUSE");}
阅读全文
0 0
- 【转载】简单词法分析器的实现
- 简单词法分析器的实现
- 简单词法分析器实现
- 简单词法分析器实现
- 词法分析器简单实现
- 简单的词法分析器的实现
- 一个简单词法分析器的实现代码
- c++ 简单词法分析器的实现
- java实现的简单词法分析器
- java实现简单的词法分析器
- c语言词法分析器的简单实现
- 简单的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 词法分析器的实现
- NSTimer使用注意事项
- js一次性输入一个数组求平均值
- 第四届“图灵杯”NEUQ-ACM程序设计竞赛(团队赛)-网络同步赛F(矩阵快速幂)
- python学习日记(6)
- 国际国家代码与区号查询
- 【转载】简单词法分析器的实现
- 多线程死锁的一个简单例子
- Docker初识
- 4.3 脉冲响应不变法
- Mac环境中Jenkins自动打包上传fir的配置流程(从零开始)一
- js拿到标签所有样式 js事件监听兼容ie
- Android 消息处理机制——线程通信
- unordered_map 使用小结#简单用法#
- 机房收费系统之八(组合查询)