解析器最終版本

2021-05-25 05:18:41 字數 3491 閱讀 2550

#include

#include

#define size 512

#define cr '/n'

char file[300]="input.txt";//用於接收輸入輸出檔名

//定義分界符

char singleword[50]="+-=#;<>";

file *fin; //指向輸入檔案的指標

void main(){

int returnvalue=0;

cmdinput();

returnvalue=scan(); //進行詞法分析

if (returnvalue==1) printf("分析有錯!the maxium length of token is 15 characters!/n");

else printf("分析成功!/n");

int scan()//詞法分析函式

char ch,chk=0,id[15]; //ch為每次讀入的字元,chk為引號、回車檢查所用量,id用於儲存識別出的單詞

int i=1,j,n=0; //i,j為臨時變數,n統計token個數

int flag; //檢查一行內是否有兩個引號,是為1,否為0

file *tmp; //用於存放檔案讀指標_io_read_ptr的位址

fin=fopen(file,"r"); 

ch=getc(fin);

start:

while(ch!=eof)

while (ch==' '||ch=='/n') //如果已經到達檔案盡頭或出現連續兩個回車則結束

chk=ch;

ch=getc(fin);

if (ch==eof) goto end;

else if(ch=='/n')

goto end;

else if(ch!='/n'&&chk!=' '&&chk!=34) //對回車的判定

printf("token[%d] is/t/n",i);

fseek(fin,-1l,1);

ch=getc(fin);

i++;

chk=0;

if (isalnum(ch))   //如果是字母或者數字,則進行識別符號處理

id[0]=ch; j=1;

ch=getc(fin);

while(isalnum(ch))  //如果是字母數字則組合識別符號;如果不是則識別符號組合結束

id[j++]=ch;  //組合的識別符號儲存在id中

ch=getc(fin);  //讀下乙個字元

if(j>15)

goto error;

id[j]='/0';  //識別符號組合結束

printf("token[%d] is/t",i);

puts(id);

else if (strchr(singleword,ch)>0)  //分界符處理

id[0]=ch; id[1]='/0';

ch=getc(fin);//讀下乙個符號以便識別下乙個單詞

printf("token[%d] is/t",i);  //輸出單分界符符號

puts(id);

else if (ch==',')  //單分符處理

ch=getc(fin);//讀下乙個符號以便識別下乙個單詞

i--;

else if (ch==34) //當遇到第乙個引號時進行檢測

tmp=fin->_io_read_ptr; //儲存當前檔案讀指標的位置以便恢復

while(1)

if(chk==34)

flag=1;break;

else if(chk=='/r'||chk=='/n')

flag=0;

break;

else

flag=0;

chk=getc(fin);

if (flag==0)

fin->_io_read_ptr=tmp;

id[0]=34;id[1]='/0';

ch=getc(fin);

printf("token[%d] is/t",i);

puts(id);

i++;

goto start;

else

fin->_io_read_ptr=tmp;

ch=getc(fin);

while(ch!=eof)

while (ch==' '||ch==34||ch=='/n') 

chk=ch;

ch=getc(fin);

if (ch==eof) goto end;

if (ch!='/n'&&chk!=' '&&chk!=34)

printf("token[%d] is/t/n",i);

fseek(fin,-1l,1);

ch=getc(fin);

i++;

chk=0;

if (isalpha(ch)||isdigit(ch)) 

id[0]=ch; j=1;

ch=getc(fin);

while(isalnum(ch)) 

id[j++]=ch;

ch=getc(fin);

if(j>15)

goto error;

id[j]='/0'; 

printf("token[%d] is/t",i);

puts(id);

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

id[0]=ch; id[1]='/0';

ch=getc(fin);

printf("token[%d] is/t",i); 

puts(id);

else if (ch==',') 

ch=getc(fin);

i--;

i++;

flag=0;

goto start;

i++;

fclose(fin);//關閉輸入檔案

end: return(0);  //返回主程式

error: return(1); //返回出錯**

void cmdinput() //輸入函式

char buffer[size]; //定義輸入緩衝區大小

file *fp1;

fp1=fopen(file,"w");

printf("command line:/n");

printf("input a blank line to exit!/n"); //輸入乙個空行以結束輸入函式

gets(buffer);

while(fgets(buffer,size,fp1)!=null||buffer[0]!=0)

fputs(buffer,fp1);

fputc(cr,fp1); //在每行後插入乙個回車

gets(buffer);

fclose(fp1);

printf("input end!/n/n");

cuda做卷積運算最終版本

include device functions.h include cuda runtime.h include device launch parameters.h include stdlib.h include include using namespace std 返回thread和blo...

setTimeout 最終版本 物件導向可擴充套件

object.extend function destination,source return destination 返回擴充套件後的destination extend方法的所用是 destination目標物件的property屬性繼承source物件的property屬性 function...

簡易單鏈表模版(暫定最終版本)

自己寫的乙個單鏈表模版,模版的實現和定義是不可以分開兩個檔案寫的 和平時寫的類的不太一樣 這個要注意,一開始沒注意到這個 就出現了那個最討厭的 unresolve external symbol 的錯誤 下面是 功能是一些比較常見的功能 這個是經過修改完善後的乙個最終版本,以後有新想法 會再新增進去...