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] == "(":
- 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], "подчерк"]
- 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] == "цифра" or status[i][1] == "подчерк":
- str2 = status[i][0]
- str1 = str1 + str2
- else:
- lexic.append([str1, "идентификатор"])
- break
- 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] == "запятая":
- lexic.append([status[i][0], "запятая"])
- 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][0] == "if":
- key.append("клслово1")
- i += 1
- elif lexic[i][0] == "then":
- key.append("клслово2")
- i += 1
- elif lexic[i][0] == "else":
- key.append("клслово3")
- 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): # синтаксический блок
- print(key)
- prim1 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim2 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim3 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim4 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim5 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim6 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim7 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim8 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim9 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim10 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'идентификатор',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim11 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'число без ариф_знака',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim12 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'число с ариф_знаком',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim13 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'число без ариф_знака',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim14 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'число с ариф_знаком',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim15 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'число без ариф_знака',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim16 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число без ариф_знака',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'идентификатор',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim17 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'число с ариф_знаком',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'идентификатор',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- prim18 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор',
- 'кв_скобка2', 'деление', 'идентификатор', 'кр_скобка1', 'идентификатор', 'кв_скобка1',
- 'число с ариф_знаком',
- 'кв_скобка2', 'кр_скобка2', 'тчкзпт']
- if key == prim1 or key == prim2 or key == prim3 or \
- key == prim4 or key == prim5 or key == prim6 or key == prim7 or \
- key == prim8 or key == prim9 or key == prim10 or key == prim11 or \
- key == prim12 or key == prim13 or key == prim14 or key == prim15 or \
- key == prim16 or key == prim17 or key == prim18:
- 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
Advertisement