📄 test.c
字号:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
FILE *fp;
char c;
int state = 1, start = 1;
int lexical_value; /* install_id() 和 install_num()返回的指针 */
char* token_beginning = 0; /* 词素中首符号的索引 */
char* forward; /* 向前指针 */
char* lexeme_beginning;/* 词素开始指针 */
char buffer[2048]; /* 缓冲区 */
/* 返回超前扫描字符 */
char nextchar()
{
if(forward == null) /* 刚开始扫描 */
{
forward = buffer;
}
else
{
forward++;
}
if(*forward == EOF)
{
if( forward == &(buffer[1024]) )
{
fread(&(buffer[1024]),1,1023,fp);
buffer[2047] = EOF;
forward++;
return *forward;
}
else if( forward == &(buffer[2047]) )
{
fread(buffer,1,1023,fp);
buffer[1023] = EOF;
forward = buffer;
return *forward;
}
else
{
return EOF;
start = 1000; /* 标示文件已经处理完了 */
}
}
}
/* 回退amount个位置 */
void retract(int amount)
{
forward -= amount;
}
/* 插入符号表,这里只是简单输出 */
void install_id()
{
char* p = lexeme_beginning;
if(forward < lexeme_beginning)
{
printf("forward run too further than lexeme_beginning(in install_id())!");
getch();
exit(1);
}
printf("< 关键字或标示符 ,");
for(; p <= forward; p++)
{
if(*p != EOF)
{
putchar(*p);
}
}
putchar('>');
putchar('\x0');
putchar('\n');
}
/* 用来存放num表项的值,这里只是简单输出 */
void install_num()
{
char* p = lexeme_beginning;
if(forward < lexeme_beginning)
{
printf("forward run too further than lexeme_beginning(in install_id())!");
getch();
exit(1);
}
printf("< 数 ,");
for(; p <= forward; p++)
{
if(*p != EOF)
{
putchar(*p);
}
}
putchar('>');
putchar('\n\n');}
/* 试图修复程序错误 */
void recover()
{
printf("compile error!");
getch();
exit(1);
}
/* 当前模式匹配失败,**开始下一轮匹配 */
int fail()
{
forward = lexeme_beginning;
switch(start)
{
case 1: start = 4; break;
case 4: start = 7; break;
case 7: start = 15; break;
case 15: start = 20; break;
case 20: start = 42; break;
case 42: start = 70; break;
case 70: start = 90; break;
case 90: start = 110; break;
case 110: start = 120; break;
case 120: recover(); break;
case 1000:
printf("The file has been lexed!\nThank you for use my program!\n");
getch();
exit(1);
default:
printf("exit at fail()'s default item!");
getch();
exit(1);
}
return start;
//printf("The file is wrong!");
//getch();
//exit(1);
}
/* Get the token of the c file */
void nexttoken()
{
while(1)
{
switch(state)
{
case 1:
c = nextchar();
if(isalpha(c) || (c == '_'))
state = 2;
else state = fail();
break;
case 2:
c = nextchar();
}
}
}
void fillwholebuffer()
{
fread(buffer,1,1023,fp);
buffer[1023] = EOF;
fread(&(buffer[1024]),1,1023,fp);
buffer[2047] = EOF;
}
main()
{
int completed = 0;
if((fp = fopen("C:\\file.c","r")) == null)
{
printf("\nError on open the file!");
getch();
exit(1);
}
fillwholebuffer();
forward = null;
lexeme_beginning = buffer;
while(!completed)
{
nexttoken();
}
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -