Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.77 KB | None | 0 0
  1. from string import ascii_lowercase
  2. from string import ascii_uppercase
  3. from numbers import Number
  4. from sys import stdin
  5. import unittest
  6.  
  7.  
  8. class Node:
  9. def __init__(self, next, newnode):
  10. self.next = next
  11. self.newnode = newnode
  12.  
  13.  
  14. class LinkedQ:
  15. def __init__(self):
  16. self._first = None
  17. self._last = None
  18.  
  19. def enqueue(self, value): # lägger till element i slutet av listan
  20. newn = Node(None, value)
  21. if self._first is None:
  22. self._first = newn
  23. self._last = newn
  24. else:
  25. self._last.next = newn
  26. self._last = newn
  27.  
  28. def dequeue(self): # plockar ut och returnerar första elementet
  29.  
  30. if self._first is None:
  31. return None
  32. else:
  33. value = self._first.newnode
  34. self._first = self._first.next
  35. return value
  36.  
  37. def peek(self):
  38. if not self._first:
  39. return
  40. return self._first.newnode
  41.  
  42. def isEmpty(self):
  43. if self._first is None: # kollar om listan är tom eller inte
  44. return True
  45. else:
  46. return False
  47. # def __str__(self):
  48. # return self
  49.  
  50.  
  51. atomer = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar', 'K', 'Ca',
  52. 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb', 'Sr',
  53. 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe', 'Cs', 'Ba',
  54. 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'W',
  55. 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn', 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U',
  56. 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm', 'Md', 'No', 'Lr', 'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds',
  57. 'Rg', 'Cn', 'Fl', 'Lv']
  58.  
  59.  
  60. # Syntaxkontroll
  61.  
  62.  
  63. class Syntaxfel(Exception):
  64. pass
  65.  
  66.  
  67. gemener = list(ascii_lowercase)
  68. versaler = list(ascii_uppercase)
  69. lista1 = "0 1 2 3 4 5 6 7 8 9".split()
  70. lista2 = "1 2 3 4 5 6 7 8 9".split()
  71. lista3 = "2 3 4 5 6 7 8 9".split()
  72.  
  73.  
  74. def readMolekyl(q):
  75. return readAtom(q)
  76.  
  77.  
  78. def readAtom(q):
  79. return readLetter(q)
  80.  
  81.  
  82. def readLetter(q):
  83. tecken = q.dequeue()
  84. if tecken == "(":
  85. return readAtom(q)
  86. if tecken in versaler:
  87. if tecken + q.peek() in atomer:
  88. q.dequeue()
  89. return readnum(q)
  90. if tecken in atomer:
  91. return readnum(q)
  92. return Syntaxfel("Okänd atom vid radslutet " + radslut(q))
  93. if tecken == ")":
  94. if q.peek() not in lista3:
  95. return Syntaxfel('Saknad siffra vid radslutet ' + radslut(q))
  96. try:
  97. num = int(q.dequeue())
  98. return readAtom(q)
  99. except ValueError:
  100. return Syntaxfel('Saknad siffra vid radslutet ' + radslut(q))
  101. if not tecken:
  102. return
  103. if tecken in gemener:
  104. return Syntaxfel("Saknad stor bokstav vid radslutet " + radslut(q))
  105. return Syntaxfel('Felaktig gruppstart vid radslutet ' + radslut(q))
  106.  
  107. def readnum(q):
  108. if q.isEmpty():
  109. return
  110. try:
  111. num = int(q.dequeue())
  112. except ValueError:
  113. return readAtom(q)
  114. if num == 1 and not q.peek() or num < 1:
  115. return Syntaxfel('För litet tal vid radslutet ' + radslut(q))
  116.  
  117. else:
  118. while not q.isEmpty():
  119. num = q.dequeue()
  120. try:
  121. if int(num) < 0:
  122. return Syntaxfel('För litet tal vid radslutet ' + radslut(q))
  123. except ValueError:
  124. return readAtom(q)
  125.  
  126. def printQueue(q):
  127. while not q.isEmpty():
  128. word = q.dequeue()
  129. print(word, end=" ")
  130. print()
  131. def radslut(q):
  132. q.dequeue()
  133. word = ''
  134. while not q.isEmpty():
  135. word += q.dequeue()
  136. return str(word)
  137.  
  138.  
  139. def storeSentence(mening):
  140. q = LinkedQ()
  141. mening = list(mening)
  142. for ordet in mening:
  143. q.enqueue(ordet)
  144. return q
  145.  
  146.  
  147. def kollaMolekylen(mening):
  148. q = storeSentence(mening)
  149. return readMolekyl(q)
  150.  
  151.  
  152.  
  153.  
  154. def main():
  155. #meningar = ["C(Xx4)5", "C(OH4)C", "C(OH4C", "H2O)Fe", "H0", "H1C", "H02C", "Nacl" "a", "(Cl)2)3)2"]
  156. #for mening in meningar:
  157. mening = "C(OH4C"
  158. syntaxfel = kollaMolekylen(mening)
  159. if not syntaxfel:
  160. print('Formeln är syntaktiskt korrekt')
  161. else:
  162. print(syntaxfel)
  163.  
  164.  
  165.  
  166. main()
  167.  
  168.  
  169. if __name__ == "__main__":
  170. unittest.main()
  171.  
  172.  
  173. class Test(unittest.TestCase):
  174. def test_kollaMolekylen1(self):
  175. self.assertIsNone(kollaMolekylen('Na'))
  176. self.assertIsNone(kollaMolekylen('H2O'))
  177. self.assertIsNone(kollaMolekylen('Si(C3(COOH)2)4(H2O)7'))
  178. self.assertIsNone(kollaMolekylen('Na332'))
  179.  
  180. def test_kollaMolekylen2(self):
  181. with self.assertRaises(Syntaxfel):
  182. kollaMolekylen('C(Xx4)5')
  183. with self.assertRaises(Syntaxfel):
  184. kollaMolekylen('C(OH4)C')
  185. with self.assertRaises(Syntaxfel):
  186. kollaMolekylen('C(OH4C')
  187. with self.assertRaises(Syntaxfel):
  188. kollaMolekylen('H2O)Fe')
  189. with self.assertRaises(Syntaxfel):
  190. kollaMolekylen('H0')
  191. with self.assertRaises(Syntaxfel):
  192. kollaMolekylen('H1C')
  193. with self.assertRaises(Syntaxfel):
  194. kollaMolekylen('H02C')
  195. with self.assertRaises(Syntaxfel):
  196. kollaMolekylen('Nacl')
  197. with self.assertRaises(Syntaxfel):
  198. kollaMolekylen('a')
  199. with self.assertRaises(Syntaxfel):
  200. kollaMolekylen('(Cl)2)3')
  201. with self.assertRaises(Syntaxfel):
  202. kollaMolekylen(')')
  203. with self.assertRaises(Syntaxfel):
  204. kollaMolekylen('2')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement