?? 新建 文本文檔 (2).txt
字號(hào):
二、 語法分析器
語法分析器的任務(wù)是根據(jù)詞法分析的結(jié)果判斷是否符合文法規(guī)則,并以一定形式輸出語法樹。(這里按逆波蘭式輸出。其中符號(hào)“!”代表?xiàng)l件語句運(yùn)算符;符號(hào)“@”代表循環(huán)語句運(yùn)算符)
代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define BOOL int
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
typedef struct
{
int no;
char str[MAXSIZE];
}Element;
Element ch;
FILE *in,*out;
void scan(); /* 掃描 */
void error(int error); /* 報(bào)錯(cuò) */
void P(); /* 程序 */ /* P → begin S end */
void S(); /* 語句串 */ /* S → SS { ; SS } */
void SS(); /* 語句 */ /* SS → S1 | S2 | S3 */
void S1(); /* 賦值語句 */ /* S1 → V := E */
void S2(); /* 條件語句 */ /* S2 → if SS2 then ( SS | P ) */
void S3(); /* 循環(huán)語句 */ /* S3 → while SS2 do ( SS | P ) */
void E(); /* 表達(dá)式 */ /* E → T { + T | - T } */
void SS2(); /* 條件 */ /* SS2 → E R E */
void R(); /* 關(guān)系符 */ /* R → < | <> | <= | > | >= | = */
void T(); /* 項(xiàng) */ /* T → F { * F | / F } */
void F(); /* 因子 */ /* F → V | N | ( E ) */
void V(); /* 變量 */ /* V → W */
void W(); /* 標(biāo)識(shí)符 */
void N(); /* 數(shù)字 */
void scan()
{
char buffer;
int i=0;
int temp=0;
do
{
buffer=fgetc(in);
ch.str[i++]=buffer;
}while(buffer!=',');
while(TRUE)
{
buffer=fgetc(in);
if(buffer!='\n')
{
temp=10*temp+buffer-48;
}
else
break;
}
ch.no = temp;
ch.str[--i]='\0';
}
void error(int n)
{
switch(n)
{
case 1:
printf("標(biāo)識(shí)符begin錯(cuò)誤!");
break;
case 2:
printf("標(biāo)識(shí)符if錯(cuò)誤!");
break;
case 3:
printf("標(biāo)識(shí)符then錯(cuò)誤!");
break;
case 4:
printf("標(biāo)識(shí)符while錯(cuò)誤!");
break;
case 5:
printf("標(biāo)識(shí)符do錯(cuò)誤!");
break;
case 6:
printf("標(biāo)識(shí)符end錯(cuò)誤!");
break;
case 7:
printf("不是有效的句子!");
break;
case 8:
printf("判斷語句出錯(cuò)!");
break;
case 9:
printf("循環(huán)語句出錯(cuò)!");
break;
case 10:
printf("不是正確的標(biāo)識(shí)符!");
break;
case 11:
printf("條件表達(dá)式錯(cuò)誤!");
break;
case 12:
printf("算術(shù)表達(dá)式錯(cuò)誤!");
break;
case 18:
printf("賦值語句錯(cuò)誤!");
break;
case 28:
printf("缺少')'!");
break;
default:
printf("Compile failed!");
break;
}
getch();
exit(1);
}
void P()
{
if(ch.no==1)
{
scan();
S();
if(ch.no==6)
scan();
else
error(6);
}
else
error(1);
}
void S()
{
SS();
while(ch.no==26)
{
scan();
SS();
}
}
void SS()
{
switch(ch.no)
{
case 10:
S1();
break;
case 2:
S2();
break;
case 4:
S3();
break;
default:
error(7);
break;
}
}
void S1()
{
V();
if(ch.no==18)
{
scan();
E();
fputc(':',out);
fputc('=',out);
fputc(' ',out);
}
else
error(18);
}
void S2()
{
if(ch.no==2)
{
scan();
SS2();
if(ch.no==3)
{
scan();
switch(ch.no)
{
case 10:
case 2:
case 4:
SS();
break;
case 1:
P();
break;
default:
error(8);
break;
}
fputc('!',out);
fputc(' ',out);
}
else
error(3);
}
else
error(2);
}
void S3()
{
if(ch.no==4)
{
scan();
SS2();
if(ch.no==5)
{
scan();
switch(ch.no)
{
case 10:
case 2:
case 4:
SS();
break;
case 1:
P();
break;
default:
error(9);
break;
}
fputc('@',out);
fputc(' ',out);
}
else
error(5);
}
else
error(4);
}
void V()
{
W();
}
void E()
{
T();
while(ch.no==13)
{
scan();
T();
fputc('+',out);
fputc(' ',out);
}
while(ch.no==14)
{
scan();
T();
fputc('-',out);
fputc(' ',out);
}
}
void SS2()
{
int temp;
E();
temp=ch.no;
R();
E();
switch(temp)
{
case 20:
fputc('<',out);
fputc(' ',out);
break;
case 21:
fputc('<',out);
fputc('>',out);
fputc(' ',out);
break;
case 22:
fputc('<',out);
fputc('=',out);
fputc(' ',out);
break;
case 23:
fputc('>',out);
fputc(' ',out);
break;
case 24:
fputc('>',out);
fputc('=',out);
fputc(' ',out);
break;
case 25:
fputc('=',out);
fputc(' ',out);
break;
}
}
void R()
{
switch(ch.no)
{
case 20:
scan();
break;
case 21:
scan();
break;
case 22:
scan();
break;
case 23:
scan();
break;
case 24:
scan();
break;
case 25:
scan();
break;
default:
error(11);
break;
}
}
void W()
{
int i=0;
if(ch.no==10)
{
while(ch.str[i]!='\0')
fputc(ch.str[i++],out);
fputc(' ',out);
scan();
}
else
error(10);
}
void T()
{
F();
while(ch.no==15)
{
scan();
F();
fputc('*',out);
fputc(' ',out);
}
while(ch.no==16)
{
scan();
F();
fputc('/',out);
fputc(' ',out);
}
}
void F()
{
switch(ch.no)
{
case 10:
V();
break;
case 11:
N();
break;
case 27:
scan();
E();
if(ch.no==28)
scan();
else
error(28);
break;
default:
error(12);
break;
}
}
void N()
{
int i=0;
if(ch.no==11)
{
while(ch.str[i]!='\0')
fputc(ch.str[i++],out);
fputc(' ',out);
scan();
}
else
error(12);
}
void main()
{
const char* input="scaned.txt";
const char* output="compiled.txt";
if(!(in=fopen(input,"r")))
error(-1);
out=fopen(output,"w");
scan();
P();
if(ch.no==0)
{
printf("Success!");
fputc('#',out);
}
else
error(-1);
fclose(in);
fclose(out);
getch();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -