版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bmicnj/article/details/78904932
一、词法分析
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char *rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m;//下标
void scanner(){
//整数,字符(串),其他
for(int i=0; i<16; i++) {
token[i]=NULL;
}
ch=program[p++];
while(ch==' '){
ch=program[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')){
token[m++]=ch;
ch=program[p++];
}
token[m++]='\0';
p--;
syn=10;
for(int i=0; i<6; i++) {
if(strcmp(token, rwtab[i])==0) {
syn=i+1;
break;
}
}
}
else if(ch>='0' && ch<='9') {
sum=0;
while(ch>='0' && ch<='9') {
sum=sum*10+ch-'0';
ch=program[p++];
}
p--;
syn=11;
if(sum>65536)
syn=-1;
}
else switch(ch) {
case '+':syn=13; token[0]='+'; break;
case '-':syn=14; token[0]='-';break;
case '*':syn=15; token[0]='*'; break;
case '/':syn=16; token[0]='/'; break;
case ':':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='=') {
token[m++]=ch;
syn=18;
}
else {
syn=17;
p--;
}
break;
case '<':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='>') {
token[m++]=ch;
syn=21;
}
else if(ch=='=') {
token[m++]=ch;
syn=22;
}
else {
syn=20;
p--;
}
break;
case '>':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='=') {
token[m++]=ch;
syn=24;
}
else {
syn=23;
p--;
}
break;
case '=':syn=25; token[0]=ch;break;
case ';':syn=26; token[0]=ch;break;
case '(':syn=27; token[0]=ch;break;
case ')':syn=28; token[0]=ch;break;
case '#':syn=0; token[0]=ch;break;
default: syn=-1;break;
}
}
int main()
{
p=0;
printf("please input string:\n");
do{
ch=cin.get();
program[p++]=ch;
}while(ch!='#');
p=0;
do {
scanner();
switch(syn) {
case 11:cout<<"<"<<syn<<","<<sum<<">"<<endl; break;
case -1:cout<<"Error"<<endl; break;
default:cout<<"<"<<syn<<","<<token<<">"<<endl; break;
}
}while(syn!=0);
return 0;
}
二、语法分析
#include <iostream>
#include <cstdio>
#include <cstring>
#include <String>
using namespace std;
int sign=1;
string rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m;//下标
int kk;//出错处理标记
void scanner();
void factor();
void term();
void expression();
void statement();
void statementString();
void irparser();
void scanner(){
//整数,字符(串),其他
char token[16];
ch=program[p++];
while(ch==' '){
ch=program[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')){
token[m++]=ch;
ch=program[p++];
}
token[m++]='\0';
p--;
syn=10;
for(int i=0; i<6; i++) {
if((string(token)==rwtab[i])) {
syn=i+1;
break;
}
}
}
else if(ch>='0' && ch<='9') {
sum=0;
while(ch>='0' && ch<='9') {
sum=sum*10+ch-'0';
ch=program[p++];
}
p--;
syn=11;
if(sum>65536)
syn=-1;
}
else switch(ch) {
case '+':syn=13; token[0]='+'; break;
case '-':syn=14; token[0]='-';break;
case '*':syn=15; token[0]='*'; break;
case '/':syn=16; token[0]='/'; break;
case ':':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='=') {
token[m++]=ch;
syn=18;
}
else {
syn=17;
p--;
}
break;
case '<':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='>') {
token[m++]=ch;
syn=21;
}
else if(ch=='=') {
token[m++]=ch;
syn=22;
}
else {
syn=20;
p--;
}
break;
case '>':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='=') {
token[m++]=ch;
syn=24;
}
else {
syn=23;
p--;
}
break;
case '=':syn=25; token[0]=ch;break;
case ';':syn=26; token[0]=ch;break;
case '(':syn=27; token[0]=ch;break;
case ')':syn=28; token[0]=ch;break;
case '#':syn=0; token[0]=ch;break;
default: syn=-1;break;
}
}
void factor() { //因子
if(syn==10) {//::调用,继续扫描
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
}
else if(syn==11) {//::调用,继续扫描
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
}
else if(syn==27) {
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
expression();
if(syn==28) {//::调用,继续扫描
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
}
else {
cout<<"error:没有匹配的')' !"<<endl;
kk=1;
}
}
else {
cout<<"error:不是factor !"<<endl;
kk=1;
}
return ;
}
void term() { //项
factor();
while(syn==15 || syn==16) { //*、/
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
factor();
}
return ;//::出错处理
}
void expression() { //表达式
term();
while(syn==13 || syn==14) {//+、-
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
term();
}
return ;//::出错处理
}
void statement() { //语句,赋值语句
if(syn==10) { //标识符
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
if(syn==18) { //:=
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
expression();
}
else {
cout<<"error:不是赋值语句 !"<<endl;
kk=1;
}
}
else {
cout<<"error:不是语句 !"<<endl;
kk=1;
}
return ;
}
void statementString() { //语句串
statement();
while(syn==26) { //;
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
statement();
}
return ;//::出错处理
}
void irparser() { //程序
if(syn==1) { //begin
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
statementString();
if(syn==6) { //end
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
if(syn==0&&kk==0) {
cout<<"success !"<<endl;
}
/*
else { //一定会有#标志,否则输入不会结束
cout<<"没有结束标志 !"<<endl;
kk=1;
}*/
}
else {
if(kk==0){
cout<<"error:没有end !"<<endl;
kk=1;
}
}
}
else {
cout<<"error:没有begin !"<<endl;
kk=1;
}
return ;
}
int main()
{
p=0;
kk=0;
printf("please input string:\n");
do{
ch=cin.get();
program[p++]=ch;
}while(ch!='#');
p=0;
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
irparser();
return 0;
}
三、语义分析
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <String>
#include <malloc.h>
using namespace std;
string rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m,q;//下标
int kk;//出错处理标记
struct {
char result1[8];
char ag11[8];
char op1[8];
char ag21[8];
}quad[20];
char *newtemp();//新形式
void emit(string result, string ag1, string op, string ag2);
void irparser();
int statementString();
int statement();
char *expression();
char *term();
char *factor();
void scanner();
char *newtemp() {
char *p;
char m[8];
p=(char *)malloc(8);
kk++;
itoa(kk,m,10);
strcpy(p+1,m);
p[0]='t';
return (p);
}
//结果 值一 运算符 值二
void emit(char *result, char *ag1, char *op, char *ag2) {
strcpy(quad[q].result1,result);
strcpy(quad[q].ag11,ag1);
strcpy(quad[q].op1,op);
strcpy(quad[q].ag21,ag2);
q++;
return ;
}
void scanner(){
//整数,字符(串),其他
char token[16];
ch=program[p++];
while(ch==' '){
ch=program[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')){
token[m++]=ch;
ch=program[p++];
}
token[m++]='\0';
p--;
syn=10;
for(int i=0; i<6; i++) {
if((string(token)==rwtab[i])) {
syn=i+1;
break;
}
}
}
else if(ch>='0' && ch<='9') {
sum=0;
while(ch>='0' && ch<='9') {
sum=sum*10+ch-'0';
ch=program[p++];
}
p--;
syn=11;
if(sum>65536)
syn=-1;
}
else switch(ch) {
case '+':syn=13; token[0]='+'; break;
case '-':syn=14; token[0]='-';break;
case '*':syn=15; token[0]='*'; break;
case '/':syn=16; token[0]='/'; break;
case ':':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='=') {
token[m++]=ch;
syn=18;
}
else {
syn=17;
p--;
}
break;
case '<':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='>') {
token[m++]=ch;
syn=21;
}
else if(ch=='=') {
token[m++]=ch;
syn=22;
}
else {
syn=20;
p--;
}
break;
case '>':m=0; token[m++]=ch;
ch=program[p++];
if(ch=='=') {
token[m++]=ch;
syn=24;
}
else {
syn=23;
p--;
}
break;
case '=':syn=25; token[0]=ch;break;
case ';':syn=26; token[0]=ch;break;
case '(':syn=27; token[0]=ch;break;
case ')':syn=28; token[0]=ch;break;
case '#':syn=0; token[0]=ch;break;
default: syn=-1;break;
}
}
char *factor() { //因子
char *fplace;
fplace=(char *)malloc(12);
if(syn==10) {// '*' 调用,继续扫描
strcpy(fplace,token);
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
}
else if(syn==11) {// '/' 调用,继续扫描
itoa(sum,fplace,10);
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
}
else if(syn==27) {
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
fplace=expression();
if(syn==28) {//::调用,继续扫描
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
}
else {
cout<<"error:没有匹配的')' !"<<endl;
kk=1;
exit(0);
}
}
else {
cout<<"error:不是factor !"<<endl;
kk=1;
exit(0);
}
return (fplace);
}
char *term() { //项
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);
strcpy(eplace,factor());
while((syn==15) || (syn==16)) { //*、/
if(syn==15) strcpy(tt,"*");
else strcpy(tt,"/");
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
strcpy(ep2,factor());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);//
strcpy(eplace,tp);
}
return (eplace);
}
char *expression() { //表达式
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);
strcpy(eplace,term());
while((syn==13) || (syn==14)) {//+、-
if(syn==13) strcpy(tt,"+");
else strcpy(tt,"-");
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
int statement() { //语句,赋值语句
char tt[8],eplace[8];
int schain=0;
if(syn==10) { //标识符
strcpy(tt,token);
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
if(syn==18) { //:=
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
strcpy(eplace,expression());
emit(tt,eplace,"","");
schain=0;
}
else {
cout<<"error:不是赋值语句 !"<<endl;
kk=1;
exit(0);
}
}
else {
cout<<"error:不是语句 !"<<endl;
kk=1;
}
return (schain);
}
int statementString() { //语句串
int schain=0;
schain=statement();
while(syn==26) { //;
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
schain=statement();
}
return (schain);
}
void irparser() { //程序
int schain=0;
kk=0;
if(syn==1) { //begin
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl
schain=statementString();
if(syn==6) { //end
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
if((syn==0)&&(kk==0)) {
cout<<"success !"<<endl;
}
/*
else { //一定会有#标志,否则输入不会结束
cout<<"没有结束标志 !"<<endl;
kk=1;
}*/
}
else {
if(kk==0)
cout<<"error:没有end !"<<endl;
kk=1;
exit(0);
}
}
else {
cout<<"error:没有begin !"<<endl;
kk=1;
exit(0);
}
// return (schain);
}
int main()
{
p=0;
kk=0;
q=0;
printf("please input string:\n");
do{
ch=cin.get();
program[p++]=ch;
}while(ch!='#');
p=0;
scanner();
//cout<<sign++<<"==syn=="<<syn<<endl;
irparser();
printf("result\tval1\top\tval2\n");
for(int i=0; i<q; i++) { //输出三地址代码
cout<<quad[i].result1<<"\t"<<quad[i].ag11<<"\t"<<quad[i].op1<<"\t"<<quad[i].ag21<<endl;
}
return 0;
}