编译原理课程设计-词法分析器设计(C语言)

编译原理课程设计-词法分析器设计(C语言),第1张

#include "stdio.h"                  /*定义I/O库所用的某些宏和变量*/

#include "string.h"                 /*定义字符串库函数*/

#include "conio.h"                  /*提供有关屏幕窗口 *** 作函数*/

#include "ctype.h"                  /*分类函数*/

char prog[80]={'\0'},

token[8]                     /*存放构成单词符号的字符串*/

char ch

int syn,                           /*存放单词字符的种别码*/

n,

sum,                           /*存放整数型单词*/

m,p                           /*p是缓冲区prog的指针,m是token的指针*/

char *rwtab[6]={"begin","if","then","while","do","end"}

void scaner(){

m=0

sum=0

for(n=0n<8n++)

token[n]='\0'

ch=prog[p++]

while(ch==' ')

ch=prog[p++]

if(isalpha(ch))    /*ch为字母字符*/{

while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/{

token[m++]=ch

ch=prog[p++]}

token[m++]='\0'

ch=prog[p--]

syn=10

for(n=0n<6n++)

if(strcmp(token,rwtab[n])==0)    /*字符串的比较*/{

syn=n+1

break}}

else

if(isdigit(ch))    /*ch是数字字符*/{

while(isdigit(ch))    /*ch是数字字符*/{

sum=sum*10+ch-'0'

ch=prog[p++]}

ch=prog[p--]

syn=11}

else

switch(ch){

case'<':m=0token[m++]=chch=prog[p++]

if(ch=='>'){

syn=21

token[m++]=ch}

else if(ch=='='){

syn=22

token[m++]=ch}

else{

syn=20

ch=prog[p--]}

break

case'>':m=0token[m++]=chch=prog[p++]

if(ch=='='){

syn=24

token[m++]=ch}

else{

syn=23

ch=prog[p--]}

break

case':':m=0token[m++]=chch=prog[p++]

if(ch=='='){

syn=18

token[m++]=ch}

else{

syn=17

ch=prog[p--]}

break

case'+':syn=13token[0]=chbreak

case'-':syn=14token[0]=chbreak

case'*':syn=15token[0]=chbreak

case'/':syn=16token[0]=chbreak

case'=':syn=25token[0]=chbreak

case'':syn=26token[0]=chbreak

case'(':syn=27token[0]=chbreak

case')':syn=28token[0]=chbreak

case'#':syn=0token[0]=chbreak

default:syn=-1}}

main()

{

printf("\n\nThe significance of the figures:\n"

"1.figures 1 to 6 said Keyword\n"

"2.figures 10 and 11 said Other indicators\n"

"3.figures 13 to 28 said Operators\n")

p=0

printf("\nplease input string:\n")

do {

ch=getchar()

prog[p++]=ch

}while(ch!='#')

p=0

do{

scaner()

switch(syn){

case 11: printf("(%d,%d)\n",syn,sum)break

case -1: printf("\n ERROR\n")break

default: printf("(%d,%s)\n",syn,token)

}

}while(syn!=0)

getch()

}

程序测试结果

对源程序begin x:=9: if x>9 then x:=2*x+1/3 end #的源文件,经过词法分析后输出如下图5-1所示:

具体的你在修改修改吧

C语言词法分析器

#include<iostream>

#include<stdio.h>

#include<string>

using namespace std

FILE *f //定义一个文件变量

static int line = 1 //表示光标所在的行数

struct ID{ char *nameint count}id[100]//用于存放ID号码

static int I = 0//用于记录ID存放的数量

int Number[100]//用于存放数字

static int P = 0//用于记录存放数字的个数

int error[100] = {0} //用于记录错误所在的行数

static int K = 0//记录错误次数

void Error() //记录错误

void loginID(char *) //注册ID号

void loginNumber(int &)//记录数字

void noteLine(char &)//记录光标所在的行数

void print() //输出分析结果

int same(char *chr) //判断单词是否已经存在

void Error()

{ error[K++] = line}

void loginID(char *chr) //注册ID号

{

int k = 0

int h = 0

for(int i = 0i <Ii++)

{

if(!strcmp(chr,id.name)) //如果单词已经存在

{

id.count++

k = 1

}

}

if(k == 0) //该单词不存在

{

h = I + 1

//I = h

id[h].count++

id[h].name = chr

//strcpy(id[h].name ,chr)

}

}

void loginNumber(int &nu)

{ Number[P++] = nu}

void noteLine(char &ch)

{

if ( ch == ' ' )

++line

}

void print()//输出部分

{

//cout <<"关键字以及变量:" <<endl

//for(int i = 0i <100i++)

//cout <<i <<" " <<id.name <<" " <<id.count <<endl

cout <<"数字:" <<endl

for(int i = 1i <= Pi++)

cout <<i <<": " <<Number[i-1] <<endl

if(error[0] != 0)

{

cout <<"出现的错误!" <<endl

for(int i = 1i <= Ki++)

cout <<"第" <<i <<"个错误: " <<"第" <<error[i-1] <<"行" <<endl

}

else cout <<"没有错误!" <<endl

}

//文件处理部分

void noblank( char &ch) //跳过空格,回车

{

noteLine(ch)

while(ch == ' ' || ch == ' ')

ch = fgetc(f)

}

void identifier(char name[],char &ch)//字母变量

{

int i

for(i = 0i <20i++)

name = ''

i = 0

while (('0'<= ch &&ch <= '9')||('a'<= ch&&ch <= 'z')||('A'<= ch&&ch <='Z'))

{

name = ch

i++

ch = fgetc(f)

}

loginID(name)

//for(int j = 0j <ij++)

//{cout <<name[j]}

// cout <<' '

}

int number(char &ch)//数字

{

int num=0

while('0'<= ch &&ch <= '9')

{

num = num* 10 + (ch-'0')

ch = fgetc(f)

}

if( ('a'<= ch&&ch <= 'z')||('A'<= ch&&ch <='Z'))

{

Error()

}

else if( ch == '.')

{}

loginNumber(num) //记录数字

return num

}

void test(char &ch)//符号

{

char str[2]={'0/'}

if(ch == '*')

{ str[0] = chch = fgetc(f)}

if(ch == '.')

{ str[0] = chch = fgetc(f)}

if(ch == ',')

{ str[0] = chch = fgetc(f)}

if(ch == '"')

{ str[0] = chch = fgetc(f)}

if(ch == '/')

{ str[0] = chch = fgetc(f)}

if(ch == '%')

{ str[0] = chch = fgetc(f)}

if(ch == '^')

{ str[0] = chch = fgetc(f)}

if(ch == '-')

{ str[0] = chch = fgetc(f)}

if(ch == '{')

{ str[0] = chch = fgetc(f)}

if(ch == '}')

{ str[0] = chch = fgetc(f)}

if(ch == '[')

{ str[0] = chch = fgetc(f)}

if(ch == ']')

{ str[0] = chch = fgetc(f)}

if(ch == '')

{str[0] = chch = fgetc(f)}

if(ch == ':')

{ str[0] = chch = fgetc(f)}

if(ch == '?')

{ str[0] = chch = fgetc(f)}

if(ch == '(')

{ str[0] = chch = fgetc(f)}

if(ch == ')')

{str[0] = chch = fgetc(f)}

if(ch =='+')

{

str[0] = ch

if((ch = fgetc(f)) == '+' )

{

str[1] = ch

ch = fgetc(f)

//cout <<str[0] <<str[1] <<endl

}

//cout <<str[0]<<endl

}

if(ch == '-')

{

str[0] = ch

if((ch = fgetc(f)) == '-' )

{

str[1] = ch

ch = fgetc(f)

//cout <<str[0] <<str[1] <<endl

}

//cout <<str[0]<<endl

}

if(ch == '&')

{

str[0] = ch

if((ch = fgetc(f)) == '&' )

{

str[1] = ch

ch = fgetc(f)

//cout <<str[0] <<str[1] <<endl

}

//cout <<str[0]<<endl

}

if(ch == '|')

{

str[0] = ch

if((ch = fgetc(f)) == '|' )

{

str[1] = ch

ch = fgetc(f)

//cout <<str[0] <<str[1] <<endl

}

//cout <<str[0]<<endl

}

if(ch == '!')

{

str[0] = ch

if((ch = fgetc(f)) == '=' )

{

str[1] = ch

ch = fgetc(f)

//cout <<str[0] <<str[1] <<endl

}

//cout <<str[0]<<endl

}

if(ch == '=')

{

str[0] = ch

if((ch = fgetc(f)) == '=' )

{

str[1] = ch

ch = fgetc(f)

//cout <<str[0] <<str[1] <<endl

}

}

if(ch == '>')

{

str[0] = ch

if((ch = fgetc(f)) == '=' )

{

str[1] = ch

ch = fgetc(f)

//cout <<str[0] <<str[1] <<endl

}

else

if(ch == '>' )

{

str[1] = ch

ch = fgetc(f)

//cout <<str[0] <<str[1] <<endl

}

}

if(ch == '<')

{

str[0] = ch

if((ch = fgetc(f)) == '=' )

{

str[1] = ch

ch = fgetc(f)

}

else

if(ch == '<' )

{

str[1] = ch

ch = fgetc(f)

}

}

}

int main()

{

char ch

char name[30]

for(int i = 0i <30i++)

name = '/0'

f = fopen("c.txt","r") //打开指定输入文件

if (f == NULL)

cout<<"文件不存在!"<<endl

ch = fgetc(f)

while(!feof(f))

{

noblank( ch )//跳过回车,空格

if( ( ch >= 'a' &&ch <= 'z' )||( ch >= 'A' &&ch <= 'Z' ))

{ identifier(name,ch)} //处理字母

else if( ch >= '0'&&ch <= '9')

{ number(ch)} //处理数字

else

{ test(ch)} //处理符号

}

print() //打印词法分析结果

fclose(f) //关闭文件

system("pause")

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11750055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存