【转载】简单词法分析器的实现

来源:互联网 发布:广联达钢筋抽样软件 编辑:程序博客网 时间: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");}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四岁宝宝咳嗽半个月了怎么办 三岁宝宝咳嗽半个月了还不好怎么办 孩子在幼儿园不听话天天罚站怎么办 孩子个性太强脾气太倔不听话怎么办 孩子有十七了太不听话了怎么办 小孩的学籍填错了怎么办还能改吗 生完孩子后脾气暴躁易怒怎么办 生完孩子之后变懒了怎么办呀? 孩子三年级了成绩不突出家长怎么办 自私势力的父母想把我害死怎么办 父母如果养出自私的孩子怎么办 大人得了地图舌怎么办要怎么治疗 请问我家小孩有心理儿问题怎么办 想离婚妻子拿孩子命威胁怎么办 爸妈50多岁了吵架很严重怎么办 我和别人没离婚的老婆在一起怎么办 老婆起诉我离婚我不想理怎么办 上大学的孩子对考试无所谓怎么办 家里的人对我已经没有信心了怎么办 我是做股票配资的找不到客户怎么办 心理健康类的课程总是选不了怎么办 孩子该上初三了英语基础差怎么办 初二学生辍学半年又想上学怎么办 保险用的小红本丢了怎么办 孩子的小红本丢了怎么办 宝宝打针的小红本丢了怎么办 居民养老保险小红本丢了怎么办 小学六年级素质报告单丢了怎么办 西安小学素质报告册有b怎么办 辽宁省干部在线学习时长不够怎么办 鬼火一代发动机在中间卡死怎么办 医疗权与患者隐私权想冲突怎么办 登录法宣在线出现贴号失效怎么办 黔微普法在线竞答成绩不合格怎么办 怎么办刮过胡子后又长了? 网贷暴力催收警察也没办法怎么办 儿子把我车抵押给了高利贷怎么办 水泵开机五分钟左右就跳闸怎么办 离婚了她说过的不好你该怎么办 偏侧咀嚼笑时一边嘴歪怎么办 三相四线开关前地线有电怎么办