/*前段时间在编译原理实验上写了一个PL0语言单词的词法分析程序,把源代码付上,供初学者参考。也欢迎大侠们提出宝贵的意见*/
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//设置单字符符号
char symbol[] = {'+','-','*','/','(',')','=',',','.','#',';'};
//设置单字符名称
string ssym[] = {"plus","minus","times","slash","lparen","rparen","eql","comma","peroid","neg","semicolon"};
//设置保留字
string word[] = {"begin","call","const","do","end","if","odd","procedure","read","then","var","while","write"};
//设置保留字符号
string wsym[] = {"beginsym","callsym","constsym","dosym","endsym","ifsym","oddsym","procsym","readsym","thensym","varsym","whilesym","writesym"};
ifstream fin("in.txt");
ofstream fout("result.txt");
void judgeWord(string str);//搜索当前符号是否为保留字
int judgeSymbol(char ch);//搜索当前符号是否为单字符符号
void getsym();//词法分析,获取一个符号
int main(){
getsym();//词法分析,获取一个符号
return 0;
}
void getsym(){
char ch;
ch = fin.get();
while(ch != '#'){
if(ch>='a' && ch<='z'){//名字或保留字以a..z开头
string strTemp = "";
do{
strTemp = strTemp + ch;
ch = fin.get();
} while(ch>='a' && ch<='z' || ch>='0' && ch<='9');
judgeWord(strTemp);//搜索当前符号是否为保留字
}
else{
if(ch>='0' && ch<='9'){//检测是否为数字:以0..9开头
double num = 0.0;
do{
num = 10 * num + ch - '0';//将形如:"12345"的字符串装换车long类型的12345
ch=fin.get();
&n