词法分析器 (c++实现) 简单实现
勿抄,请不要限制你的想象力。
改进之处:遇到不能识别的应该继续往后识别,功能未完善。
思路:看代码就懂了;
Talk is cheap. Show me the code.
#include <bits/stdc++.h>//万用头文件
using namespace std;
//——————————全局变量——————————
struct Keyword
{
string token;
int syn;
}Key[13];
int syn,tag=1;//种别码,标记
string token;
int i = 0;//全局变量作为下标
//————————————————————————————
bool judletter(char ch)//判断字符
{
if (ch>='A'&& ch<='Z'|| ch >= 'a'&& ch <= 'z')
return 1;
else
return 0;
}
bool judnum(char num)//判断数字
{
if (num>='0'&&num<='9')
return 1;
else
return 0;
}
int scan(string input)//对单个字符块进行扫描
{
if (input[i]==' ')//空格
{
syn = -2;
i++;
return syn;
}
token = "";//NULL默认为0,不为空
if (judnum(input[i]))//数字开头
{
int sum = 0;
while (judnum(input[i]))
{
sum = 10 * sum + (input[i] - '0');
i++;
syn = 20;
}
token += to_string(sum);
return syn;
}
if (judletter(input[i]))//字母开头可能为1、标识符 2、关键字
{
while (judletter(input[i])||judnum( input[i]))
{
token += input[i];
i++;
}
syn = 10;//标识符(e.g.变量、常量)
for (int j = 1; j <= 12; j++)//
{
if (token == Key[j].token)
{
syn = Key[j].syn;
return syn;
}
}
return syn;
}
else //符号
{
token = "";
switch (input[i]) {
case