Yacc FOR-Schleife die nächste bitte ...

27/12/2009 - 20:06 von Jens Kallup | Report spam
Hallo,

folgender Code, der automatisch erzeugt wurde,
führt zu doppelten Vorkommen von Labels.
siehe Le_2, ...


fld qword [ LC3]
fstp qword [Lc_var3]
LL2:
fld qword [Lc_var3]
fld qword [ LC4]
fucompp
fnstsw ax
sahf
ja near Le_2
jmp near Le_1
Le_2:
push dword LCS6
call _cat_string
add esp, 4
call _print_string
call _null_string
fld qword [ LC7]
fstp qword [Lc_var4]
LL3:
fld qword [Lc_var4]
fld qword [ LC8]
fucompp
fnstsw ax
sahf
ja near Le_3
jmp near Le_2
Le_3:
push dword LCS10
call _cat_string
add esp, 4
call _print_string
call _null_string
fld qword [Lc_var4]
fld1
faddp st1, st0
fstp qword {Lc_var4]
jmp near LL3
Le_2:
fld qword [Lc_var3]
fld1
faddp st1, st0
fstp qword {Lc_var3]
jmp near LL4
Le_3:




den Code, mit der dieser Code erzeugt wurde schaut
wie folgt aus:


type
lbl = record
value: Extended; // eigentlich nicht verwendet, für Interpreter
yytoken: AnsiString; // letztes 'ident_str' token symbol

//
// zustàndig für IF ELSE ENDIF parsing.
//
else_label: Integer;
end_label : Integer;

strvalstring: AnsiString;
var_type : integer; // was ist der Typ?

print_time: Boolean;
call_handle: Boolean;
end;

StatementSequence
:
| statement StatementSequence
;

forstmt
: TOK_FOR ident {
new_label := new_label + 1;
$<lbl>1.end_label := new_label;
text_code.Add('Lc_'+$<lbl>2.yytoken+': dq 0.0');
} '=' expr {
data_code.Add(#9+'fstp qword [Lc_' + $<lbl>2.yytoken + ']');
data_code.Add('LL'+IntToStr($<lbl>1.end_label+1)+':');
data_code.Add(#9+'fld qword [Lc_'+$<lbl>2.yytoken + ']');
} TOK_TO expr {

data_code.Add(#9+'fucompp');
data_code.Add(#9+'fnstsw ax');
data_code.Add(#9+'sahf');

data_code.Add(#9+'ja near Le_' + IntToStr($<lbl>1.end_label+1));
data_code.Add(#9+'jmp near Le_' + IntToStr($<lbl>1.end_label));
data_code.Add('Le_' + IntToStr($<lbl>1.end_label+1)+':');

} StatementSequence {
//ShowMessage('looper: ' + $<lbl>2.yytoken);
//new_label := new_label + 1;
//$<lbl>7.end_label := new_label;

data_code.Add(#9+'fld qword [Lc_' + $<lbl>2.yytoken + ']');
data_code.Add(#9+'fld1');
data_code.Add(#9+'faddp st1, st0');
data_code.Add(#9+'fstp qword [Lc_' + $<lbl>2.yytoken + ']');

} TOK_ENDFOR {
new_label := new_label + 1;
$<lbl>7.end_label := new_label;

data_code.Add(#9 + 'jmp near LL' + IntToStr($<lbl>7.end_label));
data_code.Add('Le_' +
IntToStr($<lbl>7.end_label-1) + ':');
}
;

statement
:
| forstmt
;

kennt sich jemand mit yacc aus und kann mir schreiben,
wie ich das Problem mit den Labels hinbekomme?

Danke und Gruß
Jens
 

Lesen sie die antworten

#1 Jens Kallup
27/12/2009 - 21:00 | Warnen spam
forstmt
: TOK_FOR ident {
new_label := new_label + 1;
$<lbl>1.end_label := new_label;
text_code.Add('Lc_'+$<lbl>2.yytoken+': dq 0.0');
} '=' expr {
data_code.Add(#9+'fstp qword [Lc_' + $<lbl>2.yytoken + ']');
data_code.Add('LL'+IntToStr($<lbl>1.end_label+1)+':');
data_code.Add(#9+'fld qword [Lc_'+$<lbl>2.yytoken + ']');
} TOK_TO expr {

new_label := new_label + 1;
$<lbl>1.end_label := new_label;

data_code.Add(#9+'fucompp');
data_code.Add(#9+'fnstsw ax');
data_code.Add(#9+'sahf');

data_code.Add(#9+'ja near Le_' + IntToStr($<lbl>1.end_label+1));
data_code.Add(#9+'jmp near Le_' + IntToStr($<lbl>1.end_label));
data_code.Add('Le_' + IntToStr($<lbl>1.end_label+1)+':');

} StatementSequence {
new_label := new_label + 1;

data_code.Add(#9+'fld qword [Lc_' + $<lbl>2.yytoken + ']');
data_code.Add(#9+'fld1');
data_code.Add(#9+'faddp st1, st0');
data_code.Add(#9+'fstp qword [Lc_' + $<lbl>2.yytoken + ']');

} TOK_ENDFOR {
data_code.Add(#9 + 'jmp near LL' + IntToStr($<lbl>1.end_label));
data_code.Add('Le_' +
IntToStr($<lbl>1.end_label) + ':');

new_label := new_label + 1;
}
;

Ähnliche fragen