#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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)