⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qq.txt

📁 本人编写的再加上收集的几个编译原理的词法分析程序
💻 TXT
字号:
1.1.1实验目的 
设计,编制并调试一个词法分析程序。 
1.2实验要求 
1. 关键字:begin ;if;then;while;do;end 并为小写。 
2. 符号:”+”;”-“;”*”;”/”;”:=”;”:”;”<”;”<=”;”>”;”>=”;”<>”;”=”;”(”;”)”;”;”;”#”。 
3. 其他标记 如字符串,以字母开头的标识符。 
4. 空格符跳过。 
1.3各符号对应种别码 
单词符号 种别码 单词符号 种别码 单词符号 种别码 单词符号 种别码 
begin 1 标识符 10 + 13 < 20 
if 2 数字 11 - 14 <= 21 
then 3 ( 27 * 15 > 23 
while 4 ) 28 / 16 >= 24 
do 5 ; 26 := 17 <> 22 
end 6 # 0 : 18 = 25 
1.4词法分析程序的功能 
输入:所给文法的原程序字符串。 
输出:二元数组。 
如: 
if (a<=0) 
then b:=1; 

着输出: 
(2, if) 
(27, ( ) 
(10, a ) 
(21, <=) 
(28, ) ) 
(3, then ) 
(10, b) 
(17, :=) 
(11, 1) 
2.下面为原程序: 
#include<stdio.h> 
#include<string.h> 
char prog[80],token[8]; char ch; 
int syn,p,m,n; char *numtab[6]={"begin","if","then","while","do","end"}; 
int scaner(char prog[]){int m,i,n; for(m=0;m<20;m++) token[m++]=NULL; /*清空token*/ 
m=0; ch=prog[p++];/*读入字符*/ 
while(ch==' ') ch=prog[p++]; /*空格处理*/ 
if((ch>='a')&&(ch<='z'))/*字符串处理*/ 
{while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9'))) {token[m++]=ch;ch=prog[p++];} token[m++]='\0'; n=0; for(i=0;i<6;i++) 
if(strcmp(token,numtab[i])==0)/*判断是不是保留字*/ 
switch(i){ case 0: syn=1;n++;break; 
case 1: syn=2;n++;break; 
case 2: syn=3;n++;break; 
case 3: syn=4;n++;break; 
case 4: syn=5;n++;break; 
case 5: syn=6;n++;break;} 
if(n==0) syn=10;p--;}/*非保留字*/ 
else if(ch>='0'&&ch<='9')/*判断是否为数字*/ 
{n=0;while(ch>='0'&&ch<='9') {n=n*10+(ch-'0');ch=prog[p++];}syn=11; p--;}else switch(ch) 
{case'<': token[m++]=ch;ch=prog[p++];/*判断小于号*/ 
if(ch=='>')/*是否为不等于*/ 
{token[++m]=ch;syn=22;} else if(ch=='=')/*是否为小于等于*/ 
{token[++m]=ch;syn=21;} else{p--;syn=20;} break; 
case'>': token[m]=ch;/*是否为大于*/ 
ch=prog[p++]; f(ch=='='){token[++m]=ch;syn=24;}/*是否为大于等于*/ 
else{p--;syn=23;} break; 
case'+': token[m]=ch;syn=13;break;/*判断加号*/ 
case'-': token[m]=ch;syn=14;break;/*判断-号*/ 
case'*': token[m]=ch;syn=15;break;/*判断”*”号*/ 
case'/': token[m]=ch;syn=16;break;/*判断\号*/ 
case':': token[m++]=ch;ch=prog[p++];/*判断:号*/ 
if(ch=='='){token[++m]=ch;syn=17;} else{p--;syn=18;}break; 
case'=': token[m]=ch;syn=25;break;/*判断=号*/ 
case';': token[m]=ch;syn=26;break;/*判断;号*/ 
case'(': token[m]=ch;syn=27;break;/*判断(号*/ 
case')': token[m]=ch;syn=28;break;/*判断)号*/ 
case'#': syn=0;token[0]='#';break;/*判断#号*/ 
default: syn=-1;}/*错误说明*/ 
return syn; return n;} 
void main() 
{p=0; printf("\n输入程序,以#结束,可以有begin,if,then,while,do,end,:,;,+,-,*,/,<,>,=,<>,(,):\n"); 
do{ch=getchar();prog[p++]=ch;}while(ch!='#'); p=0; 
do{syn=scaner(prog);switch(syn) 
case 11: printf ("\n(%2d,%8d)",syn,n);;break;/*输出数字*/ 
case-1: printf("\n(%2d, error)",syn);break;/*错误提示*/ 
default: printf("\n(%2d,%8s)",syn,token); }/*字符输出*/ 
}while(syn!=0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -