📄 compiler.cpp
字号:
vn_stack[vn_stack_top-1].t_val, t_num,false );
B->head = vn_stack[vn_stack_top-1].head ;
vn_stack[vn_stack_top-1].tail->next = f1 ;
B->tail = f1 ;
pop_vn( 1);
}
}
else{
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("|", vn_stack[vn_stack_top-2].t_val,
vn_stack[vn_stack_top-1].ch, t_num,false );
B->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = f1 ;
B->tail = f1 ;
}
else{
f1->join("|", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].t_val, t_num,false );
B->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = vn_stack[vn_stack_top-1].head;
vn_stack[vn_stack_top-1].tail->next = f1 ;
B->tail = f1 ;
}
}
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2);
push_vn( vn_stack , B );
break;
}
case 10 ://B->i>i
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
f1->join(">",word[j-3].name,word[j-1].name, t_num,false);
B->head = f1 ;
B->tail = f1 ;
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
push_vn( vn_stack , B );
break;
}
case 11 ://B->i<i
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
f1->join("<",word[j-3].name,word[j-1].name, t_num,false);
B->head = f1 ;
B->tail = f1 ;
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
push_vn( vn_stack , B );
break;
}
case 12 ://B->i=i
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
f1->join("=",word[j-3].name,word[j-1].name, t_num,false);
B->head = f1 ;
B->tail = f1 ;
B->t_val = t_num ;
B->isTmp = true ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
push_vn( vn_stack , B );
break;
}
case 13 ://true
{
Vn * B = new Vn;//生成新的终极符结点
B->head = NULL ;
B->tail = NULL ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
B->ch = word[j-1].name ;
B->isTmp = false ;
push_vn( vn_stack , B);
break;
}
case 14 ://B->false
{
t_num++ ;
Vn * B = new Vn;//生成新的终极符结点
B->head = NULL ;
B->tail = NULL ;
fourexpHead = B->head ;//链成用fourexpHead传回到主函数中。
B->ch = word[j-1].name ;
B->isTmp = false ;
push_vn( vn_stack , B);
break;
}
case 15 ://E->E+E
{
t_num++ ;
Vn * E = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
if( vn_stack[vn_stack_top-2].isTmp == false ){
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("+",vn_stack[vn_stack_top-2].ch ,
vn_stack[vn_stack_top-1].ch , t_num, false);
E->head = f1 ;
E->tail = f1 ;
}
else{
f1->join("+",vn_stack[vn_stack_top-2].ch ,
vn_stack[vn_stack_top-1].t_val, t_num,false );
E->head = vn_stack[vn_stack_top-1].head ;
vn_stack[vn_stack_top-1].tail->next = f1 ;
E->tail = f1 ;
}
}
else{
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("+", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].ch , t_num , false);
E->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = f1 ;
E->tail = f1 ;
}
else{
f1->join("+", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].t_val, t_num , false);
E->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = vn_stack[vn_stack_top-1].head;
vn_stack[vn_stack_top-1].tail->next = f1 ;
E->tail = f1 ;
}
}
E->t_val = t_num ;
E->isTmp = true ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2);
push_vn( vn_stack , E );
break;
}
case 16 ://E->E*E
{
t_num++ ;
Vn * E = new Vn;//生成新的终极符结点
fourexp * f1 = new fourexp;
f1->next = NULL ;
if( vn_stack[vn_stack_top-2].isTmp == false ){
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("*",vn_stack[vn_stack_top-2].ch ,
vn_stack[vn_stack_top-1].ch , t_num , false);
E->head = f1 ;
E->tail = f1 ;
}
else{
f1->join("*",vn_stack[vn_stack_top-2].ch ,
vn_stack[vn_stack_top-1].t_val, t_num,false );
E->head = vn_stack[vn_stack_top-1].head ;
vn_stack[vn_stack_top-1].tail->next = f1 ;
E->tail = f1 ;
}
}
else{
if( vn_stack[vn_stack_top-1].isTmp == false ){
f1->join("*", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].ch , t_num , false);
E->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = f1 ;
E->tail = f1 ;
}
else{
f1->join("*", vn_stack[vn_stack_top-2].t_val ,
vn_stack[vn_stack_top-1].t_val , t_num, false);
E->head = vn_stack[vn_stack_top-2].head ;
vn_stack[vn_stack_top-2].tail->next = vn_stack[vn_stack_top-1].head;
vn_stack[vn_stack_top-1].tail->next = f1 ;
E->tail = f1 ;
}
}
E->t_val = t_num ;
E->isTmp = true ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
pop_vn( 2);
push_vn( vn_stack , E );
break;
}
case 17 ://E->(E)
{
Vn * E = new Vn;//生成新的终极符结点
E->head = vn_stack[vn_stack_top-1].head ;
E->tail = vn_stack[vn_stack_top-1].tail ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
E->isTmp = true ;
E->t_val = vn_stack[vn_stack_top-1].t_val ;
pop_vn( 1);
push_vn( vn_stack , E );
break;
}
case 18 ://E->i
{
Vn * E = new Vn;//生成新的终极符结点
E->head = NULL ;
E->tail = NULL ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
E->ch = word[j-1].name ;
E->isTmp = false ;
push_vn( vn_stack , E );
break;
}
case 19 ://E->n
Vn * E = new Vn;//生成新的终极符结点
E->head = NULL ;
E->tail = NULL ;
fourexpHead = E->head ;//链成用fourexpHead传回到主函数中。
E->ch = word[j-1].name ;
E->isTmp = false ;
push_vn( vn_stack , E );
break;
}
}
else {
error1();
}
// i = table[i][word[j].id];
}while(!isEmpty(_stack));
}//syntax语法分析
int main(int argc, char* argv[])
{
int length=10;//文件名不能太长,要小于10个字符
char *strbuf;
int i;
fourexpHead=NULL;
// char * filename;
FILE* p;
// if(argc ==2 )
// {
// length = strlen(argv[1]);
// filename = new char[length+1];
// strcpy(filename,argv[1]);
// filename[length] = '\0';
sourceFile = fopen("c1.txt","r");//
if(sourceFile == NULL)
{
cout<<"打开文件失败"<<endl;
return -1;
}
p = sourceFile;
strbuf = new char[BUFLINE*5];
for(i=0;i<BUFLINE*5;i++) strbuf[i] = 0;
i = 0;
while(!feof(p)){
strbuf[i]=(char)fgetc(p);
i++;
}
strbuf[i-1] = '\0';
//fclose(p);
lex(strbuf);//词法分析
syntax();//语法分析
add_fourexp();
fourexp *q = fourexpHead;
while( q ){
q->Display();
q = q->next;
}
getchar();
// }//if
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -