编程实验一 词法分析程序

#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-10-12 14:55:23

编程实验一 词法分析程序的相关文章

0916 编程实验一 词法分析程序

#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_to

(改)编程实验一 词法分析程序

  #include <stdio.h>#include <stdlib.h>#include <string.h> typedef struct node{ char words[255]; struct node *next;}NODE; char word[255];char *word_default[6]={"begin","if","then","while","do&

实验一&#160;&#160;词法分析程序045

实验一  词法分析程序实验 专业 计算机科学与技术   姓名 邹汉辉  学号 201508030045 一.实验目的 1. 编制一个词法分析程序 二. 实验内容和要求 1. 输入:源程序字符串 2. 输出:二元组(种别,单词本身) 3. 待分析语言的词法规则 三. 实验方法.步骤及结果测试 1.  源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名:cifafenxi.exe 2.  原理分析及流程图 3.  主要程序段及其解释: #include<stdio

实验一词法分析程序

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

实验一 词法分析程序实验

实验一.词法分析程序实验 商业软件工程   蓝海鹏  201506110171 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 实验内容: 对字符串表示的源程序 从左到右进行扫描和分解 根据词法规则: 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)*(标识符) 10 >=

0917 实验一 词法分析程序

#include <stdio.h> #include <string.h> #include <iostream.h> #define BEGIN 1 #define IF 2 #define THEN 3 #define WHILE 4 #define DO 5 #define END 6 #define INT 11 #define LT 20 #define LE 21 #define EQ 24 #define NE 22 #define GT 12 #def

0917 实验一词法分析程序

#include <stdio.h>#include <string.h>int Input1(char a){ int i=0; switch(a) { case('+'):  printf("%c\t   13\n",a);i++;break; case('-'):  printf("%c\t   14\n",a);i++;break; case('*'):  printf("%c\t   15\n",a);i++;b

词法分析程序实验报告

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

实验报告一 词法分析程序

实验一.词法分析程序实验 专业:商业软件工程   姓名:卓润峰  学号:201506110202 一.        实验目的 编制一个词法分析程序. 二.        实验内容和要求 1.输入:源程序字符串. 2.输出:二元组(种别,单词本身) 3.待分析语言的词法规则 主要是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析 三.        实验方法.步骤及结果测试 1.     源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名: