Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def periodiska_systemet():
- list = ["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"]
- return list
- # Syntaxkontroll
- import string
- class Node:
- def __init__(self, value=None, next=None):
- self.value = value # Håller ett värde för noden
- self.next = next # Sätter en pekare på vilken nod som är nästa
- def __str__(self):
- return self.value # Returnerar värdet på noden
- class LinkedQ:
- def __init__(self):
- self.__first = None # Sätter en pekare på den första noden i kön
- self.__last = None # Sätter en pekare på den sista noden i kön
- def enqueue(self, value): # Metod för att lägga till noder i kön
- new_node = Node(value)
- if self.isEmpty():
- self.__first = new_node
- self.__last = new_node
- else:
- self.__last.next = new_node # Den senaste noden pekar nu på den nya tillagda noden
- self.__last = new_node # Den nya tillagda noden tilldelas den sista platsen
- def dequeue(self): # Metod för att ta ut den första noden i kön
- value = self.__first.value
- self.__first = self.__first.next # Sätter den som är efter till först i kön
- return value
- def isEmpty(self): # Kollar om kön är tom
- if self.__first is None:
- return True
- else:
- return False
- def peek(self):
- if not self.isEmpty():
- return self.__first.value
- else:
- return None
- class Syntaxfel(Exception):
- pass
- def errorPrinter(q):
- error_str = ""
- while not q.isEmpty():
- x = q.dequeue()
- x=str(x)
- error_str += x
- return error_str
- def LETTER(q):
- ALPHABET = alphabetmaker(2)
- tecken = q.dequeue()
- if tecken in ALPHABET:
- print(tecken)
- return tecken
- raise Syntaxfel("Saknad stor bokstav")
- def letter(q):
- alphabet = alphabetmaker(0)
- tecken = q.dequeue()
- if tecken in alphabet:
- print(tecken)
- return tecken
- raise Syntaxfel("Ska vara en stor bokstav")
- def num(q):
- number = q.dequeue()
- next = q.peek()
- if type(number) is int and number > 0:
- if type(next) is int:
- print(number)
- while type(next) is int:
- nextnumber = q.dequeue()
- next = q.peek()
- print(nextnumber)
- return
- if type(number) is int and number >= 2:
- print(number)
- return
- elif type(number) is int:
- raise Syntaxfel("För litet tal vid radslutet " + errorPrinter(q))
- else:
- raise Syntaxfel("String istället för int " + errorPrinter(q))
- # def num(q):
- #
- # number = q.dequeue()
- #
- # next = q.peek()
- #
- # if type(number) is int and number >= 2:
- # print(number)
- # while type(next) is int:
- #
- # nextnumber = q.dequeue()
- # next = q.peek()
- #
- # print(nextnumber)
- # return
- # if type(number) is int:
- # raise Syntaxfel("För litet tal vid radfel")
- # else:
- # raise Syntaxfel("String istället för int")
- #
- def readAtom(q):
- alphabet = alphabetmaker(0)
- LETTER_CAPITAL = LETTER(q)
- next = q.peek()
- if next in alphabet:
- letter_lower = letter(q)
- if LETTER_CAPITAL + letter_lower in periodiska_systemet():
- return
- raise Syntaxfel("Okänd atom vid radslutet " + errorPrinter(q))
- else:
- if LETTER_CAPITAL in periodiska_systemet():
- return
- raise Syntaxfel("readAtom2")
- def readGroup(q):
- alphabet = alphabetmaker(0)
- ALPHABET = alphabetmaker(2)
- next = q.peek()
- if next == "(":
- print(next)
- q.dequeue() # Tar ut "("
- readMol(q)
- # next = q.peek()
- # if next is ")":
- # print(next)
- # q.dequeue() # Tar ut ")"
- # next = q.peek()
- # if type(next) is int:
- # num(q)
- # return
- # raise Syntaxfel("Readgroup 2")
- # else: # if next is not ")":
- # raise Syntaxfel("Saknad högerparentes vid radslutet")
- if next is ")":
- print(next)
- next = q.peek()
- q.dequeue()
- if type(next) is int:
- num(q)
- return
- raise Syntaxfel("Saknad siffra vid radslutet " + errorPrinter(q))
- if next in ALPHABET:
- readAtom(q)
- next = q.peek()
- if type(next) is int:
- num(q)
- return
- if next is ")":
- raise Syntaxfel("Felaktig gruppstart vid radslutet " + errorPrinter(q))
- # else:
- # return
- if next is None:
- raise Syntaxfel("Saknad högerparentes vid radslutet") # Då next är Nonetype, finns det fler scenarion?
- if type(next) in alphabet: ############ fortsätt här
- def readMol(q):
- readGroup(q)
- next = q.peek()
- ALPHABET = alphabetmaker(2)
- alphabet = alphabetmaker(0)
- if next == "(":
- #print("next 1")
- readMol(q)
- return
- if next in ALPHABET:
- #print("next 2")
- readMol(q)
- return
- if next == ")":
- #print("next 3")
- readMol(q)
- if next in alphabet:
- raise Syntaxfel("Felaktig gruppstart")
- def readFormel(q):
- readMol(q)
- print("123klar\n")
- def makeLinkedQ(string):
- q = LinkedQ()
- string_int=["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
- for tecken in string:
- if tecken in string_int:
- q.enqueue(int(tecken))
- else:
- q.enqueue(tecken)
- return q
- def alphabetmaker(x):
- if x > 0:
- alph = string.ascii_uppercase
- else:
- alph = string.ascii_lowercase
- list = []
- for i in alph:
- list.append(i)
- return list
- def tryProgram(q):
- # q=makeQueueforFormel("sampleinput1")
- # q = makeLinkedQ("Aa4B7Cc33M33")
- #q = makeLinkedQ("Aa4B7Cc33M33")
- try:
- readFormel(q)
- print("Följer syntax")
- except Syntaxfel as fel:
- print(str(fel))
- def runProgram(file):
- with open(file, "r", encoding="utf-8") as r_file:
- print("Fil: ", file)
- for rad in r_file:
- rad = rad.strip()
- rad = rad.strip("\n")
- # print(rad)
- print("molekyl som testas: ", rad)
- if rad != "#":
- q = makeLinkedQ(rad)
- tryProgram(q)
- print(rad)
- print("_____________________________")
- runProgram("sampleinput2")
- # runProgram()
- ##########################
- # Nacl <- kolla för liten bokstav i readGroup.
- # a
- # (Cl)2)3
- # )
- 2
- #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement