所有的源码都放GitHub了:https://github.com/yuyi5453/Compilation-principle
成品图:
源码
#include<bits/stdc++.h>
#include"DSJ_词法分析.h"
using namespace std;
const int max_len=11;
char token[20],token1[40];
char yufa_in[300];//词法分析文件名
char yufa_out[300];
char tree_map[100][1000];
FILE *fin,*fout;
set<string>se;
struct node{
string st;
vector<node*>son;
int cnt;
node* addSon(string s){
node* Son=new node();
Son->st=s;
son.push_back(Son);
return Son;
}
} *Root;
int program();
int declaration_list(node* fa);
int declaration_stat(node* fa);
int statement_list(node* fa);
int statement(node* fa);
int if_stat(node* fa);
int while_stat(node* fa);
int for_stat(node* fa);
int read_stat(node* fa);
int write_stat(node* fa);
int compound_stat(node* fa);
int expression_stat(node* fa);
int expression(node* fa);
int bool_expr(node* fa);
int additive_expr(node* fa);
int term(node* fa);
int factor(node* fa);
int fun_declaration(node* fa);//
int fun_body(node* fa);//
int main_declaration(node* fa);//
int call_stat(node* fa);//
void out(node* p){
p->addSon(token1);
}
void shift(int x){
for(int i=0;i<x;i++) fprintf(fout," ");
}
void draw_line(int x,int y1,int y2){
for(int i=y1+1;i<y2;i++) tree_map[x][i]='-';
}
void string_out(int x,int y,string s){
int l=y-5;
int len=s.length();
int space=(max_len-len)/2;
for(int i=0;i<space;i++) tree_map[x][l++]=' ';
for(int i=0;i<len;i++)
tree_map[x][l++]=s[i];
for(int i=0;i<max_len-len-space;i++) tree_map[x][l++]=' ';
}
void tree_out(int x,int y,node* p){
string_out(x,y,p->st);
int num=p->son.size();//子树个数
if(num==0) return ;
tree_map[x+1][y]='|';
int len=p->cnt;//子树宽度
int pos[num];//子树位置
pos[0]=y-len*11/2+p->son[0]->cnt*11/2;
for(int i=1;i<num;i++){
pos[i]=pos[i-1]+(p->son[i-1]->cnt+p->son[i]->cnt)/2*11+1;
}
draw_line(x+2,pos[0],pos[num-1]);
for(int i=0;i<num;i++){
tree_map[x+3][pos[i]]='|';
tree_out(x+4,pos[i],p->son[i]);
}
return ;
}
int tree_cnt(node *p){
int nc=p->son.size();
if(nc==0){
p->cnt=1;
return 1;
}
int sum=0;
for(int i=0;i<nc;i++){
sum+=tree_cnt(p->son[i]);
}
p->cnt=sum;
return sum;
}
void print_tree(){
for(int i=0;i<100;i++){
for(int j=0;j<1000;j++){
if(tree_map==0) fprintf(fout," ");
else fprintf(fout,"%c",tree_map[i][j]);
}
fprintf(fout,"\n");
}
}
//void print_tree(){
// for(int i=0;i<100;i++){
// for(int j=0;j<1000;j++){
// if(tree_map==0) printf(" ");
// else printf("%c",tree_map[i][j]);
// }
// printf("\n");
// }
//}
int TESTpar