Advertisement
Guest User

Untitled

a guest
Jun 17th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.10 KB | None | 0 0
  1. calculateFirstOf: word
  2. "dodaj Fi(wi) do Fi(wi) dla kazdej produkcji Ai -> wi, gdzie Fi jest zdefiniowana nastepujaco:"
  3. (word isEmpty)
  4. "Fi(e) = { e }"
  5. ifTrue: [|set| set := Set new. set add: ''. ^set ]
  6. ifFalse: [
  7. |znak|
  8. znak := word first.
  9. (nieterminale includes: znak)
  10. "Fi(a w' ) = { a } dla kazdego terminalu a"
  11. ifFalse: [|set| set := Set new. set add: znak. ^set]
  12. ifTrue: [
  13. ((zbiorPierwszychZnakow at: znak) includes: '')
  14. "Fi(A w' ) = Fi(A) dla kazdego nieterminalu A z e nie nalezacego do Fi(A)"
  15. ifFalse: [^(zbiorPierwszychZnakow at: znak)]
  16. "Fi(A w' ) = Fi(A) \ { e } U Fi(w' ) dla kazdego nieterminalu A z e nalezacym do Fi(A)"
  17. ifTrue: [|set|
  18. set := (zbiorPierwszychZnakow at: znak).
  19. set remove: ''.
  20. set addAll: (self calculateFirstOf: word allButFirst ).
  21. ^set
  22. ]
  23. ]
  24. ]
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31. start: s rules: r
  32. "parser wzorowany na podstawie ponizszego algorytmu"
  33. "https://en.wikipedia.org/wiki/LL_parser"
  34. |brakZmian|
  35. brakZmian := false.
  36. start := s.
  37. rules := r.
  38. nieterminale := Set new.
  39. terminale := Set new.
  40. zbiorPierwszychZnakow := Dictionary new.
  41. zbiorNastepujacy := Dictionary new.
  42. tablicaSterujaca := Dictionary new.
  43.  
  44. r do: [:produkcja |
  45. zbiorPierwszychZnakow
  46. at: produkcja key put: Set new;
  47. at: produkcja value put: Set new.
  48. nieterminale add: produkcja key
  49. ].
  50.  
  51. r do: [:produkcja |
  52. (produkcja value) do: [:znak |
  53. (nieterminale includes: znak)
  54. ifFalse: [ terminale add: znak ]
  55. ]
  56. ].
  57.  
  58. [brakZmian] whileFalse: [
  59. brakZmian := true.
  60. r do: [ :produkcja | |setToAdd size|
  61. size := (zbiorPierwszychZnakow at: produkcja value) size.
  62. setToAdd := (self calculateFirstOf: produkcja value).
  63. (zbiorPierwszychZnakow at: produkcja value) addAll: setToAdd.
  64. (size = (zbiorPierwszychZnakow at: produkcja value) size) not
  65. ifTrue: [ brakZmian := false. ]
  66. ].
  67.  
  68. r do: [:rule||size|
  69. size := (zbiorPierwszychZnakow at: (rule key)) size.
  70. (zbiorPierwszychZnakow at: (rule key)) addAll: (zbiorPierwszychZnakow at: (rule value)).
  71. size = (zbiorPierwszychZnakow at: (rule key)) size
  72. ifFalse: [ brakZmian := false. ]
  73. ]
  74. ].
  75.  
  76. nieterminale do: [:nieterminal | zbiorNastepujacy at: nieterminal put: Set new ].
  77. (zbiorNastepujacy at: s) add: $$.
  78. brakZmian := false.
  79. [brakZmian] whileFalse: [
  80. brakZmian := true.
  81. rules do: [:produkcja | |rightSide|
  82. rightSide := produkcja value.
  83. rightSide doWithIndex: [:char :i |
  84. (nieterminale includes: char)
  85. ifTrue: [|rest|
  86. rest := rightSide copyFrom: i + 1.
  87. ((rest size) = 0)
  88. ifTrue: [ |size|
  89. size := (zbiorNastepujacy at: char) size.
  90. (zbiorNastepujacy at: char) addAll: (zbiorNastepujacy at: produkcja key).
  91. size = ((zbiorNastepujacy at: char) size)
  92. ifFalse: [ brakZmian := false ]
  93. ]
  94. ifFalse: [|set|
  95. set := self calculateFirstOf: rest.
  96. (set includes: '')
  97. ifTrue: [ |size|
  98. size := (zbiorNastepujacy at: char) size.
  99. (zbiorNastepujacy at: char) addAll: (zbiorNastepujacy at: produkcja key).
  100. size = ((zbiorNastepujacy at: char) size)
  101. ifFalse: [ brakZmian := false ]
  102. ].
  103. set do: [:elem |
  104. ((nieterminale includes: elem) not)
  105. ifTrue: [ |size|
  106. size := (zbiorNastepujacy at: char) size.
  107. (zbiorNastepujacy at: char) add: elem.
  108. size = ((zbiorNastepujacy at: char) size)
  109. ifFalse: [ brakZmian := false ]
  110. ]
  111. ]
  112. ]
  113. ]
  114. ]
  115. ]
  116. ].
  117.  
  118. terminale do: [:terminal |
  119. rules do: [:produkcja | |produkcjaKlucze|
  120. produkcjaKlucze := (produkcja key) asString , terminal asString.
  121. Transcript show: produkcjaKlucze.
  122. Transcript cr.
  123. (((zbiorPierwszychZnakow at: produkcja value) includes: terminal) or: [ ((zbiorPierwszychZnakow at: produkcja value) includes: '') and: [ ((zbiorNastepujacy at: produkcja key) includes: terminal) ] ])
  124. ifTrue: [
  125. (tablicaSterujaca includesKey: produkcjaKlucze)
  126. ifTrue: [^nil ]
  127. ifFalse: [ tablicaSterujaca at: produkcjaKlucze put: produkcja value ].
  128. ].
  129. ]
  130. ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement