0921词法分析

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WOED_END "waiting for your expanding" //关键字结束标志

typedef struct
{
int typenum;
char * word;
}WORD;

char input[255]; //输入换缓冲区

char token[255]=""; //单词缓冲区

int p_input; //输入换缓冲区指针

int p_token; //单词缓冲区指针

char ch; //当前所读的字符

char *rwtab[]={"begin","if","then","while","do","end",_KEY_WOED_END}; //C语言关键字

WORD * scaner(); //词法扫描函数,获得关键字

main()
{
int over=1;
WORD *oneword;
oneword=(WORD *)malloc(sizeof(WORD));
printf("请输入您的字符串(以#作为结束标志):");
scanf("%[^#]s",input); 
p_input=0;
printf("您输入的字符串是:%s\n\n",input);
while(over<1000&&over!=-1)
{
oneword=scaner();
printf("(%d,%s)\n",oneword->typenum,oneword->word);
over=oneword->typenum;
}

}

//需要用到的自编函数参考实现
//从输入缓冲区读取一个字符到ch中

char m_getch(){
ch=input[p_input];
p_input=p_input+1;
return (ch);
}

//去掉空白字符
void getbc()
{
while(ch==‘ ‘||ch==10){
ch=input[p_input];
p_input=p_input+1;
}
}

//拼接单词
void concat()
{
token[p_token]=ch;
p_token=p_token+1;
token[p_token]=‘\0‘;
}

//判断是否字母
int letter()
{
if(ch>=‘a‘&&ch<=‘z‘||ch>=‘A‘&&ch<=‘Z‘)return 1;
else return 0;
}

//判断是否数字
int digit()
{
if(ch>=‘0‘&&ch<=‘9‘)
return 1;
else
return 0;
}

//检索关键字表格
int reserve()
{
int i=0;
for(i=0;i<7;i++)
{
if(!strcmp(rwtab[i],token))
{
return i+1;
}
i=i+1;
}
return 10;
}

//回退一个字符
void retract()
{
p_input=p_input-1;
}

WORD *scaner()
{
WORD *myword;
myword=(WORD *)malloc(sizeof(WORD));
myword->typenum=10;
myword->word="";
p_token=0;
m_getch();
getbc();
if(letter())
{
while(letter()||digit())
{
concat();
m_getch();

}
retract();
myword->typenum=reserve();
myword->word=token;
return(myword);
}
else if(digit())
{
while(digit())
{
concat();
m_getch();
}
retract();
myword->typenum=20;
myword->word=token;
return(myword);
}
else
{
switch(ch)
{
case ‘=‘:m_getch();
if(ch==‘=‘)
{
myword->typenum=39;
myword->word="==";
return(myword);
}
retract();
myword->typenum=21;
myword->word="=";
return(myword);
break;
case ‘+‘:
myword->typenum=22;
myword->word="+";
return(myword);
break;
case ‘-‘:
myword->typenum=23;
myword->word="-";
return(myword);
break;
case ‘*‘:
myword->typenum=24;
myword->word="*";
return(myword);
break;
case ‘/‘:
myword->typenum=25;
myword->word="/";
return(myword);
break;
case ‘(‘:
myword->typenum=26;
myword->word="(";
return(myword);
break;
case ‘)‘:
myword->typenum=27;
myword->word=")";
return(myword);
break;
case ‘[‘:
myword->typenum=28;
myword->word="[";
return(myword);
break;
case ‘]‘:
myword->typenum=29;
myword->word="]";
return(myword);
break;
case ‘{‘:
myword->typenum=30;
myword->word="{";
return(myword);
break;
case ‘}‘:
myword->typenum=31;
myword->word="}";
return(myword);
break;
case ‘,‘:
myword->typenum=32;
myword->word=",";
return(myword);
break;
case ‘:‘:
myword->typenum=33;
myword->word=":";
return(myword);
break;
case ‘;‘:
myword->typenum=34;
myword->word=";";
return(myword);
break;
case ‘>‘:
myword->typenum=35;
myword->word=">";
return(myword);
break;
case ‘<‘:
myword->typenum=36;
myword->word="<";
return(myword);
break;
case ‘!‘:
m_getch();
if(ch==‘=‘)
{
myword->typenum=40;
myword->word="!=";
return(myword);
}
retract();
myword->typenum=-1;
myword->word="ERROR";
return(myword);
break;
case ‘\0‘:
myword->typenum=1000;
myword->word="OVER";
return(myword);
break;
default:
myword->typenum=-1;
myword->word="ERROR";
return(myword);
}
}
}

时间: 2024-11-05 13:42:50

0921词法分析的相关文章

0921 词法分析程序

#include <stdio.h> #include <string.h> #include <iostream.h> /*全局变量*/ char * chr_form[100]; int q=0,temp; char *word[6]={"begin","end","if","then","do","while"}; int i=0,j=0,k=0

词法分析实验报告

词法分析实验报告 一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三. 实验方法.步骤及结果测试 源程序名:压缩包文件(rar或zip)中源程序

词法分析

词法分析 #include<stdio.h> #include<string.h> void main() { int i=0,j,k=0,state=1,f=0,linenum=1; char a[11][10]={"const","var","call","begin","if","while","do","odd",&

实验报告-词法分析.c

实验一.词法分析程序 商业软件工程   简梓茵  201506110132 一.        实验目的   熟悉词法分析的形式. 二.        实验内容和要求 对输入的每个关键字或者字符进行词法分析,给出该关键字对应的排序序号 三.        实验方法.步骤及结果测试   1.      源程序名:wordanalyse.c 2.      原理分析及流程图 3.      主要程序段及其解释: #include <stdio.h> #include <string.h>

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c  cifafenxi.exe 2.      原理分析及流程图 3.      主要程序段及其解释: do { scanf("%s\n",input); i=0; while(input[i]

词法分析程序实验报告

实验一词法分析实验 商业软件工程2班  黄铭坤  201506110147 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:词法分析.c 可执行程序名:词法分析.exe 2.      原理分析及流程图 (1)   关键字: begin  if  then  while  do  end (2) 

词法分析程序新

词法分析程序的功能:提示用户输入一段需分析的源程序,然后程序读入该源程序的字符串进行词法分析,最后输出词法分析的结果显示在屏幕上.符号与种别码对照表:单词符号 种别码 单词符号 种别码begin     1        :          17if           2        :=        18then      3        <          20while      4       <=        22do         5 end       6    

词法分析2

#include <stdio.h> #include <string.h> #define max 100 char a[max],b[8],ch; int syn,p,m,n,sum; char word[][6]={"begin","if","then","while","do","end"}; void mor() { sum=0; ch=a[p++];

词法分析程序(编译原理)

一:词法分析程序的功能: 输入单词串,以'begin'开始,以'#'结束.如果是文法正确的句子,则输出成功的信息:'输入单词串成功',否则返回错误提示. 例: 输入 begin a:=345 end # 输出 输入单词串成功 二:符号与种码对照表 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 <  20 while 4 <= 21 do 5 <>  22 end 6 >  23 l(l|d)* 10 >= 24 dd*