Avatar billede donby Nybegynder
12. december 2005 - 10:49 Der er 7 kommentarer og
5 løsninger

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
Avatar billede rbj_fp Nybegynder
12. december 2005 - 11:03 #1
Det går vel ud på at skabe de nødvendige produktions regler for at kunne lave en while statement i jeres problem.

Noget ala :
WhileStatement = "while" "(" CompareExpression ")" Block
ConmpareExpression = Term "==" Term

Jeg tror at dette burde dette dække det, men det er dog kun en hurtig og ikke gennemarbejde løsning jeg viser. Derfor efter skal jeres "compiler" skrives om til også at kunne parse disse nye input. Dette burde ikke være det helt store problem, hvis i Yacc eller ligende.
Avatar billede donby Nybegynder
12. december 2005 - 11:06 #2
ja det ligner jo noget, men til 200 point vil vi gerne se en komplet løsning :-)
Avatar billede rbj_fp Nybegynder
12. december 2005 - 11:13 #3
Jeg er ligeglad for point...

Jeg forsøger bare at hjælpe med hvad jeg kan. At analysere en grammatik for en sprog, selv en lille sprog som dette kan tage ret lang tid desværre.
Avatar billede donby Nybegynder
12. december 2005 - 11:15 #4
oki, men tak for forsøget
Avatar billede rbj_fp Nybegynder
12. december 2005 - 11:22 #5
Ja, jeg forsøger at peger i den generelle retning i skal søge jeres svar. Held og lykke med det. I kan evt prøve at se hvor C++ og java's grammatikker har løst dette.

// RBJ_FP
Avatar billede donby Nybegynder
21. december 2005 - 13:15 #6
det ser ikke ud til der sker mere her.. rbj fp ligger du et svar så er der lidt point til dig for et godt forsøg :-)  god jul
Avatar billede nheilbuth Nybegynder
09. januar 2006 - 09:32 #7
svar
Avatar billede rbj_fp Nybegynder
09. januar 2006 - 09:34 #8
svar
Avatar billede soreno Praktikant
09. januar 2006 - 09:41 #9
.
Avatar billede arne_v Ekspert
09. januar 2006 - 15:57 #10
.
Avatar billede sovsekoder Nybegynder
09. januar 2006 - 22:39 #11
svar - yo! ;)
Avatar billede donby Nybegynder
09. januar 2006 - 22:50 #12
10000000 tak for forsøgene gutter. i styrer
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester