problemer med en parser/compiler
vi har fået en opgave i maskinarkitektur, da vi har en røvdårlig lærer er der ingen der fatter et pluk af hvordan vi skal løse den..Antag at I har skrevet en compiler for MinimalParva.atg, dvs. en oversætter der kan oversætte en delmængde af Parva til PVM assembler. MinimalParva skal nu udvides med én enkelt kontrolsætning, det skal nu være muligt at skrive en while-sætning. Tilføj de nødvendige produktionsregler til MinimalParve.atg og tilføj de tilsvarende metoder i compileren.
Et program der skulle oversættes og simuleres kunne være
void fun () {
int moreFun = 0;
while (number <= 5) {
moreFun = moreFun + 1;
write(number);
}
write(“ The end”);
}
MinimalParva.atg:
COMPILER MinimalParva
/*
A minimal fragment of Parva sufficient for writing programs like this:
void main() {
int peter = 25, poul = 5;
peter = (peter / poul) * 10 - poul + 20;
poul = poul * 2 / 5;
write( "poul = ", poul);
write( peter/5);
}
*/
CHARACTERS
lf = CHR(10) .
backslash = CHR(92) .
control = CHR(0) .. CHR(31) .
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .
digit = "0123456789" .
stringCh = ANY - '"' - control - backslash .
charCh = ANY - "'" - control - backslash .
printable = ANY - control .
TOKENS
identifier = letter { letter | digit | "_" } .
number = digit { digit } .
stringLit = '"' { stringCh | backslash printable } '"' .
COMMENTS FROM "//" TO lf
COMMENTS FROM "/*" TO "*/"
IGNORE CHR(9) .. CHR(13)
PRODUCTIONS
Parva = "void" identifier "(" ")" Block .
Block = "{" { Statement } "}" .
Statement = VarDeclarations | Assignment | WriteStatement .
Constant = number .
VarDeclarations = Type OneVar { "," OneVar } ";" .
OneVar = identifier [ "=" Expression ] .
Assignment = Designator "=" Expression ";" .
Designator = identifier .
WriteStatement = "write" "(" WriteElement { "," WriteElement } ")" ";" .
WriteElement = stringLit | Expression .
Expression = AddExp .
AddExp = [ "+" | "-" ] Term { AddOp Term } .
Term = Factor { MulOp Factor } .
Factor = Designator | Constant | "(" Expression ")" .
Type = BasicType .
BasicType = "int" .
AddOp = "+" | "-" .
MulOp = "*" | "/" .
END Parva.
SLUT
håber i kan hjælpe, evt med lidt forklaring til.. MVH Donby