?? 1.cpp
字號:
/************************************語法分析********************************/
//備注:輸入以#結(jié)束,且不可分行輸入!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum; //syn為單詞種別碼,p是緩沖區(qū)prog的指針,m是token的指針,sum為數(shù)字
char *rwtab[6]={"begin","if","then","while","do","end"};
void scanner();
void lrparser();
void yucu();
void statement();
void factor();
void expression();
void term();
void factor();
int f=0;
void main()
{
p=0;
cout<<"請輸入語句:\n";
while(ch!='#')
{
cin.get(ch);
prog[p++]=ch;
}
p=0;
scanner();
lrparser();
}
void error()
{
cout<<"Error!\n";
}
void scanner()
{
for(n=0;n<8;n++)
token[n]=NULL;
m=0;
sum=0;
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if((ch>='A'&&ch<='Z')||(ch>='a' && ch<='z'))
{
while((ch>='A'&&ch<='Z')||(ch>='a' && ch<='z')||(ch>='0' && ch<='9'))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum*10+(int)(ch-'0');
ch=prog[p++];
}
p--;
syn=11;
}
else
switch(ch)
{
case '+':syn=13;break;
case '-':syn=14;break;
case '*':syn=15;break;
case '/':syn=16;break;
case ':':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='=')
{
syn=18;
}
else
{
syn=17;
p--;
}
break;
case '<':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='>')
{
syn=21;
}
else if(ch=='=')
{
syn=22;
}
else
{
p--;
syn=20;
}
break;
case '>':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='=')
{
syn=24;
}
else
{
p--;
syn=23;
}
break;
case '=':syn=25;break;
case ';':syn=26;break;
case '(':syn=27;break;
case ')':syn=28;break;
case '#':syn=0;break;
default: syn=-1;error();break;
}
}
void lrparser()
{
if(syn==1)
{
scanner();
yucu();
{
if(syn==6)
{
scanner();
if(syn==0 && (f==0))
cout<<"success!"<<endl;
}
else
{
if(f!=1)
{
error();
f=1;
}
}
}
}
else
{
error();
f=1;
}
}
void yucu()
{
statement();
while(syn==26)
{
scanner();
statement();
}
}
void statement()
{
if(syn==10)
{
scanner();
if(syn==18)
{
scanner();
expression();
}
else
{
error();
f=1;
}
}
else
{
error();
f=1;
}
}
void expression()
{
term();
while(syn==13||syn==14)
{
scanner();
term();
}
}
void term()
{
factor();
if(syn==15||syn==16)
{
scanner();
factor();
}
}
void factor()
{
if(syn==10||syn==11)
scanner();
else if(syn==27)
{
scanner();
expression();
if(syn==28)
scanner();
else
{
error();
f=1;
}
}
else
{
error();
f=1;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -