?? 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 + -