编译原理实验—语法分析器
一、算术表达式文法
VN = { E, T, E’, F, T’ }
其中:E为开始符号;
VT = { +, -, , /, (, ), id, num }
其中:id代表标识符,要求是长度不超过10的字母序列;num代表常数,要求是正整数;
文法规则集如下:
E→TE’
E’→+TE’| -TE’ |ε
T→FT’
T’→FT’| /FT’ |ε
F→(E) | id | num
二、文法中每个非终结符的First集和Follow集
三、由产生式F→(E) | id | num构造的递归下降分解程序示例:
PROCEDURE F
IF SYM=`id` THEN ADVANCE
ELSE
IF SYM=`num` THEN ADVANCE
ELSE
IF SYM=`(` THEN
BEGIN
ADVANCE;
E
IF SYM=`)` THEN ADVANCE
ELSE ERROR
END
ELSE ERROR
其中,SYM代表输入串指针所指的符号;ADVANCE代表把输入指针调至下一输入符号。
四、程序代码
#include<iostream>
#include<stdio.h>
#include <cctype>
#include <string.h>
#include <iomanip>
#include<cstdlib>
using namespace std;
char a[100];
string b[100];
static int j=0;
static int p=0;
void E();
void E1();
void T();
void T1();
void F();
bool isnum();
bool isid();
void error();
int main()
{
int k=0;
char c;
c = getchar();
while (c != '\n')
{
a[k]=c;
k++;
c = getchar();
}
for(int i=0; i<=k; i++) //开始进行数组a[]内字符识别
{
switch(a[i])
{
case ' ':
break;
case '\n':
break;
case '\t':
break;
case '+':
{
b[j]+=a[i];
j++;
};
break;
case '-':
{
b[j]+=a[i];
j++;
};
break;
case '*':
{
b[j]+=a[i];
j++;
};
break;
case '/':
{
b[j]+=a[i];
j++;
};
break;
case '(': //识别符号(
{
b[j]=a[i];
j++;
} ;
break;
case ')': //识别符号)
{
b[j]=a[i];
j++;
} ;
break;
default:
{
if(a[i]>='a'&&a[i]<='z')//识别标识符
{
b[j]+=a[i];
if(a[i+1]<'a'||a[i+1]>'z')
{
j++;
}
}
if(a[i]>='0'&&a[i]<='9')//识别整数
{
b[j]+=a[i];
if(a[i+1]<'0'||a[i+1]>'9')
{
j++;
}
}
};
break;
}
}
for(int i=0;i<j;i++)
{
cout<<b[i];
}
E();
if(p==j)
{
cout<<"编译通过!"<<endl;
}else
{
cout<<"编译错误!"<<endl;
}
return 0;
}
bool isnum(string s)
{
int len = s.length();
for(int i=0; i<len; i++)
{
if(!isdigit(s[i]))
{
return false;
}
}
return true;
}
bool isid(string s)
{
int len = s.length();
for(int i=0; i<len; i++)
{
if(!isalpha(s[i]))
{
return false;
}
}
return true;
}
void error()
{
cout<<"错误!"<<endl;
exit(0);
}
void E()
{
T();
E1();
}
void E1()
{
if(b[p]=="+")
{
p++;
T();
E1();
}
else if(b[p]=="-")
{
p++;
T();
E1();
}
}
void T()
{
F();
T1();
}
void T1()
{
if(b[p]=="*")
{
p++;
F();
T1();
}
else if(b[p]=="/")
{
p++;
F();
T1();
}
}
void F()
{
if(isid(b[p]))
{
p++;
}
else if(isnum(b[p]))
{
p++;
}
else
{
if(b[p]=="(")
{
p++;
E();
if(b[p]==")")
{
p++;
}
else
{
error();
}
}
else
{
error();
}
}
}
五、运行结果
来源:CSDN
作者:winter_tree
链接:https://blog.csdn.net/winter_tree/article/details/103734197