首页 > 代码库 > 词法分析器
词法分析器
1 // lex_analyzer.cpp : 定义控制台应用程序的入口点。 2 //词法分析器 3 /* 4 sys: 5 1-10:关键字 6 10:标识符 7 11:数字 8 //比较区 9 20:< 10 21:<= 11 22:> 12 23:>= 13 24:= 14 25:== 15 //运算区 16 26:* 17 27:/ 18 28:+ 19 29:- 20 //分隔符号区 21 30:; 22 31:( 23 32:) 24 33:{ 25 34:} 26 35:\n 27 -1 28 1000:# 29 */ 30 #include "stdafx.h" 31 #include <iostream> 32 #include <sstream> 33 #include <string> 34 using namespace std; 35 string ss; 36 int scanner(); 37 const string key[] = {"int","main","return","if","for"};//定义关键字 38 stringstream prog; 39 int _tmain(int argc, _TCHAR* argv[]) 40 { 41 char ch = NULL; 42 stringstream s; 43 int row=0;//行号 44 int id_code;//识别码 45 cout << "please input some C/C++ code" << endl; 46 while (ch != ‘#‘) 47 { 48 cin.get(ch); 49 s << ch; 50 } 51 ss = s.str(); 52 do{ 53 id_code= scanner(); 54 switch (id_code) 55 { 56 case -1: cout << "Error in row " << row << "!" << endl; break; 57 case 35: row = row++; break; 58 case 1000:break; 59 default: cout << "(" << id_code << "," << prog.str() << ")" << endl; break; 60 break; 61 } 62 } while (id_code !=1000); 63 return 0; 64 } 65 int scanner() 66 { 67 static int point=0; 68 prog.str("");//清空 69 char cha = NULL; 70 int syn; 71 //过滤掉空格 72 do 73 { 74 cha = ss[point++]; 75 } while (cha == ‘ ‘); 76 //识别标识符或关键字,标识符以_或字母开头 77 if (cha >= ‘a‘&&cha <= ‘z‘ || cha >= ‘A‘&&cha <= ‘Z‘ || cha == ‘_‘) 78 { 79 while (cha >= ‘a‘&&cha <= ‘z‘ || cha >= ‘A‘&&cha <= ‘Z‘ || cha == ‘_‘ || cha >= ‘0‘&&cha <= ‘9‘) 80 { 81 prog << cha; 82 cha = ss[point++]; 83 } 84 --point; 85 syn = 10; 86 //识别关键字 87 for (int i = 0; i < sizeof(key) / sizeof(key[0]); i++) 88 { 89 if (prog.str() == key[i]) 90 syn = i; 91 } 92 } 93 //识别数字 94 else if (cha >= ‘0‘&&cha <= ‘9‘) 95 { 96 while (cha >= ‘0‘&&cha <= ‘9‘) 97 { 98 prog << cha; 99 cha = ss[point++];100 }101 --point;102 syn = 11;103 }104 else switch (cha)105 {106 case ‘<‘:107 prog << cha;108 cha = ss[point++];109 if (cha == ‘=‘)110 {111 syn = 21;112 prog << cha;113 }else {114 syn = 20;115 --point;116 }117 break;118 case ‘>‘:119 prog << cha;120 cha = ss[point++];121 if (cha == ‘=‘)122 {123 syn = 23;124 prog << cha;125 }126 else {127 syn = 22;128 --point;129 }130 break;131 case ‘=‘:132 prog << cha;133 cha = ss[point++];134 if (cha == ‘=‘)135 {136 syn = 25;137 prog << cha;138 }139 else {140 syn = 24;141 --point;142 }143 break;144 case‘*‘:syn = 26; prog << cha; break;145 case‘/‘:syn = 27; prog << cha; break;146 case‘+‘:syn = 28; prog << cha; break;147 case‘-‘:syn = 29; prog << cha; break;148 case‘;‘:syn = 30; prog << cha; break;149 case‘(‘:syn = 31; prog << cha; break;150 case‘)‘:syn = 32; prog << cha; break;151 case‘{‘:syn = 33; prog << cha; break;152 case‘}‘:syn = 34; prog << cha; break;153 case‘\n‘:syn = 35; break;154 case ‘#‘:syn = 1000; prog << cha; break;155 default: syn = -1; break;156 }157 return syn;158 }
词法分析器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。