Advertisement
Guest User

Untitled

a guest
Nov 8th, 2021
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. # coding=utf-8
  2. from WordQueue import WordQueue
  3.  
  4. class SyntaxError(Exception):
  5. pass
  6.  
  7.  
  8. def exportQueue(q):
  9. result = []
  10. while not q.isEmpty():
  11. result.append(q.dequeue())
  12. return "".join(result)
  13.  
  14.  
  15. def loadAtoms():
  16. atoms = []
  17. with open('Atoms') as file:
  18. for row in file.readlines():
  19. for col in row.split(' '):
  20. atoms.append(col.strip())
  21. return atoms
  22.  
  23.  
  24. def loadQueue(formula):
  25. q = WordQueue()
  26. for char in formula:
  27. q.enqueue(char)
  28. return q
  29.  
  30.  
  31. '''
  32. <formel>::= <mol>
  33. <mol> ::= <group> | <group><mol>
  34. <group> ::= <atom> |<atom><num> | (<mol>) <num>
  35. <atom> ::= <LETTER> | <LETTER><letter>
  36. <LETTER>::= A | B | C | ... | Z
  37. <letter>::= a | b | c | ... | z
  38. <num> ::= 2 | 3 | 4 | ...
  39. '''
  40.  
  41.  
  42. def readFormula(q, atoms):
  43. while not q.isEmpty():
  44. readMole(q, atoms)
  45.  
  46. def readMole(q, atoms, parenthesis=False):
  47. readGroup(q, atoms, parenthesis)
  48.  
  49. def readGroup(q, atoms, parenthesis=False):
  50. """<atom> |<atom><num> | (<mol>) <num>"""
  51.  
  52. readAtom(q, atoms)
  53. if q.peek() == '(':
  54. parenthesis = True
  55. q.dequeue()
  56.  
  57. while not q.isEmpty() and q.peek().isalpha():
  58. readMole(q, atoms, True)
  59.  
  60. if not q.peek() == ')':
  61. raise SyntaxError('Saknad högerparentes vid radslutet ' + exportQueue(q))
  62. q.dequeue()
  63.  
  64. readNum(q)
  65.  
  66. if q.peek() == ')' and not parenthesis:
  67. raise SyntaxError('Felaktig gruppstart vid radslutet ' + exportQueue(q))
  68.  
  69. def readAtom(q, atoms):
  70. readLetter(q, atoms)
  71. if not q.isEmpty() and q.peek().isnumeric():
  72. readNum(q)
  73.  
  74. def readNum(q):
  75. if q.isEmpty() or not q.peek().isnumeric():
  76. raise SyntaxError('Saknad siffra vid radslutet ' + exportQueue(q))
  77. num = q.dequeue()
  78. if (int(num) == 0) or (int(num) == 1 and not q.peek().isnumeric()):
  79. raise SyntaxError('För litet tal vid radslutet ' + exportQueue(q))
  80. while not q.isEmpty() and q.peek().isnumeric():
  81. q.dequeue()
  82.  
  83. def readLetter(q, atoms):
  84. char = q.peek()
  85. if char.islower():
  86. raise SyntaxError('Saknad stor bokstav vid radslutet ' + exportQueue(q))
  87. if not char.isalpha():
  88. raise SyntaxError('Felaktig gruppstart vid radslutet ' + exportQueue(q))
  89. else:
  90. char = q.dequeue()
  91. char2 = q.peek()
  92. if not q.isEmpty() and char2.islower():
  93. char2 = q.dequeue()
  94. atom = char + char2
  95.  
  96. else:
  97. atom = char
  98. if atom not in atoms and atom.isalpha():
  99. raise SyntaxError('Okänd atom vid radslutet ' + exportQueue(q))
  100.  
  101. def CheckSyntax(formula):
  102. try:
  103. readFormula(loadQueue(formula), loadAtoms())
  104. return 'Formeln är syntaktiskt korrekt'
  105. except SyntaxError as e:
  106. return str(e)
  107.  
  108.  
  109. print(CheckSyntax(input()))
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement