Compiler construction 语义分析-插入函数

Compiler construction 语义分析-插入函数,compiler-construction,computer-science,theory,semantics,computation-theory,Compiler Construction,Computer Science,Theory,Semantics,Computation Theory,我需要重写下面的产品,以及它们的语义操作,必要时对它们进行重新排序,以便由递归预测分析器处理;实现funS()来处理这些产品。如果需要任何附加功能,则必须定义其签名。 属性语法和状态指定如下: Pgm = D “;” LS “.” { NTSent *LS = new NTSent(geraRot()); string cod = LS->cod + emiteRot(LS->prox) + geraCod(“ret”,”0”,””); list (cod); //

我需要重写下面的产品,以及它们的语义操作,必要时对它们进行重新排序,以便由递归预测分析器处理;实现funS()来处理这些产品。如果需要任何附加功能,则必须定义其签名。

属性语法和状态指定如下:

Pgm = D “;” LS “.” { NTSent *LS = new NTSent(geraRot()); 
 string cod = LS->cod + emiteRot(LS->prox)  
 + geraCod(“ret”,”0”,””);  
 list (cod); // emite o código gerado }
D = ... { // tratamento das declarações ... }
LS = LS1 “;” S { NTSent *LS1 = new NTSent(geraRot()),  
 *S = new NTSent(LS->prox);  
 LS->cod = LS1->cod + emiteRot(LS1->prox) + S->cod; }
LS = S { NTSent *S = LS; }
S = “se” Eb 
{ NTBool *Eb = new NTBool(geraRot(),S->prox);  
 “então” LS  
 NTSent *LS = new NTSent(S->prox); 
 “fim” 
 S->cod = Eb->cod + emiteRot(Eb->verd) + LS->cod; }
S = “se” Eb 
{ NTBool *Eb = new NTBool(geraRot(),geraRot()); 
 “então” LS1 
 NTSent *LS1 = new NTSent(S.prox), 
 “senão” LS2  
 *LS2 = new NTSent(S.prox);  
 “fim” 
 S->cod = Eb->cod + emiteRot(Eb->verd) + LS1->cod 
 + geraGT(S->prox) + emiteRot(Eb->falso) 
 + LS2->cod; }
S = “enquanto” Eb 
{ NTBool *Eb = new NTBool(geraRot(),S->prox); 
 “repita” LS 
 NTSent *LS = new NTSent(geraRot());  
 “fim” 
 S->cod = emiteRot(LS->prox) + Eb->cod  
 + emiteRot(Eb->verd) + LS->cod 
 + geraGT(LS->prox); }
S = Atr { NTerm *Atr = new NTerm 
 S->cod = Atr->cod; }
Atr = “id” “atr” 
{ NTBool *Eb = new NTBool(geraRot(),geraRot()); 
 Eb 
 Atr->nome = id.lex; 
 Atr->cod = Eb->cod + emiteRot(Eb->verd)  
 + emiteRot(Eb->falso)  
 + geraCod(“=”,Eb->nome,id.lex); }



Eb = Eb1 “ou” Tb { NTBool *Eb1 = new NTBool(Eb->verd,geraRot()),  *Tb = new NTBool(Eb->verd,geraRot()); 
 Eb->nome = geraTemp(); 
 Eb->cod = geraCod(“=”,”1”,Eb->nome) + Eb1->cod 
 + emiteRot(Eb1->falso) + Tb->cod 
 + geraGT(Eb->verd) + emiteRot(Tb->falso}  
 + geraCod(“=”,”0”,Eb->nome)  
 + geraGT(Eb->falso); } 
Eb = Tb { NTBool *Tb = Eb; }
Tb = Tb1 “e” Fb { NTBool *Tb1 = new NTBool(geraRot(),Tb->falso),  *Fb = new NTBool(geraRot(),Tb->falso);  
 Tb->nome = geraTemp(); 
 Tb->cod = geraCod(“=”,”0”,Tb->nome) + Tb1->cod 
 + emiteRot(Tb1->verd) + Fb->cod 
 + geraGT(Tb->falso) + emiteRot(Fb->verd}  
 + geraCod(“=”,”1”,Tb->nome) 
 + geraGT(Tb->verd); } 
Tb = Fb { NTBool *Fb = Tb; }
Fb = “não” Fb1 { NTBool *Fb1 = new NTBool(geraRot(),geraRot());   Fb->nome = geraTemp(); 
 Fb->cod = Fb1->cod + emiteRot(Fb1->falso)  
 + geraCod(“=”,”1”,Fb->nome) + geraGT(Fb->verd) 
 + emiteRot(Fb1->verd) 
 + geraCod(“=”,”0”,Fb->nome) 
 + geraGT(Fb->falso); }
Fb = Er { NTBool *Er = Fb; }
Er = Ea1 “opi” Ea2 { NTBool *Ea1 = new NTBool(Er->verd,Er->falso),  *Ea2 = new NTBool(Er->verd,Er->falso); 
 string verd = geraRot(); 
 Er->nome = geraTemp(); 
 Er->cod = Ea1->cod + Ea2->cod 
 + geraCod(opi.lex,Ea1->nome,Ea2->nome,verd) 
 + geraCod(“=”,”0”,Er->nome) + geraGT(Er->falso) 
 + emiteRot(verd) 
 + geraCod(“=”,”1”,Er->nome) 
 + geraGT(Er->verd); }
Er = Ea1 “opr” Ea2 { NTBool *Ea1 = new NTBool(Er->verd,Er->falso),  *Ea2 = new NTBool(Er->verd,Er->falso); 
 string verd = geraRot(); 
 Er->nome = geraTemp(); 
 Er->cod = Ea1->cod + Ea2->cod 
 + geraCod(opr.lex,Ea1->nome,Ea2->nome,verd) 
 + geraCod(“=”,”0”,Er->nome) + geraGT(Er->falso) 
 + emiteRot(verd) 
 + geraCod(“=”,”1”,Er->nome) 
 + geraGT(Er->verd); }
Er = Ea { NTBool *Ea = Er; }
Ea = Ea1 “opa” Ta { NTBool *Ea1 = new NTBool(Ea->verd,Ea->falso),  *Ta = new NTBool(Ea->verd,Ea->falso); 
 Ea->nome = geraTemp(); 
 Ea->cod = Ea1->cod + Ta->cod 
 + geraCod(opa.lex,Ea1->nome,Ta->nome,Ea- 
>nome); }
Ea = Ta { NTBool *Ta = Ea; }



Ta = Ta1 “opm” Fa { NTBool *Ta1 = new NTBool(Ta->verd,Ta->falso),  *Fa = new NTBool(Ta->verd,Ta->falso); 
 Ta->nome = geraTemp(); 
 Ta->cod = Ta1->cod + Fa->cod  
 + geraCod(opm.lex,Ta1->nome,Fa->nome,Ta->nome); }
Ta = Fa { NTBool *Fa = Ta; }
Fa = “(“ Eb “)” { NTBool *Eb = Fa; }
Fa = “opa” Fa1 { NTBool *Fa1 = new NTBool(Fa->verd,Fa->falso);  Fa->nome = geraTemp(); 
 Fa->cod = geraCod(opa.lex+”u”,Fa1->nome,Fa->nome); } 
Fa = “verd” { Fa->nome = geraTemp(); 
 Fa->cod = geraCod(“=”,”1”,Fa->nome) 
 + geraGT(Fa->verd); }
Fa = “falso” { Fa->nome = geraTemp(); 
 Fa->cod = geraCod(“=”,”0”,Fa->nome) 
 + geraGT(Fa->falso); }
Fa = “id” { Fa->nome = id.lex; Fa->cod = “”; }
Fa = “cteI” { Fa->nome = adTCteI(cteI.lex); Fa->cod = “”; }
Fa = “cteF” { Fa->nome = adTCteF(cteF.lex); Fa.cod = “”; }
有人能帮我吗?我试过了,但我不知道这是否正确:

S = “se” Eb “entao” LS Sr
Sr = “fim”
Sr = “senao” LS “fim”

S = “se” {NTBool *Eb = new NTBoll(geraRot(),geraRot())}
Eb “entao” {NTSent *LS = new NTSent(S-> prox)} 
LS {NTSent *Sr = new NTSent(geraRot())} Sr
{Sr.prox = S.prox; Sr.false = Eb.falso;}
{S -> cod = Eb -> cod + emiteRot(Eb -> verd) + LS -> cod + geraGT(S -> prox) + Sr -> cod;}
Sr = “senao” {NTSent *LS = new NTSent(Sr -> prox)} LS “fim” {Sr -> cod = emiteRot(Sr -> false) + LS -> cod;}
Sr = “fim” { Sr -> cod = emiteRot(Sr.false);}

S = “enquanto” Eb 
“repita” LS 
“fim” 

S = “enquanto” { NTBool *Eb = new NTBoll(geraRot(),S -> prox);}
Eb “repita” {NTSent *LS = new NTSent(S-> prox);} LS 
“fim” {S -> cod = emiteRot(LS -> prox) + Eb -> cod 
geraCodRot(Eb ->verd)+LS -> cod 
+ geraCodGT(LS -> prox);} 

Atr = “id” “atr”
Eb
{ NTBool *Eb = new NTBool(geraRot(),geraRot());
Atr->nome = id.lex;
Atr->cod = Eb->cod + emiteRot(Eb->verd)
+ emiteRot(Eb->falso)
+ geraCod(“=”,Eb->nome,id.lex); }