Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from string import ascii_lowercase
- from string import ascii_uppercase
- from numbers import Number
- from sys import stdin
- import unittest
- class Node:
- def __init__(self, next, newnode):
- self.next = next
- self.newnode = newnode
- class LinkedQ:
- def __init__(self):
- self._first = None
- self._last = None
- def enqueue(self, value): # lägger till element i slutet av listan
- newn = Node(None, value)
- if self._first is None:
- self._first = newn
- self._last = newn
- else:
- self._last.next = newn
- self._last = newn
- def dequeue(self): # plockar ut och returnerar första elementet
- if self._first is None:
- return None
- else:
- value = self._first.newnode
- self._first = self._first.next
- return value
- def peek(self):
- if not self._first:
- return
- return self._first.newnode
- def isEmpty(self):
- if self._first is None: # kollar om listan är tom eller inte
- return True
- else:
- return False
- # def __str__(self):
- # return self
- atomer = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar', 'K', 'Ca',
- 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb', 'Sr',
- 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe', 'Cs', 'Ba',
- 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'W',
- 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn', 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U',
- 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm', 'Md', 'No', 'Lr', 'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds',
- 'Rg', 'Cn', 'Fl', 'Lv']
- # Syntaxkontroll
- class Syntaxfel(Exception):
- pass
- gemener = list(ascii_lowercase)
- versaler = list(ascii_uppercase)
- lista1 = "0 1 2 3 4 5 6 7 8 9".split()
- lista2 = "1 2 3 4 5 6 7 8 9".split()
- lista3 = "2 3 4 5 6 7 8 9".split()
- def readMolekyl(q):
- return readAtom(q)
- def readAtom(q):
- return readLetter(q)
- def readLetter(q):
- tecken = q.dequeue()
- if tecken == "(":
- return readAtom(q)
- if tecken in versaler:
- if tecken + q.peek() in atomer:
- q.dequeue()
- return readnum(q)
- if tecken in atomer:
- return readnum(q)
- return Syntaxfel("Okänd atom vid radslutet " + radslut(q))
- if tecken == ")":
- if q.peek() not in lista3:
- return Syntaxfel('Saknad siffra vid radslutet ' + radslut(q))
- try:
- num = int(q.dequeue())
- return readAtom(q)
- except ValueError:
- return Syntaxfel('Saknad siffra vid radslutet ' + radslut(q))
- if not tecken:
- return
- if tecken in gemener:
- return Syntaxfel("Saknad stor bokstav vid radslutet " + radslut(q))
- return Syntaxfel('Felaktig gruppstart vid radslutet ' + radslut(q))
- def readnum(q):
- if q.isEmpty():
- return
- try:
- num = int(q.dequeue())
- except ValueError:
- return readAtom(q)
- if num == 1 and not q.peek() or num < 1:
- return Syntaxfel('För litet tal vid radslutet ' + radslut(q))
- else:
- while not q.isEmpty():
- num = q.dequeue()
- try:
- if int(num) < 0:
- return Syntaxfel('För litet tal vid radslutet ' + radslut(q))
- except ValueError:
- return readAtom(q)
- def printQueue(q):
- while not q.isEmpty():
- word = q.dequeue()
- print(word, end=" ")
- print()
- def radslut(q):
- q.dequeue()
- word = ''
- while not q.isEmpty():
- word += q.dequeue()
- return str(word)
- def storeSentence(mening):
- q = LinkedQ()
- mening = list(mening)
- for ordet in mening:
- q.enqueue(ordet)
- return q
- def kollaMolekylen(mening):
- q = storeSentence(mening)
- return readMolekyl(q)
- def main():
- #meningar = ["C(Xx4)5", "C(OH4)C", "C(OH4C", "H2O)Fe", "H0", "H1C", "H02C", "Nacl" "a", "(Cl)2)3)2"]
- #for mening in meningar:
- mening = "C(OH4C"
- syntaxfel = kollaMolekylen(mening)
- if not syntaxfel:
- print('Formeln är syntaktiskt korrekt')
- else:
- print(syntaxfel)
- main()
- if __name__ == "__main__":
- unittest.main()
- class Test(unittest.TestCase):
- def test_kollaMolekylen1(self):
- self.assertIsNone(kollaMolekylen('Na'))
- self.assertIsNone(kollaMolekylen('H2O'))
- self.assertIsNone(kollaMolekylen('Si(C3(COOH)2)4(H2O)7'))
- self.assertIsNone(kollaMolekylen('Na332'))
- def test_kollaMolekylen2(self):
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('C(Xx4)5')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('C(OH4)C')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('C(OH4C')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('H2O)Fe')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('H0')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('H1C')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('H02C')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('Nacl')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('a')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('(Cl)2)3')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen(')')
- with self.assertRaises(Syntaxfel):
- kollaMolekylen('2')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement