编译原理词法分析程序

预头文件

/*----Head file for analysis programs in....----*/

#include <stdio.h>

#include <string.h>

#include <ctype.h>                  //使用到的字符分类函数定义在的头文件

/**

*TEST编译器:词法分析头文件

*@author mohui

*@date 2015/04/12

***/

//--------预定义常量--------

#define keywordSum 8                 //关键字个数

#define compileOK 0                  //词法分析成功完成代码

#define inputERROR 1                 //词法分析源文件输入出错代码

#define outputERROR 2                //词法分析输出文件出错代码

#define unusualChr 3                  //词法分析非法字符代码

//--------变量、结果类型--------

char *keyword[keywordSum]={"if","else","for","while","do","int","read","write"};

char singleword[20]="+-*(){};,:";      //纯单分界符

char doubleword[20]="><=!";         //双分界符的首字符

char inFile[50],outFile[50];           //源文件名与输出报告文件名(含路径)

FILE *fin,*fout;

//--------analysis.c---------

int TESTscan();                     //词法分析函数

int IOinfo();                        //文件流输入输出监管

void String(char *ch);                //检查标识符(包括关键字)并记录

void Number(char *ch);              //检查数字并记录

void sDelimiter(char *ch);            //纯单分界符

void dDelimiter(char *ch);            //分离双分界符与单分界符

void comments(char *ch);            //注释符内容处理

int illegalChr(char *ch);              //词法分析过程非法字符处理

C源程序

#include "analysis.h"

/**

*TEST编译器:词法分析

*@author mohui

*@date 2015/04/12

***/

//---------主    程   序--------

int main(){

int ecode=compileOK;

ecode=TESTscan();

if(ecode>0)

{

printf("==================================\n");

printf("ERROR : 词法分析存在错误,编译中断!\n错误代码 : %d\n",ecode);

printf("==================================\n");

}

else

printf("词法分析成功!\n");

return 0;

}

//--------集成函数主模块--------

int TESTscan(){

char ch;

int ecode;

ecode=IOinfo();

ch=getc(fin);

do{

while(isspace(ch))     //检查是否是空格符和跳格符(控制字符)或换行符

ch=getc(fin);

if(isalpha(ch))                     //判断是否是字母

{

String(&ch);             //记录标识符[关键字]

}

else if(isdigit(ch))                //检查是否是数字

{

Number(&ch);             //记录数字

}

else if(strchr(singleword,ch)>0)    //判断singleword中有没有ch,有返回值为1,没有返回值为0

{

sDelimiter(&ch);         //记录纯单分界符

}

else if(strchr(doubleword,ch)>0)

{

dDelimiter(&ch);         //分离双分界符与单分界符

}

else if(ch==‘/‘)

{

comments(&ch);           //分离注释处理

}

else

{

ecode=illegalChr(&ch);              //分析过程异常符号处理

}

}while(!feof(fin));

fclose(fin);

fclose(fout);

return ecode;

}

//--------文件流情况的监管--------

int IOinfo(){

printf("请输入源文件文件名[包括路径]:\n");

fscanf(stdin,"%s",inFile);

printf("请输入词法分析输出文件名[包括路径]:\n");

fscanf(stdin,"%s",outFile);

if((fin=fopen(inFile,"r"))==NULL)

{

printf("打开词法分析源文件出错!\n");

return (inputERROR);

}

if((fout=fopen(outFile,"w"))==NULL)

{

printf("创建词法分析输出文件出错!\n");

return (outputERROR);

}

return compileOK;

}

//--------检查&记录标识符(包括关键字)--------

void String(char *ch){

char checked[50];

int j,n;

checked[0]=*ch;

j=1;

*ch=getc(fin);                   //读入下一个字符

while(isalnum(*ch))              //检查是否是数字或字母

{

checked[j++]=*ch;

*ch=getc(fin);

}

checked[j]=‘\0‘;                //标识符组合结束

n=0;

while((n<keywordSum)&&strcmp(checked,keyword[n]))

n++;

if(n>=keywordSum)

fprintf(fout,"%s\t%s\n","ID",checked);      //输出标识符符号

else

fprintf(fout,"%s\t%s\n",checked,checked);   //输出保留字符号

}

//--------检 查&记 录 数 字--------

void Number(char *ch){

char checked[100];

int j;

checked[0]=*ch;

j=1;

*ch=getc(fin);                   //读入下一个字符

while(isdigit(*ch))

{

checked[j++]=*ch;

*ch=getc(fin);

}

checked[j]=‘\0‘;                //数字组合结束

fprintf(fout,"%s\t%s\n","NUM",checked);          //输出整数符号

}

//--------单分界符--------

void sDelimiter(char *ch){

char checked[2];

checked[0]=*ch;

checked[1]=‘\0‘;

*ch=getc(fin);

fprintf(fout,"%s\t%s\n",checked,checked);       //输出单分界符

}

//--------双分界符--------

void dDelimiter(char *ch){

char checked[5];

checked[0]=*ch;

*ch=getc(fin);

if(*ch==‘=‘)

{

checked[1]=*ch;

checked[2]=‘\0‘;

*ch=getc(fin);

}

else

checked[1]=‘\0‘;

fprintf(fout,"%s\t%s\n",checked,checked);       //输出双分界符或单分界符

}

//--------注释符处理--------

void comments(char *ch){         //程序顺序执行到这里,已经过单分界符的判断,so可以不必再记录ch

char checked[2];

*ch=getc(fin);

if (*ch==‘*‘)

{

char ch1;

ch1=getc(fin);

do{

*ch=ch1;

ch1=getc(fin);

}while((*ch!=‘*‘||ch1!=‘/‘)&&!feof(fin));

*ch=getc(fin);

}

else

{

checked[0]=‘/‘;

checked[1]=‘\0‘;

fprintf(fout,"%s\t%s\n",checked,checked);       //输出单分界符

}

}

//--------异常(非法)字符处理--------

int illegalChr(char *ch){

char checked[2];

checked[0]=*ch;

checked[1]=‘\0‘;

*ch=getc(fin);

fprintf(fout,"%s\t%s\n",checked,checked);           //输出异常(非法)符号

return (unusualChr);

}

测试用的两个TEST源码:

test.txt内容:

illegal.txt内容:

运行结果:

           

         

时间: 2024-07-28 15:06:21

编译原理词法分析程序的相关文章

编译原理词法分析

#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

编译原理--词法分析--实验报告(此文章在管理-发表文章 里也有)

实验一.词法分析实验 专业:信息技术与工程学院   姓名:吕军  学号:201506110159    一.        实验目的   目的:主要是为了编辑一个词法分析程序.了解计算机的识别源程序字符串的过程. 二.        实验内容和要求   实验内容:通过了解 各种单词符号对应的种别码表,编写一个简单的词法分析程序,通过计算机识别字符串,反映其中的单词符号和所对应的种别码. 实验要求:用户输入源程序字符串,输出:二元组(种别,单词本身) 三.        实验方法.步骤及结果测试

编译原理词法分析之关键词统计

1.本文中,需要将系统关键词自己首先定义在KeyWord数组中(如18行),这样程序才会自动进行比较: 2.选出某个关键词后,将其code置为0(如26行),避免多次打印该关键词: 3.请自己创建src.txt文件(如65行),并在里面放入一段"你需要统计的语言"代码. //@Title:词法分析之关键词统计 //@Author:qingdujun //@FileName:Main.CPP #include <stdio.h> #include <stdlib.h&g

读龙书学编译原理 词法分析(2)...

第二种词法分析的方式当然是词法分析器的自动生成器. 如lex, jlex 等等. 那么如何来让生成器知道我们想要生成的Token呢 ? 这就涉及到统一的声明式规范的问题, 换句话讲, 你将按照生成器的形式要求将声明式的规范交给生成器, 那么它就能够对其进行识别. 所以我们只需要完成声明式的规范即可完成词法分析部分, 到最后词法解析器自动生成器就能为我们生成对应的自动机... 那么如何来给生成器一个统一的声明式的规范呢 ? 先要了解的一个数学工具就是正则表达式, 如图所示, 这是对正则表达式的基本

编译原理词法分析 java简单实现

package com.csray; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class LexicalAnalysis { static String id; public static void main(String[] args

0920编译原理词法分析

#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]=""; //单词

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

程序员的三大浪漫之一——编译原理

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 我认为,既然编译过程是将一种语言翻译为另一种语言的计算机程序的过程,顾名思义,编译原理就是为我们解释计算机是如何将一种语言翻译成另一种语言这