&词法分析器、语法分析器(LL(1)分析法和递归下降子程序法)C\C++实现(编译课实验作业,原理和方法就不再赘述了,不太清楚的伙伴可以看看书上的讲解以及大佬的总结,直接上代码吧,如果有不妥之处,还请指正)
词法分析器
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
string keyword[19]={"if","else","while","do","for","switch","case","float","double","long","char","string","int","void","main","include","defined","cstdio","return"};//关键字表
int keyNum[19]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};//关键字序号
string symbol[21]={"<",">","!=",">=","<=","==",",",";","(",")","{","}","[","]","!","+","-","*","/","=","#"};//运算符和界符表
int symbolNum[21]={20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40};//运算符和界符序号
string letter[500];
string words[500];
int size; //保存程序中字符的数目
int num;
//判断是否为关键字,是则返回对应的序号
int isKeyWord(string s){
for(int i=0;i<=18;i++){
if(s==keyword[i])
return keyNum[i];
}
return 0;
}
//判断是否运算符和界符,是则返回对应序号
int isSymbol(string s){
for(int i=0;i<=20;i++){
if(s==symbol[i])
return symbolNum[i];
}
return 0;
}
//判断是否为数字
bool isNum(string s){
if(s>="0" && s<="9")
return true;
else
return false;
}
//判断是否为字母
bool isLetter(string s)
{
if((s>="a" && s<="z")||(s>="A" && s<="Z"))
return true;
else
return false;
}
//对字符类型进行分类,方便后续处理
int wordType(string str){
if((str>="a" && str<="z")||(str>="A" && str<="Z"))
return 1;
if(str>="0" && str<="9")
return 2;
if(str==">"||str=="="||str=="<"||str=="!"||str==","||str==";"||str=="("||str==")"||str=="{"||str=="}"
||str=="+"||str=="-"||str=="*"||str=="/"||str=="["||str=="]"||str=="#") //判断运算符和界符
return 3;
}
string identify(string s,int n){
int j=n+1;
int flag=1;
while(flag){
if(isNum(letter[j]) || isLetter(letter