leicht OT - Compilerbau die andere Alternativ YACC/LEX

21/03/2009 - 19:12 von Jens Kallup | Report spam
Hallo

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.:


Code:
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ß
Jens

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;
*)
 

Lesen sie die antworten

#1 Markus Wichmann
21/03/2009 - 23:13 | Warnen spam
Hi,

nix gegen dich, aber mir scheint, du solltest die Grammatik deiner
Sprache erst einmal vollstàndig definieren. Bevor du das getan hast,
weißt du selbst nicht, wie die Sprache aussehen soll, die du da
zusammenschusterst. Nachdem du das getan hast, kannst du yacc und lex
(oder bison und flex auf Linux) diese Definitionen übergeben und fertig
ist der Parser. Das einzige, was dann noch Probleme bereiten könnte,
ist die Umsetzung des ganzen in Assembler. Dabei werden wir dir gerne
helfen.

Mal ein Beispiel, wie ich herangehen würde:

- Wie soll die Quelltextdatei gegliedert sein? So streng wie in Pascal,
wo ein Programm wie folgt auszusehen hat:

program-type-definition_opt
uses-statement_opt
global-declarations_opt
subroutine-definitions_opt
main-program

Das ganze könnte man noch weiter ableiten, wenn man will. (z.B. so hier

program-type-definition: program-type program-name;
program-type: one of
program
library
unit
module

program-name: alpha-char alnum-chars
alpha-char: [a-zA-Z]
alnum-chars: epsilon
alnum-char alnum-chars
alnum-char: [a-zA-Z0-9]

So in dem Dreh.) Und wenn man damit fertig ist, hat man die Grammatik
einer Pascal-àhnlichen Sprache. Es geht aber auch wie in C, wo man den
allgemeinen Programm-Knoten wie folgt ableiten kann:

program: preprocessing-directive
function-definition
variable-definition
in any number and order

Woraus folgt, dass eine leere Datei gültiger C-Quelltext ist, ein
minimales Pascal-Programm aber wie folgt aussieht:

begin end.

Der Unterschied ist, dass man das Pascal-Programm linken kann, im
Gegensatz zum C-Programm...

Nur mal so als Anregung. Diese Definitionen werden immer konkreter (sie
beginnen bei der abstrakten Einheit "Programm" und kommen schließlich zu
den ganzen Terminalen, die den Programmquelltext bilden). Das, was dich
gerade quàlt, dürfte eine schlechte definition eines Blockes sein. Ein
Block ist in C definiert als

compound-statemend:
{ block-item-list_opt }
block-item-list:
block-item
block-item-list block-item
block-item:
declaration
statement

Dabei ist wiederum ein statement eigentlich jede Grundstruktur, die es
so gibt. Du möchtest vielleicht statt der Terminalen '{' und '}' lieber
"begin" und "end" nehmen und dann als mögliches statement folgendes
nehmen:

selection-statement:
if expression then statement (elif expression then statement)* endif;

Der Stern ist der Kleene-Stern.

Naja, kann man mögen, muss man aber nicht...

Tschö,
Markus

GUI - ein Hintergrundbild und zwölf XTerms

vim -c "exec \"norm iwHFG#NABGURE#IVZ#UNPXRE\"|%s/#/ /g|norm g??g~~"

Ähnliche fragen