PL/0 词法分析器
生活随笔
收集整理的這篇文章主要介紹了
PL/0 词法分析器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PL/0 詞法分析器
#include<stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h> typedef enum SymEnum
{
Identifier=, //標識符
Const=, //常數
Key=, //關鍵字
Operator=, //運算符
Delimiter= //界符
} SymEnum; char KeyWord[][]; //關鍵字 void Init()
{
strcpy(&KeyWord[][],"begin");
strcpy(&KeyWord[][],"call");
strcpy(&KeyWord[][],"const");
strcpy(&KeyWord[][],"do");
strcpy(&KeyWord[][],"end");
strcpy(&KeyWord[][],"if");
strcpy(&KeyWord[][],"odd");
strcpy(&KeyWord[][],"procedure");
strcpy(&KeyWord[][],"read");
strcpy(&KeyWord[][],"then");
strcpy(&KeyWord[][],"var");
strcpy(&KeyWord[][],"while");
strcpy(&KeyWord[][],"write");
} //判斷一個單詞是否為關鍵字
int IsKeyWord(char *word)
{
int i=,j=;
while(i<=j)
{
int k=(i+j)/;
if(strcmp(word,KeyWord[k])<=)
j=k-;
if(strcmp(word,KeyWord[k])>=)
i=k+;
}
return i->j ? : ;
} //判斷一個單詞是否為界符
int IsDelimiter(char word)
{
if(word==','||word==';'||word=='.'||word=='('||word==')')
return ;
return ;
} //判斷一個單詞是否為操作符
int IsOperator(char *word)
{
if(word[]=='+'||word[]=='-'||word[]=='*'||word[]=='/'||word[]=='<'||word[]=='>'||strcmp(word,":=")==||strcmp(word,">=")==||strcmp(word,"<=")==||word[]=='#'||word[]=='=')
return ;
return ;
} //判斷一個單詞是否是常數
int IsConst(char *word)
{
if(word[]>=''&&word[]<='')
return ;
return ;
} //判斷連個字符是否屬于相同類型
int IsSame(char f,char s)
{
int bf = (f>=''&&f<=''||f>='a'&&f<='z'||f>='A'&&f<='Z')? : ;
int bs = (s>=''&&s<=''||s>='a'&&s<='z'||s>='A'&&s<='Z')? : ;
return bf == bs;
} //判斷 word 的類型
SymEnum TypeOfWord(char *word)
{
if(IsKeyWord(word))
return Key;
if(IsConst(word))
return Const;
if(IsOperator(word))
return Operator;
return Identifier;
} int GetSym()
{
FILE *fp,*fout;
if((fp=fopen("PL0.txt","r"))==NULL || (fout=fopen("source.txt","w+"))==NULL)
{
printf("Open Error!\n");
exit();
}
SymEnum SYM; //存放每個單詞的類別,用內部編碼形式表示;
char word[]; //存儲單詞
word[]='\0';
int len=; //單詞長度
char ch;
while(fscanf(fp,"%c",&ch)!=EOF)
{
// ch 為空格,回車符,制表符
if(ch==' '||ch=='\n'||ch=='\t')
{
// word 不為空
if(len)
{
//判斷單詞類型
SYM=TypeOfWord(word);
fprintf(fout,"%d %s\n",SYM,word);
//清空緩存區
len=;
word[len]='\0';
}
// word 為空,忽略 ch
}
else if(IsDelimiter(ch))
{
//word 不為空
if(len)
{
//判斷單詞的類型
SYM=TypeOfWord(word);
fprintf(fout,"%d %s\n",SYM,word);
// ch == delimiter
SYM=Delimiter;
fprintf(fout,"%d %c\n",SYM,ch);
//清空緩存區
len=;
word[len]='\0';
}
else
{
//word 為空, ch 為界符
SYM=Delimiter;
fprintf(fout,"%d %c\n",SYM,ch);
//清空緩存區
len=;
word[len]='\0';
}
}
else
{
if(len>)
{
if(IsSame(word[len-],ch))
{
//判斷 word 與 ch 是否同類型
word[len++]=ch;
word[len]='\0'; //字符串終結符
}
else
{
//判斷單詞類型
SYM=TypeOfWord(word);
fprintf(fout,"%d %s\n",SYM,word);
//清空緩存區,并把 ch 放入緩存區
len=;
word[len++]=ch;
word[len]='\0'; //字符串終結符
}
}
else
{
word[len++]=ch;
word[len]='\0';
}
}
}
fclose(fp);
fclose(fout);
return ;
} void PrintToScream()
{
FILE *fp;
if((fp=fopen("source.txt","r+"))==NULL)
{
printf("Open File Error!\n");
exit();
}
int id;
char word[];
printf("0-標識符 1-常數 2-關鍵字 3-操作符 4-界符\n");
while(fscanf(fp,"%d %s",&id,word)!=EOF)
{
printf("(%d,%s)\n",id,word);
}
fclose(fp);
} int main()
{
Init();
GetSym();
PrintToScream();
return ;
}
總結
以上是生活随笔為你收集整理的PL/0 词法分析器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 八、MD5加密并封装,并调用封装方法
- 下一篇: CSS注