資源簡介
編譯原理——詞法分析器設計與實現,而且完整項目,可運行
針對于pascal語言,也可針對于c語言,只需要更改好關鍵字保留字

代碼片段和文件信息
#include
#include
#include
#include
#include
int?i?row?=?0?line?=?0;
char?a[1000];??//程序
int?number[1000][100];??//常數表
char?mark[100][5];???//標識符表
//詞法分析
int?wordanalysis()
{
????if?((a[i]?>=?‘A‘&&a[i]?<=?‘Z‘)||(a[i]>=‘a‘&&a[i]<=‘z‘))??//分析標識符和保留字
????{
????????char?word[10];
????????char?pro[100][100]?=?{?“PROGRAM“?“BEGIN“?“END“?“VAR“?“INTEGER“?“WHILE“?“IF“?“THEN“?“ELSE“?“DO“?“PROCEDURE“?
????????????????????????????????“char““int““if““else““var“?“return““break““do““while““for““double““float““short“};?//保留字表
????????int?n?=?0;
????????word[n++]?=?a[i++];
????????//若字符為A~Z或0~9,則繼續讀取
????????while?((a[i]?>=?‘A‘&&a[i]?<=?‘Z‘)?||?(a[i]?>=?‘0‘?&&?a[i]?<=?‘9‘)||(a[i]>=‘a‘&&a[i]<=‘z‘))
????????{
????????????word[n++]?=?a[i++];
????????}
????????word[n]?=?‘\0‘;
????????i--;
????????//判斷該標識符是否為保留字
????????for?(n?=?0;?n?100;?n++)
????????{
????????????if?(strcmp(word?pro[n])?==?0)
????????????{
????????????????printf(“%s\t(%d-)?保留字\n“?pro[n]?n?+?1);
????????????????return?3;
????????????}
????????}
????????//判斷標識符長度是否超出規定
????????if?(strlen(word)>10)
????????{
????????????printf(“%s\t?Lexical?analyzer?read?Unlawful?identifier“word);
????????????return?0;
????????}
????????//判斷該標識符是否存在標識符表中
????????int?m?=?0;
????????if?(line?!=?0)
????????{
????????????int?q?=?0;
????????????while?(q ????????????{
????????????????if?(strcmp(word?mark[q++])?==?0)
????????????????{
????????????????????printf(“%s\t(12%d)?標識符\n“?word?q);
????????????????????return?3;
????????????????}
????????????}
????????}
????????//將該標識符保存到標識符表中
????????strcpy(mark[line]?word);
????????printf(“%s\t(12?%d)?標識符\n“?word?line?+?1);
????????line++;
????????return?3;
????}
????else?if?(a[i]?>=?‘0‘?&&?a[i]?<=?‘9‘)??//分析常數
????{
????????char?x[100];
????????int?n?=?0?sum;
????????x[n++]?=?a[i++];
?????//判斷字符是否是0~9
????????while?(a[i]?>=?‘0‘?&&?a[i]?<=?‘9‘)
????????{
????????????x[n++]?=?a[i++];
????????}
????????x[n]?=?‘\0‘;
????????i--;
????????int?num?=?atoi(x);?//將字符串轉換成int型
????????//判斷該常數是否存在于常數表中
????????if?(row?!=?0)
????????{???
????????????int?y;?
????????????for?(y?=?0;?y?1000;?y++)
????????????{
????????????????int?w?=?number[y][0];
????????????????sum?=?0;
????????????????int?d;
????????????????for?(d?=?1;?d?<=?number[y][0];?d++)
????????????????{
????????????????????w?=?w?-?1;
????????????????????sum?=?sum?+?number[y][d]?*?pow(2?w);
????????????????}
????????????????if?(num?==?sum)
????????????????{
????????????????????printf(“%d\t(13%d)\n“?num?y?+?1);
????????????????????return?3;
????????????????}
????????????}
????????}
????????int?z?=?num?c?=?num;
????????int?m?=?0;
????????do????????//計算是幾位二進制數
????????{
????????????z?=?z?/?2;
????????????m++;
????????}?while?(z?!=?0);
????????for?(n?=?m;?n?>?0;?n--)??//將二進制保存于常數表中
????????{
????????????number[row][n]?=?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????6855??2018-04-30?11:44??主程序(改為cpp).cpp
?????文件??????????46??2018-04-30?11:45??使用說明.txt
評論
共有 條評論