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_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-19 22:45:53

0916编译原理词法分析作业二的相关文章

编译原理课程作业1 消除无用产生式

前言: 一年前在知乎上看到一个回答,答主说自己学了两天Python,用十几个小时做完了全部的编译原理课程作业,当时吓傻了我,现在看来,虽然两天学会比不上,但Python做课程作业的速度简直是快,课程作业1里我还傻傻的用list的extend和append,加上set函数,到第二次作业里我才发现, 没有什么结构体是一个list不能解决的,如果有,那就再套一个list 课程作业题: 消除无用产生式 # -*- coding: utf-8 -*- class Solution: def __init_

编译原理词法分析

#include<iostream>#include<String>#include <strstream>using namespace std; #define N 200;/*关键字结构体定义*/typedef struct keyword{ char name[20];}KeyWord;/*符号表结构体定义*/typedef struct symboltable{ char name[20]; //token值 string attribute; //属性值}S

编译原理 词法分析

原文地址:编译原理 词法分析 编译原理 词法分析 词法分析的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析. 1.正则表达式 对给定的字符集∑={c1,c2,...,cn},归纳定义: 1.空串ε是正则表达式 2.对于任意c∈∑,c是正则表达式 3.如果M和N是正则表达式,则下列表达式也是正则表达式 (1)选择 M|N={M,N} (2)连接 MN={mn|m∈M,n∈N} (3)闭包 M*={ε,M,MM,MMM,...} 2.正则表达式的扩展 (1)[c1-c

编译原理大作业(用java编写小型GCC 编译器)

以前只用编译器编译程序,现在学完编译原理这门课以后,通过编译大作业,我对编译器的工作原理有了比较清晰的认识 编译器的工作原理 编译器 (Compiler) 是一种将由一种语言编写的程序转换为另一种编程语言的可执行程序. 现代软件对于编译器的需求远甚从前, 究其原因很简单: 作为中间层, 编译器是构建更高层抽象的基础设施. 编译器意欲将人类可阅读的高阶代码, 翻译为机器能运行的低阶代码. 现代编译器的主要工作流程为: 源代码(source code)→ 预处理器(preprocessor)→ 编译

编译原理第一次作业

一.编译原理是什么?原理我们的计算机系的一门课程,它在我们的科学发展中起到了很重要的作用,也可以说是计算机系统的核心部分之一.它运用编译器.编译系统将我们的语言和计算机的语言进行转换等.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 二.学习编译原理有什么好处? 1.语法分析,语义分析,和代码优化的知识,还有技巧,思想能让我终生受益. 2.我得以学习大量优美的算法,并得以欣赏理论和实践在编译器开发中如何美妙地结合在一起. 3.我可以了解怎样

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]=""; //单词缓冲区 i

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]=""; //单词缓冲区 i

编译原理小作业词法分析程序

词法分析程序所参照的编码如70页表3.3 (<编译技术>张莉等著.--北京:高等教育出版社,2016.9.ISBN: 978-7-04-046317-0) 用Java语言实现如下: 1 import java.io.IOException; 2 import java.util.Arrays; 3 import java.util.HashMap; 4 import java.util.Map; 5 6 class Code{ 7 public static final int BEGINSY

0916编译原理第二次上机作业

#include<stdio.h> void Fenxi(a,b); int i; main(){ char a[50]; printf("请输入源程序:"); gets(a); printf("您要分析的源程序为:"); printf("%s",a); printf("\n"); for(i=0;i<50;i++) { Fenxi(a[i],a[i+1]); } printf("\n")