Advertisement
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], "буква"]
- elif data[i].isdigit() == True:
- status[i] = [data[i], "цифра"]
- elif data[i] == " ":
- status[i] = [data[i], "пробел"]
- elif data[i] == "+" or data[i] == "-" or data[i] == "/" or data[i] == "*":
- status[i] = [data[i], "ариф_знак"]
- elif data[i] == "[":
- status[i] = [data[i], "кв_скобка1"]
- elif data[i] == "]":
- status[i] = [data[i], "кв_скобка2"]
- elif data[i] == "(":
- status[i] = [data[i], "кр_скобка1"]
- elif data[i] == ")":
- status[i] = [data[i], "кр_скобка2"]
- elif data[i] == "=":
- status[i] = [data[i], "равно"]
- elif data[i] == ":":
- status[i] = [data[i], "двтч"]
- elif data[i] == ";":
- status[i] = [data[i], "тчкзпт"]
- break
- else:
- status[i] = [data[i], "ошибка"]
- print("runtime error : unexpected symbol")
- a = "REJECT"
- vivod(a)
- sys.exit()
- return status
- def lexical(status): # лексический блок
- print(status)
- lexic = []
- i = 0
- t = len(status)
- while i < t:
- if status[i][1] == "буква":
- str1 = status[i][0]
- while True:
- i += 1
- if status[i][1] == "буква" or status[i][1] == "цифра":
- str2 = status[i][0]
- str1 = str1 + str2
- else:
- if str1 == 'div' or str1 == 'mod':
- lexic.append([str1, "ариф_знак"])
- break
- else:
- lexic.append([str1, "идентификатор"])
- break
- break
- elif status[i][1] == "ариф_знак":
- str1 = status[i][0]
- while True:
- i += 1
- if status[i][1] == "ариф_знак":
- a = "REJECT"
- vivod(a)
- sys.exit()
- elif status[i][1] != "цифра":
- lexic.append([str1, "ариф_знак"])
- break
- else:
- while True:
- if status[i][1] == "цифра":
- str2 = status[i][0]
- str1 = str1 + str2
- i += 1
- else:
- lexic.append([str1, "число с ариф_знаком"])
- break
- break
- elif status[i][1] == "цифра":
- str1 = status[i][0]
- while True:
- i += 1
- if status[i][1] == "цифра":
- str2 = status[i][0]
- str1 = str1 + str2
- else:
- lexic.append([str1, "число без ариф_знака"])
- break
- elif status[i][1] == "двтч" and status[i + 1][1] == "равно":
- lexic.append([status[i][0]+status[i + 1][0], "присваивание"])
- i += 2
- elif status[i][1] == "тчкзпт":
- lexic.append([status[i][0], "тчкзпт"])
- i += 1
- elif status[i][1] == "пробел":
- i += 1
- elif status[i][1] == "кв_скобка1":
- lexic.append([status[i][0], "кв_скобка1"])
- i += 1
- elif status[i][1] == "кв_скобка2":
- lexic.append([status[i][0], "кв_скобка2"])
- i += 1
- elif status[i][1] == "кр_скобка1":
- lexic.append([status[i][0], "кр_скобка1"])
- i += 1
- elif status[i][1] == "кр_скобка2":
- lexic.append([status[i][0], "кр_скобка2"])
- i += 1
- else:
- i += 1
- return lexic
- def keyword(lexic): # блок поиска ключевых слов
- print(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][1] == 'идентификатор':
- j = 0
- while j < len(key_word_pascal):
- if lexic[i][0] == key_word_pascal[j]:
- print("runtime error : unexpected symbol")
- a = "REJECT"
- vivod(a)
- sys.exit()
- else:
- j+=1
- key.append(lexic[i][1])
- i += 1
- else:
- key.append(lexic[i][1])
- i += 1
- return key
- def syntax(key): # синтаксический блок
- print(key)
- prim1 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число без ариф_знака', 'кр_скобка2',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число без ариф_знака', 'кр_скобка2',
- 'кв_скобка2', 'тчкзпт']
- prim2 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число без ариф_знака', 'кр_скобка2',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число с ариф_знаком', 'кр_скобка2',
- 'кв_скобка2', 'тчкзпт']
- prim3 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число с ариф_знаком', 'кр_скобка2',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число с ариф_знаком', 'кр_скобка2',
- 'кв_скобка2', 'тчкзпт']
- prim4 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число с ариф_знаком', 'кр_скобка2',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число без ариф_знака', 'кр_скобка2',
- 'кв_скобка2', 'тчкзпт']
- if key == prim1 or key == prim2 or key == prim3 or key == prim4:
- 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("Программа завершена.")
- 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
Advertisement