Advertisement
Patasuss

Lösung Aufgabe 9

Jun 5th, 2017
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. 4.2:
  2. C:
  3. Funktioniert nicht, da dort Lineare Sichtbarkeit genutzt wird.
  4.  
  5. Java:
  6. Der äußerste Block kann keine Klasse darstellen, da es ein "Use x" gibt, welches in Java nicht möglich ist.
  7. Nimmt man an, dass sich der Block innerhalb einer Funktion befindet, gibt es auch hier
  8. kontextuelle Fehler, da in Java auch Lineare Sichtbarkeit genutzt wird.
  9. Des Weiteren können in Java keine Funktion genestet werden.
  10.  
  11. Haskell:
  12. Programm ist korrekt geformt, da die Reihenfolge der Deklarationen in Haskell nicht wichtig ist.
  13.  
  14. class Tab {
  15. // Beinhaltet initiale Deklarationen
  16. static Tab initial() {...};
  17.  
  18. // Prüft, ob Identifier lokal vorhanden ist
  19. static bool local(Identifier ident, Tab tab) {...}
  20.  
  21. // Fügt eine Deklaration in tab hinzu
  22. static Tab enter(Identifier ident, DeclarationType type, Tab tab) {...}
  23.  
  24. // Schlägt Typ einer Deklaration in tab nach
  25. static DeclarationType define(Identifier ident, Tab tab) {...} //
  26.  
  27. // Löst vorherige Verschachtelung auf
  28. static Tab unnest(Tab tab) {...};
  29.  
  30. // Verschachtelt tab
  31. static Tab nest(Tab tab) {...};
  32. }
  33.  
  34. abstract class Statement {
  35. // abstrakte evaluator-Funktion
  36. abstract Tab identify(Tab tab);
  37. }
  38.  
  39. class Block extends Statement {
  40. Statement root; //Inhalt des Blocks
  41.  
  42. Tab identify(Tab tab) {
  43. return Tab.unnest(root.identify(Tab.nest(tab)));
  44. }
  45. }
  46.  
  47. class Declaration extends Statement {
  48. Identifier ident;
  49. DeclarationType declType;
  50.  
  51. Tab identify(Tab tab) {
  52. // Prüfen, ob Identifier schon deklariert wurde
  53. if(Tab.local(ident, tab)) {
  54. throw new Exception(ident + " was already declared!");
  55. }
  56. // Identifier und Typ in tab hinzufügen
  57. return Tab.enter(this.ident, this.declType, tab);
  58. }
  59. }
  60.  
  61. class Use extends Statement {
  62. Identifier ident;
  63. DeclarationType declType;
  64.  
  65. Tab identify(Tab tab) {
  66. // Prüfen, ob ident deklariert wurde
  67. declType = Tab.def(ident, tab);
  68. if(declType == null) {
  69. throw new Exception(ident + " was not declared before use!");
  70. }
  71. return tab; //Keine Änderung an tab
  72. }
  73. }
  74.  
  75. // Bildet die Sequenz ab
  76. class List extends Statement {
  77. //Liste von Statements in der Sequenz
  78. ArrayList<Statement> statements;
  79.  
  80. Tab identify(Tab tab) {
  81. //Alle Statements überprüfen
  82. for(Statement stat : statements) {
  83. tab = stat.identify(tab);
  84. }
  85. return tab;
  86. }
  87. }
  88.  
  89. class Identifier {
  90. ...
  91. }
  92.  
  93. class DeclarationType {
  94. ...
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement