Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys # для смены регистров
- def transliteration(data): # блок транслитерации
- status = list(range(0, len(data)))
- for i in range(0, len(data)):
- if data[i].isalpha() == True:
- status[i] = [data[i], "letter"]
- elif data[i].isdigit() == True:
- status[i] = [data[i], "digit"]
- elif data[i] == " ":
- status[i] = [data[i], "space"]
- elif data[i] == "+" and "-":
- status[i] = [data[i], "arithmetic sign"]
- elif data[i] == ",":
- status[i] = [data[i], "comma"]
- elif data[i] == "(":
- status[i] = [data[i], "bkt1"]
- elif data[i] == ")":
- status[i] = [data[i], "bkt2"]
- elif data[i] == ";":
- status[i] = [data[i], "semicolon"]
- break
- else:
- status[i] = [data[i], "error"]
- print("runtime error : unexpected symbol")
- a = "REJECT"
- vivod(a)
- sys.exit()
- return status
- def lexical(status): # лексический блок
- lexic = []
- i = 0
- t = len(status)
- while i < t:
- if status[i][1] == "letter":
- str1 = status[i][0]
- while True:
- i += 1
- if status[i][1] == "letter" or status[i][1] == "digit":
- str2 = status[i][0]
- str1 = str1 + str2
- else:
- lexic.append([str1, "identifier"])
- break
- elif status[i][1] == "arithmetic sign":
- str1 = status[i][0]
- while True:
- i += 1
- if status[i][1] == "digit":
- str2 = status[i][0]
- str1 = str1 + str2
- else:
- lexic.append([str1, "digit with arithmetic sign"])
- break
- elif status[i][1] == "digit":
- str1 = status[i][0]
- while True:
- i += 1
- if status[i][1] == "digit":
- str2 = status[i][0]
- str1 = str1 + str2
- else:
- lexic.append([str1, "digit without arithmetic sign"])
- break
- elif status[i][1] == "comma":
- lexic.append([status[i][0], "comma"])
- i += 1
- elif status[i][1] == "semicolon":
- lexic.append([status[i][0], "semicolon"])
- i += 1
- elif status[i][1] == "bkt1":
- lexic.append([status[i][0], "bkt1"])
- i += 1
- elif status[i][1] == "bkt2":
- lexic.append([status[i][0], "bkt2"])
- i += 1
- else:
- i += 1
- return lexic
- def keyword(lexic): # блок поиска ключевых слов
- key = []
- i = 0
- key_word_pascal = ["and", "end", "nil", "set", "array", "file", "not", "then", "begin", "for", "of", "to", "case", "function",
- "or", "type", "const", "goto", "packed", "until", "div", "if", "procedure", "var", "do", "in", "program",
- "while", "downto", "label", "record", "with", "else", "mod", "repeat"]
- while i < (len(lexic)):
- if lexic[i][0] == "repeat":
- key.append("keyword repeat")
- i += 1
- elif lexic[i][0] == "until":
- key.append("keyword until")
- i += 1
- elif lexic[i][1] == 'identifier':
- j = 0
- while j < len(key_word_pascal):
- if lexic[i][0] != key_word_pascal[j]:
- j += 1
- else:
- #key.append("keyword")
- lexic[i][1] ='keyword';
- break
- key.append(lexic[i][1])
- i += 1
- else:
- key.append(lexic[i][1])
- i += 1
- return key
- def syntax(key): # синтаксический блок
- prim1 = ['keyword repeat', 'identifier', 'bkt1', 'digit with arithmetic sign', 'bkt2',
- 'keyword until', 'identifier', 'bkt1', 'identifier', 'bkt2', 'semicolon']
- prim2 = ['keyword repeat', 'identifier', 'bkt1', 'digit without arithmetic sign', 'bkt2',
- 'keyword until', 'identifier', 'bkt1', 'identifier',
- 'bkt2', 'semicolon']
- prim3 = ['keyword repeat', 'identifier', 'bkt1',
- 'digit with arithmetic sign', 'bkt2', 'keyword until', 'identifier', 'bkt1', 'identifier',
- 'comma', 'identifier', 'bkt2', 'semicolon']
- prim4 = ['keyword repeat', 'identifier', 'bkt1',
- 'digit without arithmetic sign', 'bkt2', 'keyword until', 'identifier', 'bkt1', 'identifier',
- 'comma', 'identifier', 'bkt2', 'semicolon']
- prim5 = ['keyword repeat', 'identifier', 'bkt1', 'digit with arithmetic sign',
- 'bkt2', 'keyword until', 'identifier', 'bkt1', 'identifier', 'comma',
- 'identifier', 'comma', 'identifier', 'bkt2', 'semicolon']
- prim6 = ["keyword repeat", "identifier", "bkt1", "digit without arithmetic sign",
- "bkt2", "keyword until", "identifier", "bkt1", "identifier",
- "comma", "identifier", "comma", "identifier", "bkt2", "semicolon"]
- if key == prim1 or key == prim2 or key == prim3 or \
- key == prim4 or key == prim5 or key == prim6:
- return "ACCEPT"
- else:
- return "REJECT"
- def vvod(): # блок чтения цепочек из файла(ввод данных)
- f = open("input.txt") # открытие файла
- str = f.read() # чтение файла
- f.close()
- str = str.lower() # понижение регистра
- return str
- def vivod(a): # блок записи соответствия цепочеек в файл(вывод данных)
- w = open("output.txt", "w") # открытие файла для записи
- w.write(a)
- w.close()
- return print("The program is completed")
- def main(): # вызов всех подпрограмм
- str1 = vvod()
- status = transliteration(str1)
- lexic = lexical(status)
- key = keyword(lexic)
- vivod(syntax(key))
- return 0
- main()
Advertisement
Add Comment
Please, Sign In to add comment