Compiler construction 语义分析-插入函数
我需要重写下面的产品,以及它们的语义操作,必要时对它们进行重新排序,以便由递归预测分析器处理;实现funS()来处理这些产品。如果需要任何附加功能,则必须定义其签名。 属性语法和状态指定如下: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); //
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); }