Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.46 KB | None | 0 0
  1. using System;
  2.  
  3. namespace SatSolver
  4. {
  5. /*
  6. * Met een Parser-object kun je een formule uit de propositielogica ontleden.
  7. * De invoer is een string met een tekst-representatie van de formule,
  8. * waarbij het "en"-voegteken aangeduid met "/\" , het "of"-voegteken met "\/" en het "not"-teken met "-"
  9. * De propositie-variabelen bestaan uit letters en cijfers, bijvoorbeeld "x", "hoi", "x23", "1", "45b1"
  10. * Mogelijke formules zijn bijvoorbeeld:
  11. * x
  12. * (x/\-y)
  13. * ((a1/\a2)\/a3)
  14. * Voor de leesbaarheid mogen er extra spaties in de string staan:
  15. * ( (p\/q) /\ -p )
  16. * De voegtekens mogen in plaats van met \/, /\, en -, ook worden aangeduid met de C#-notatie ||, && en !
  17. * ( (p||q) && !p )
  18. * Je mag de haakjes desgewenst weglaten. In dat geval hangen de ontleedbomen naar rechts, dus
  19. * x/\y/\z wordt herkend als (x /\ (y/\z))
  20. * Bovendien hebben de operatoren prioriteit: /\ gaat voor \/, zoals vermenigvuldigen voor optellen gaat:
  21. * x/\y\/a/\b wordt herkend als ( (x/\y) \/ (a/\b) )
  22. * Met haakjes kun je de prioriteiten toch anders regelen:
  23. * x/\(y\/a)/\b wordt herkend als (x /\ ( (y\/a) /\ b))
  24. */
  25.  
  26.  
  27. class Parser
  28. {
  29. private string inhoud;
  30. private int cursor;
  31. private int lengte;
  32.  
  33. /*
  34. * Dit is de enige public methode in deze klasse: de methode ontleedt een string tot een formule.
  35. * Als dat niet mogelijk is (omdat de string een syntactische fout bevat) werpt de methode een exception.
  36. */
  37. public static IFormule ParseFormule(string s)
  38. {
  39. Parser parser = new Parser(s);
  40. return parser.ParseFormule();
  41. }
  42.  
  43. /*
  44. * De constructor bewaart de string die ontleed moet worden,
  45. * en initialiseert een "cursor" waarmee we kunnen aanwijzen tot hoe ver het ontleedproces gevorderd is.
  46. */
  47. private Parser(string s)
  48. {
  49. inhoud = s;
  50. cursor = 0;
  51. lengte = s.Length;
  52. }
  53.  
  54. /*
  55. * Deze hulpmethode zorgt ervoor dat de cursor eventuele extra spaties/tabs/newlines in de string passeert.
  56. */
  57. private void SkipSpaces()
  58. {
  59. while (cursor < lengte && char.IsWhiteSpace(inhoud[cursor]))
  60. cursor++;
  61. }
  62.  
  63. /*
  64. * Deze methode start het recursieve ontleedproces op,
  65. * en controleert na afloop of inderdaad de hele invoer is geconsumeerd.
  66. */
  67. private IFormule ParseFormule()
  68. {
  69. IFormule e = ParseExpressie();
  70. SkipSpaces();
  71. if (cursor < lengte)
  72. throw new Exception($"Extra input op positie {cursor} ({inhoud[cursor]})");
  73. return e;
  74. }
  75.  
  76. /*
  77. * Het eigenlijk werk wordt gedaan door drie wederzijds recursieve methodes:
  78. * - ParseExpressie, die een complete propositie ontleedt
  79. * - ParseTerm, die een formule ontleedt waarin op top-nivo geen of-operatoren worden gebruikt
  80. * - ParseFactor, die alleen maar een losse variabele verwerkt,
  81. * of een negatie, of een complete propositie, die dan wel tussen haakjes moet staan.
  82. * De methodes leveren de herkende deelformule op,
  83. * en verplaatsen de cursor naar de positie in de invoer daar net voorbij.
  84. */
  85. private IFormule ParseFactor()
  86. {
  87. SkipSpaces();
  88. if (cursor<lengte && inhoud[cursor] == '(')
  89. {
  90. cursor++; // passeer het openingshaakje
  91. IFormule resultaat = ParseExpressie(); // tussen de haakjes mag een complete propositie staan
  92. SkipSpaces();
  93. if (inhoud[cursor] != ')') throw new Exception("sluithaakje ontbreekt op positie " + cursor);
  94. cursor++; // passeer het sluithaakje
  95. return resultaat;
  96. }
  97. else if (cursor < lengte && (inhoud[cursor] == '-' || inhoud[cursor] == '!' || inhoud[cursor]=='~'))
  98. {
  99. // WIP: zorg dat de parser ook een negatie kan herkennen
  100. cursor++; // passeer het 'not'-teken
  101. IFormule resultaat = ParseFactor(); // achter het teken mag een complete propositie staan
  102. return MaakNegatie(resultaat);
  103. }
  104. else
  105. {
  106. // geen haakje, geen not-teken, dus dan moeten we een variabele herkennen
  107. // WIP: zorg dat de parser ook een variabele kan herkennen
  108. cursor++;
  109. string resultaat = inhoud[cursor].ToString;
  110. return MaakPropositie(resultaat);
  111. }
  112. }
  113.  
  114. private IFormule ParseTerm()
  115. {
  116. IFormule f = ParseFactor();
  117. SkipSpaces();
  118. if (cursor<lengte-1 && (inhoud[cursor]=='/' && inhoud[cursor+1]=='\\' || inhoud[cursor] == '&' && inhoud[cursor + 1] == '&'))
  119. {
  120. cursor+=2; // passeer het voegteken
  121. IFormule t = ParseTerm();
  122. return MaakConjunctie(f, t);
  123. }
  124. return f;
  125. }
  126.  
  127. private IFormule ParseExpressie()
  128. {
  129. IFormule t = ParseTerm();
  130. SkipSpaces();
  131. if (cursor < lengte - 1 && (inhoud[cursor] == '\\' && inhoud[cursor + 1] == '/' || inhoud[cursor] == '|' && inhoud[cursor + 1] == '|'))
  132. {
  133. cursor +=2; // passeer het voegteken
  134. IFormule e = ParseExpressie();
  135. return MaakDisjunctie(t, e);
  136. }
  137. return t;
  138. }
  139.  
  140. /*
  141. * Deze vier hulpmethoden maken een object aan voor de vier verschillende formule-vormen.
  142. */
  143. static IFormule MaakPropositie(string variabele)
  144. {
  145. // TODO: schrijf de methode die een Propositie maakt
  146. return null;
  147. }
  148.  
  149. static IFormule MaakNegatie(IFormule formule)
  150. {
  151. // TODO: schrijf de methode die een Negatie maakt
  152. return null;
  153. }
  154.  
  155. static IFormule MaakConjunctie(IFormule links, IFormule rechts)
  156. {
  157. // TODO: schrijf de methode die een Conjunctie maakt
  158. return null;
  159. }
  160.  
  161. static IFormule MaakDisjunctie(IFormule links, IFormule rechts)
  162. {
  163. // TODO: schrijf de methode die een Disjunctie maakt
  164. return null;
  165. }
  166. }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement