paule22 Geschrieben 20. März 2009 Teilen Geschrieben 20. März 2009 Hallo, wie kann ich eine (endlos) Tiefenschleife programmieren, die IF expr = expr code ELSEIF code ELSE code ENDIF Programmcode ausgeben kann? Zweck: Compilerbau, x86 32-Bit Assembler Output. Danke für Infos und Codebeispiele paule22 P.S: Hier der momentane Code : function TParserClass.handle_if: Boolean; label label_if, start_if; var c: char; cs,s2: String; l,i,b: integer; begin start_if: if_counter := if_counter+1; if_counter_tmp := if_counter; c := skip_white_space; if c in ['_','A'..'Z','a'..'z'] then begin ident_str := c; scan_ident; cs := ident_str; c := skip_white_space; if c = '=' then begin c := skip_white_space; if (c >= '0') and (c <= '9') then begin num_str := c; scan_num; s2 := FActiveClass+':'+FActiveObject; i := FEventCodeOutput.IndexOf(s2); if i > -1 then begin if if_counter > 1 then TStringList(FEventCodeOutput.Objects).Add(#9+'mov dword eax, ' + num_str); TStringList(FEventCodeOutput.Objects).Add(#9+'cmp dword eax, [@v_' + cs + ']'); TStringList(FEventCodeOutput.Objects).Add(#9+'jne near Lv_'+inttostr(if_counter)); l := yylex; if l = TOK_THEN then begin label_if: l := yylex; if l = TOK_ELSE then begin end else if l = TOK_ENDIF then begin TStringList(FEventCodeOutput.Objects).Add('Lv_'+inttostr(if_counter)+':'); end else if l = TOK_SHOWMESSAGE then begin handle_showmessage; TStringList(FEventCodeOutput.Objects).Add('Lv_'+inttostr(if_counter)+':'); dec(if_counter); l := yylex; if l = TOK_ELSE then begin TStringList(FEventCodeOutput.Objects).Add(#9+'jmp Lv_'+inttostr(if_counter)); end else if l = TOK_SHOWMESSAGE then showmessage('msfg') else if l = TOK_ENDIF then begin TStringList(FEventCodeOutput.Objects).Add(#9+'jmp Lv_'+inttostr(if_counter)); end else handle_parser_code(l); //goto label_if; end; end; end; end; end; end; end(*handle_if*); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 20. März 2009 Teilen Geschrieben 20. März 2009 Warum arbeitest Du nicht mit einer EBNF und einem entsprechendem Syntaxbaum für Deine Sprache und wertest dann zu Compile-Zecken diesen Baum aus? Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VaNaTiC Geschrieben 20. März 2009 Teilen Geschrieben 20. März 2009 Ich kenne zwei ScriptEngines, die beide genauso wie Du paule vorgehene. Schau Dir zum Beispiel mal PascalScript (jetzt) von RemObjects an. Aber prinzipiell hab ich noch nicht ganz verstanden, was Du mit endlos IF-ELSEIF-... meinst?! Willst Du dynamisches IF-ELSEIF in ASM abbilden? Oder in der Hochsprache? Sowas wie ein Case-Of? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
paule22 Geschrieben 21. März 2009 Autor Teilen Geschrieben 21. März 2009 (bearbeitet) Hallo Ihr beiden, unter nopaste.info - free nopaste script and service habe ich meine Bemühungen von heute morgen gepostet. Ich meinte mit endlos Tiefe, das geschachtelte IF ELSEIF ELSE ENDIF Anweisungen zu realisieren. Der Code funktioniert fast, mit der Ausnahme, das unter dem EndIF stehende Anweisungen nicht mehr behandelt werden z.B.: if 2 = 2 zwei.ontimer = ok if 4 = 4 vierzwei.ontimer = ok4 else zweiff.ontimer = false4 endif // hier wird der code irgendwie abgeschnitten zweidrei.ontimer = ok2 else zwei.ontimer = false endif könnt ihr mal bitte ein Auge drauf werfen? Danke! Die yacc Software kann unter: Albert Gräf's Homepage geladen werden. Gruß paule P.S.: per yacc übersetzt, müssen ein paar Zeilen ersetzt werden ... Zeile 65: type YYSType = record yylbl : lbl ; end(*YYSType*); Zeile 932 bis 936 auskommentieren .... : (* if yysp>yymaxdepth then begin yyerror('yyparse stack overflow'); goto abort; end; *) Und ja, Andy, ich will einen 32 Bit code basteln ... nasm.exe Bearbeitet 21. März 2009 von paule22 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VaNaTiC Geschrieben 23. März 2009 Teilen Geschrieben 23. März 2009 Hmm, ich hab noch nicht verstanden, welcher Code nach dem ENDIF nicht ausgeführt wird. Parst Yacc nach dem ENDIF nicht mehr oder erzeugt Yacc Code, der nach dem ENDIF nichts ausführt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.