#include<stdio.h>
#include <iostream>
#include<string.h>
using
namespace
std;
char
*reserved[6] = {
"begin"
,
"if"
,
"then"
,
"while"
,
"do"
,
"end"
};
char
input[80],output[8];
char
ch;
int
syn,p,i;
//syn为种别码,p为扫描与添加
int
m = 0,n,row,sum = 0,count=0;
int
flag = 0;
//标志位
void
ParseS();
//解析语句
void
ParseS1();
void
ParseS2();
void
ParseS3();
void
ParseS4();
void
ParseC();
//解析条件
void
ParseE();
//解析表达式
void
ParseE1();
void
ParseT();
//解析项
void
ParseT1();
void
ParseF();
//解析因子
void
scanner(){
for
( i = 0 ; i < 8 ; i++ ){
output[i] = NULL;
}
//初始化输出
ch = input[p++];
while
( ch ==
' '
){
ch = input[p] ;
p ++ ;
}
//持续读入
if
( ( ch >=
'a'
&& ch <=
'z'
) || ( ch >=
'A'
&& ch <=
'Z'
) ){
m = 0 ;
while
( ( ch >=
'a'
&& ch <=
'z'
) || ( ch >=
'A'
&& ch <=
'Z'
) || ( ch >=
'0'
&& ch <=
'9'
) ){
output[m++] = ch ;
ch = input[p++];
}
output[m++] =
'\0'
;
p -- ;
syn = 10 ;
for
( n = 0 ; n < 6 ; n ++ ){
if
( strcmp(output,reserved[n]) == 0 ){
syn = n + 1;
break
;
}
}
}
else
if
( ( ch >=
'0'
&& ch <=
'9'
) ){
sum = 0 ;
while
( ch >=
'0'
&& ch <=
'9'
){
sum=sum*10+ch-
'0'
;
ch = input[p++] ;
}
p -- ;
syn = 11;
}
else
if
(ch ==
'/'
){
ch = input[p++] ;
if
(ch ==
'/'
){
while
(ch !=
'\n'
){
ch = input[p++] ;
}
scanner();
}
else
if
(ch ==
'*'
){
ch = input[p++];
int
flag=0;
// printf("%c %c",ch,input[p]);
while
((ch ==
'*'
&& input[p] !=
'/'
)||(ch !=
'*'
&& input[p] ==
'/'
) || (ch !=
'*'
&& input[p] !=
'/'
)){
ch = input[p++] ;
if
(p==count-2 && (ch !=
'*'
&& input[p] !=
'/'
)){
flag =1;
syn = 100;
break
;
}
}
p++;
if
(flag==0){
scanner();
}
}
else
{
p = p - 2 ;
ch = input[p++] ;
output[0] = ch ;
syn = 16 ;
}
}
else
switch
(ch){
case
'+'
:
output[0] = ch ;
syn = 13;
break
;
case
'-'
:
output[0] = ch ;
syn = 14;
break
;
case
'*'
:
output[0] = ch ;
syn = 15 ;
break
;
case
'/'
:
output[0] = ch ;
syn = 16 ;
break
;
case
':'
:
i = 0;
output[i++] = ch ;
ch = input[p++];
if
( ch ==
'='
){
output[i++] = ch;
syn = 18 ;
}
else
{
syn = 17;
p-- ;
}
break
;
case
'<'
:
i = 0 ;
output[i++] = ch ;
ch = input[p++] ;
if
( ch ==
'='
){
output[i++] = ch ;
syn = 21 ;
}
else
if
( ch ==
'>'
){
output[i++] = ch ;
syn = 22 ;
}
else
{
syn = 20 ;
p-- ;
}
break
;
case
'>'
:
i = 0;
output[i++] = ch ;
ch = input[p++] ;
if
( ch ==
'='
){
output[i++] = ch;
syn=24;
}
else
{
syn=23;
p--;
}
break
;
case
'='
:
output[0] = ch ;
syn = 25 ;
break
;
case
';'
:
output[0] = ch ;
syn = 26 ;
break
;
case
'('
:
output[0] = ch ;
syn = 27 ;
break
;
case
')'
:
output[0] = ch ;
syn = 28 ;
break
;
case
'#'
:
output[0] = ch ;
syn = 0;
break
;
case
'\n'
:
syn = 99 ;
break
;
default
:
syn = -1 ;
break
;
}
}
void
ParseS(){
if
(flag != 0){
if
(syn == 10){
//<id>:=<表达式>
scanner();
ParseS1();
}
else
if
(syn == 2){
//if
scanner();
ParseS2();
}
else
if
(syn == 4){
//while
scanner();
ParseS3();
}
else
if
(syn == 0){
}
else
{
printf(
"statement syntx error S\n"
);
exit(0);
}
}
else
{
if
(syn == 1){
//begin
scanner();
flag = 1;
ParseS4();
}
else
{
printf(
"error,缺少begin!\n"
);
exit(0);
}
}
}
void
ParseS1(){
if
(syn==18){
scanner();
ParseE();
}
else
{
printf(
"statement syntx error S1\n"
);
exit(0);
}
}
void
ParseS2(){
//if
ParseC();
if
(syn== 3 ){
scanner();
ParseS();
}
else
{
printf(
"statement syntx error S2\n"
);
exit(0);
}
}
void
ParseS3(){
//while
ParseC();
if
(syn== 5 ){
scanner();
ParseS();
}
else
{
printf(
"statement syntx error S3 \n"
);
exit(0);
}
}
void
ParseS4(){
//begin
ParseS();
while
(syn == 26){
scanner();
ParseS();
}
if
(syn == 6){
scanner();
if
(syn == 0){
printf(
"success!"
);
}
else
{
printf(
"statement syntx error S4\n"
);
}
}
else
{
printf(
"error,缺少end\n"
);
exit(0);
}
}
void
ParseC(){
ParseE();
if
(syn==25||syn==0||syn==20||syn==21||syn==23||syn==24){
scanner();
scanner();
}
else
{
printf(
"condition syntx error C\n"
);
exit(0);
}
ParseE();
}
void
ParseE(){
ParseT();
ParseE1();
}
void
ParseE1(){
if
(syn == 13 || syn == 14){
scanner();
ParseT();
ParseE1();
}
else
if
(syn == 28 || syn == 0){
}
}
void
ParseT(){
ParseF();
ParseT1();
}
void
ParseT1(){
if
(syn == 15 || syn == 16){
scanner();
ParseF();
ParseT1();
}
else
if
(syn == 13 ||syn == 14 || syn == 28 || syn == 0){
}
}
void
ParseF(){
if
(syn == 27){
scanner();
ParseE();
if
(syn == 28){
scanner();
}
else
{
printf(
"factor syntx error F\n"
);
exit(0);
}
}
else
if
(syn == 10 || syn == 11){
scanner();
}
else
{
printf(
"factor syntx error F\n"
);
exit(0);
}
}
int
main() {
p = 0;
printf(
"请输入源程序:"
);
do
{
ch = getchar();
input[p++] = ch;
}
while
(ch !=
'#'
);
count = p;
p = 0;
scanner();
ParseS();
return
0;
}