/*
待分析的簡單語言的語法
用擴充的bnf表示如下:
⑴《程式》::=begin《語句串》end
⑵《語句串》::=《語句》
⑶《語句》::=《賦值語句》
⑷《賦值語句》::=id:=《表示式》
⑸《表示式》::=《項》
⑹《項》::=《因子》;//關鍵字表
int syn,p,m,n,sum;
/*syn是種別碼,p為prog陣列的指標,m為token陣列的指標,n為rwtab陣列的指標,sum為詞法分析器裡的數字數值大小*/
int flag;//flag與判斷是否end有關
void factor(void);//因式 factor
void expression(void);//表示式 expression
void yucu(void);
void term(void);//項 term
void statement(void);// 語句 statement
void parser(void);
void scaner(void);//掃瞄器
int main(void)
while(ch!='#');
p=0;
scaner();//主要完成賦值種別碼等詞法分析功能
parser();//呼叫各種遞迴子程式,完成語法分析的過程
//getch();
}/*呼叫各種遞迴子程式,完成語法分析的過程*/
void parser(void)
else
}else
return;
}void yucu(void)
return;
}void statement(void)
else
}else
return;
}void expression(void)
return;
}void term(void)
return;
}void factor(void)//因式處理函式
else if(syn==27)//開頭是左括號(
else
}else
return;
}/*主要完成賦值種別碼等詞法分析功能*/
void scaner(void)//掃瞄器,詞法分析器內容
p--;//迴圈跳出,要-1
syn=10;//10,字母開頭
token[m++]='\0';//\0為字串結束符
/*判別是否為關鍵字*/
for(n=0;n<6;n++)//n為rwtab的指標
if(strcmp(token,rwtab[n])==0)//strcmp返回值為0,則兩個引數大小相同
}else if((ch>='0')&&(ch<='9'))//遇到數字
p--;//回溯
syn=11;//11為數字
} /*除數字和字母開頭以外的其他符號*/
else
switch(ch)
else if(ch=='=')
else
break;
case '>':
m=0;
ch=prog[p++];
if(ch=='=')
else
break;
case ':':
m=0;
ch=prog[p++];
if(ch=='=')
else
break;
case '+':
syn=13;
break;
case '-':
syn=14;
break;
case '*':
syn=15;
break;
case '/':
syn=16;
break;
case '(':
syn=27;
break;
case ')':
syn=28;
break;
case '=':
syn=25;
break;
case ';':
syn=26;
break;
case '#':
syn=0;
break;
default:
syn=-1;
break;
}}
編譯原理語法分析器
採用至少一種句法分析技術 ll 1 slr 1 lr 1 或lalr 1 對類高階語言中的基本語句進行句法分析。闡述句法分析系統所要完成的功能。1 能識別以下幾類語句 宣告語句 包括變數宣告 陣列宣告 記錄宣告和過程宣告 表示式及賦值語句 包括陣列元素的引用和賦值 分支語句 if then else...
編譯原理 語法分析器
當乙個文法滿足ll 1 條件時,我們就可以為它構造乙個不帶回溯的自上而下分析程式,這個分析程式是由一組遞迴過程組成的,每個過程對應文法的乙個非終結符。這樣的乙個分析程式成為遞迴下降分析器。例 乙個支援 的簡單文法為 用 表示空字元 e te e te t ft t ft f e i 編譯原理 第三版...
編譯原理 LL(1)語法分析器
1.專案要求 文法要求 1 從檔案讀入,每條產生式占用一行 2 文法為ll 1 文法 從檔案中讀入文法,從鍵盤上輸入待分析的符號串,採用 ll 1 分析演算法判斷該符號串是否為該文法的句子。2.實驗思路 首先實現集合first x 構造演算法和集合follow a 構造演算法,再根據first和fo...