Avatar billede donby Nybegynder
21. december 2005 - 13:13 Der er 31 kommentarer og
1 løsning

hjælp arne.v 2

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 Syska Mester
21. december 2005 - 13:17 #1
WTF fuck det med arve.v at gøre?

og ingen point?

hvad sker der her?

// ouT
Avatar billede soreno Praktikant
21. december 2005 - 13:20 #2
Er det ikke bare at tilføje en produktionsregl ?

F.eks.
WhileStmt = "while" "(" Expression ")" "{" Statement "}".

Ud fra at en while sætning i de fleste sprog er:
while (EXPRESSION) {
  STATEMENT
}

Forklaring kommer hvis du stiller mere konkrete spørgsmål.
Avatar billede donby Nybegynder
21. december 2005 - 13:27 #3
buzzzz du er velkommen til at kigge her  http://eksperten.dk/spm/671442 arne.v er dygtig til alt programmering og der må ikke gives point for spm rettet specifikt mod 1 person.. hvis du ikke har noget at tilføje der kunne tyde på bare et minimum af intelligens så synes jeg du skulle lade helt være...

soreno - det ligner noget der kan bruges, så mangler der bare at tilføje metoderne i compileren.. hvis du kigger på ovenstående link er det som et alm spm hvor du også kan få point for dit arbejde.. på forhånd tak
Avatar billede soreno Praktikant
21. december 2005 - 13:31 #4
Det er svært at hjælpe dig mere uden der kommer kode på bordet.

Det er jo heller ikke sikkert at mit eksempel virker i dit sprog.

Jeg har lidt svært ved at gennemskue produktionsreglerne..
Hvordan parser i en source file ?
Avatar billede Syska Mester
21. december 2005 - 13:33 #5
Jamen glædelig jul til dig, forkert ben ud af sengen siden jeg ligepludselig er dum?

Bare første spm jeg ser her på eksperten som er rettet direkte mod 1 person, men siden du er så klog hvorfor kan du så ikke selv finde ud af det?

Du kunne jo også have henvist til det, så man måske var klar over hvad der skete, og hvorfor du havde givet et sådan title ... at det så også er en forkert kategori du har oprettet det i.... Arne_v læser da alle kattegorier med programmering..... :-) ( næsten da )

// ouT

<godt ord igen>
Avatar billede donby Nybegynder
21. december 2005 - 13:36 #6
soreno > jeg har lagt hele opgaven ind som vi fik den, og jeg skal være ærlig og fortælle dig at det er minimalt hvad vi fatter af opgaven, vi har som sagt haft en lærer der taler swahili og skriver sandskrit så vi er helt på bar bund..men produktionsreglen ser rigtig nok ud

Buzzzz > glædelig jul
Avatar billede donby Nybegynder
21. december 2005 - 13:38 #7
forresten progger vi i C#
Avatar billede soreno Praktikant
21. december 2005 - 13:54 #8
Vil det sige at i ikke har skrevet noget kode endnu ?

Har i nogle værktøjer til hjælp (som f.eks. parser-generator eller lign.) ?

I må have haft noget teori om at skrive en parser, f.eks. Top-down eller Recursive descent (eller andre måder at parse på) ?
Avatar billede donby Nybegynder
21. december 2005 - 14:07 #9
faktisk ikke.. vi har haft om LL1 grammatikker og parse træer.. som sagt lærer = bonghat.. 2 uger før projekt kom han ind i klassen med en opgave.. skriv en compiler, der var ingen der løste opgaven.. vi har klaget til læren selv, kontakt lærer og studievejleder uden resultat og nu står vi her. vi har ingen hjælpe værktøjer fået og vi har haft faget i 4 måneder i alt med 5 timer i ugen.. så som du nok kan forstå er vi shit out of luck :-(
Avatar billede soreno Praktikant
21. december 2005 - 14:11 #10
Så må mit råd være at anskaffe en bog.

En søgning på "Parva PVM" kom med denne:
http://www.amazon.co.uk/exec/obidos/ASIN/032126360X/202-9449978-0193441
Avatar billede nheilbuth Nybegynder
21. december 2005 - 14:13 #11
Det er da ikke så svært!

Din statement deklaration skal indeholde et whileStatment:

Statement = VarDeclarations | Assignment | WriteStatement | WhileStatement

...og så en definition af WhileStatement:

WhileStatement = "while" "(" Expression ")" "{" Statement "}"
Avatar billede soreno Praktikant
21. december 2005 - 14:17 #12
Som jeg forstår spørger så er problemet at skrive en hel compiler ikke kun at tilrette en grammatik.
Avatar billede nheilbuth Nybegynder
21. december 2005 - 14:21 #13
Ved godt at der står at de tilsvarende metoder skal tilføjes i compileren, men det er jo lidt svært hvis vi ikke får vist noget compilerkode.
Avatar billede nheilbuth Nybegynder
21. december 2005 - 14:28 #14
Hmm kan så godt se at min løsning måske ikke er helt korrekt, da Expression kun dækker over +, -, / og *

Så et nyt bud må være:

WhileStatement = "while" "(" CompareExp ")" "{" Statement "}"

CompareExp = Term {CompOp Term}
CompOp = "==" | "!=" | "<" | "<=" | ">" | "<="
Avatar billede arne_v Ekspert
21. december 2005 - 14:48 #15
hvorfor pokker laver i compiler i maskin arkitektur - umiddelbart ville jg tro
at maskin arkitektur var teori + evt. lidt assembler og compilere var et
selvstændigt fag

det kan godt være at jeg er dygtig til mange områder indenfor programmering,
men når vi snakker meget datalogiske emner som compiler teknik, så kan jeg godt
mærke at jeg er uddannet national økonom og ikke datalog

første spørgsmål: hvilket værktøj bruger i til at producere noget output
udfra en .atg fil ?
Avatar billede arne_v Ekspert
21. december 2005 - 15:18 #16
PS: er du sikker på at din lærer ikke læser her på Eksperten ?

:-)
Avatar billede sovsekoder Nybegynder
21. december 2005 - 16:35 #17
vil tro løsn. er nogen lunde noget i denne stil:

* "Statement" udviddes med whileStatement - denne tilføjelsegør det muligt at skrive while-sætninger inde i en "block":
Statement        = VarDeclarations | Assignment | WriteStatement | WhileStatement .

* definition af whilestatement - specifik definition af "while"'s opbygning, bemærk at dette giver mulighed for nested while f.eks. blabla.:
WhileStatement    = "while" "(" CompExpression ")" Block.

* oprettelse af Compare expression + sammenlign.operatorer:
CompareExp = Term {CompOp Term}
CompOp = "==" | "!=" | "<" | "<=" | ">" | "<="

hvilket gir' en fil i denne stil:
<klipklip>
PRODUCTIONS
  Parva            = "void" identifier "(" ")" Block .
  Block            = "{" { Statement } "}" .
  Statement        = VarDeclarations | Assignment | WriteStatement | WhileStatement .
  Constant          = number .
  VarDeclarations  = Type OneVar { "," OneVar } ";" .
  OneVar            = identifier [ "=" Expression ] .
  Assignment        = Designator "=" Expression ";" .
  Designator        = identifier .
  WhileStatement    = "while" "(" CompExpression ")" Block .
  WriteStatement    = "write" "(" WriteElement { "," WriteElement } ")" ";" .
  WriteElement      = stringLit | Expression .
  Expression        = AddExp .
  AddExp            = [ "+" | "-" ] Term { AddOp Term } .
  CompareExp        = Term {CompOp Term}
  Term              = Factor { MulOp Factor } .
  Factor            = Designator | Constant | "(" Expression ")" .
  Type              = BasicType .
  BasicType        = "int" .
  AddOp            = "+" | "-" .
  MulOp            = "*" | "/" .
  CompOp = "==" | "!=" | "<" | "<=" | ">" | "<="
END Parva.
<klipklip>
Avatar billede sovsekoder Nybegynder
21. december 2005 - 16:37 #18
en søgning på google giver: .ATG filer læses af COco - en super compiler SLASH parser generator: http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/

når i har rettet .ATG filen kan i give den som input coco.exe og så genererer den en parser... men det er vist ikke en del af opgaven.

på siden ligger der en CSharp.ATG - i kan kigge i den fil og lure lidt trix af måske o.O
Avatar billede sovsekoder Nybegynder
21. december 2005 - 16:39 #19
ok det var tilsyneladende del 1 af op gaven... anden del er :
"...og tilføj de tilsvarende metoder i compileren" - det har jeg p.t. ikke lige tid til at sætte mig ind i :D der må være nogen der kan hjælpe med det....
Avatar billede sovsekoder Nybegynder
21. december 2005 - 16:39 #20
læs: jeg ved ikke hvad i skal der.
Avatar billede donby Nybegynder
21. december 2005 - 16:56 #21
hejsa allesammen.. 10000000000000000 tak for alt jeres hjælp.. jeg vender lige situationen med gruppen imorgen og vender tilbage..
1. hvis min klovn af en lærer læser her på eksperten er det helt fint, det er jo ikke forbudt at få hjælp :-)
2. vi har ingen compiler som er skrevet i forvejen, som vi kan tilføje metoderne til :-(
3. dette er kun datamatiker studiet ikke engang datalogi, så det er måske lidt vildt
4. jeg får lige gruppemedlemmerne til at kigge ind på spm så hurtigt som muligt
Avatar billede sovsekoder Nybegynder
21. december 2005 - 17:02 #22
så ha' lige lidt sidste info: på Coco siden er der et eksempel (TASTE) som indeholder:
en .ATG fil.
en Scanner/Parser (genereret vha. coco går jeg udfra)
en CodeGenerator!! (så her kan i måske hente lidt hjælp til hvordan så'en en ser ud)

hold&lykke
Avatar billede sovsekoder Nybegynder
21. december 2005 - 17:03 #23
...altså til anden del af opgaven... at skrive noget kode der genererer "while statenent kode"....
Avatar billede arne_v Ekspert
21. december 2005 - 17:04 #24
re 1)

måske ville han blive sur over at blive kaldt en klovn ...

re 2)

Uden at kende noget til coco så vil jeg antage at det fungerer som:

coco konverterer grammatikken (.atg fil) til noget kode (C/C++, Java, C#)
I skriver noget kode (C/C++, Java, C#) som for hver grammatik del genererer noget (PVM assembler siger i)

de to dele compiles sammen til et færdig program som er jeres compiler

den compiler kan så compilere parva input til PVM assembler

re 3)

jeg troede faktisk ikke at datamatikere arbejdede med compiler teknologi
Avatar billede donby Nybegynder
21. december 2005 - 17:04 #25
har lige snakket med gruppen.. de er osse pænt forvirrede.. vi får fat på vores lærer ( læs Al Bundy ) imorgen, så har vi forhåbentlig noget mere konkret.. men 1234332345 tak indtil videre
Avatar billede arne_v Ekspert
21. december 2005 - 17:08 #26
normalt vil man til en while løkke skulle have genereret noget a la:

while(udtryk) {

bliver til:

startwhilelabel:  beregn udtryk
                  test udtryk
                  hvis ikke opfyldt hop til endwhilelabel

}

bliver til:

                      hop til startwhilelabel
endwhilelabel:        noop
Avatar billede nheilbuth Nybegynder
21. december 2005 - 17:34 #27
Synes også det lyder som et meget teoretisk og dybtegående emne til en uddannelse som datamatiker. Jeg er selv uddannet datamatiker og har derefter læst 2 semestre på datalogi. Det er først på universitetet at jeg har beskæftiget mig med compilere!
Avatar billede soreno Praktikant
21. december 2005 - 19:15 #28
Da jeg læste datamatiker havde vi om lexing og parsing men på et meget overfladisk niveau.

Vores lærer syntes bl.a. at regulære udtryk var noget man bare beskæftigede sig med på universitetet.
Det var i 2001/2002.
Avatar billede donby Nybegynder
22. december 2005 - 09:51 #29
her er hvad vi er nået frem til, med jeres hjælp self.


COMPILER Parva $CN
/*

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 |
                WhileStatement .
  Constant              = number .
  VarDeclarations      = Type OneVar { "," OneVar } ";" .
  OneVar                = identifier [ "=" Expression ] .
  Assignment            = Designator "=" Expression ";" .
  Designator            = identifier .
  WriteStatement        = "write" "(" WriteElement { "," WriteElement } ")" ";" .
  WhileStatement        = "while" "(" CompExpression ")" Block .
  WriteElement          = stringLit | Expression .
  Expression            = AddExp .
  AddExp                = [ "+" | "-" ] Term { AddOp Term } .
  CompExpression        = Factor CompOp Factor .
  Term                  = Factor { MulOp Factor } .
  Factor                = Designator | Constant | "(" Expression ")" .
  Type                  = BasicType .
  BasicType            = "int" .
  AddOp                = "+" | "-" .
  MulOp                = "*" | "/" .
    CompOp         = "!=" | "==" | "<=" | ">=" | "<" | ">" .
END Parva.


Det er så meningen at vi bare skal forestille os at der er lavet en compiler, hvor vi så skal skrive koden for While metoden og for CompExpression metoden, i C#
Avatar billede donby Nybegynder
09. januar 2006 - 09:22 #30
nheilbuth, arne v, sovsekoder, soreno  tak for jeres gode forsøg på at hjælpe. hvis i ligger et svar her  http://eksperten.dk/spm/671442  så er der lidt point til jer.. 2 grupper ud af 5 løste opgaven, de skulle dog skrive om på opgaven for at den kunne løses... hvor fed en lærer har vi lige ;-(
Avatar billede donby Nybegynder
09. januar 2006 - 09:47 #31
slut
Avatar billede arne_v Ekspert
09. januar 2006 - 15:59 #32
Da jeg gik på uni var den en historie om den gamle professor som
af princip forelæste om emner udenfor pensum - fordi pensum kunne de
studerende jo selv læse.
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

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