Advertisement
Guest User

Untitled

a guest
Jul 24th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.41 KB | None | 0 0
  1. import sys # для смены регистров
  2.  
  3.  
  4. def transliteration(data): # блок транслитерации
  5.  
  6. status = list(range(0, len(data)))
  7.  
  8. for i in range(0, len(data)):
  9.  
  10. if data[i].isalpha() == True:
  11. status[i] = [data[i], "буква"]
  12.  
  13. elif data[i].isdigit() == True:
  14. status[i] = [data[i], "цифра"]
  15.  
  16. elif data[i] == " ":
  17. status[i] = [data[i], "пробел"]
  18.  
  19. elif data[i] == "+" or data[i] == "-" or data[i] == "/" or data[i] == "*":
  20. status[i] = [data[i], "ариф_знак"]
  21.  
  22. elif data[i] == "[":
  23. status[i] = [data[i], "кв_скобка1"]
  24.  
  25. elif data[i] == "]":
  26. status[i] = [data[i], "кв_скобка2"]
  27.  
  28. elif data[i] == "(":
  29. status[i] = [data[i], "кр_скобка1"]
  30.  
  31. elif data[i] == ")":
  32. status[i] = [data[i], "кр_скобка2"]
  33.  
  34. elif data[i] == "=":
  35. status[i] = [data[i], "равно"]
  36.  
  37. elif data[i] == ":":
  38. status[i] = [data[i], "двтч"]
  39.  
  40. elif data[i] == ";":
  41. status[i] = [data[i], "тчкзпт"]
  42. break
  43. else:
  44. status[i] = [data[i], "ошибка"]
  45. print("runtime error : unexpected symbol")
  46. a = "REJECT"
  47. vivod(a)
  48. sys.exit()
  49.  
  50. return status
  51.  
  52.  
  53. def lexical(status): # лексический блок
  54. print(status)
  55. lexic = []
  56. i = 0
  57. t = len(status)
  58. while i < t:
  59. if status[i][1] == "буква":
  60. str1 = status[i][0]
  61. while True:
  62. i += 1
  63. if status[i][1] == "буква" or status[i][1] == "цифра":
  64. str2 = status[i][0]
  65. str1 = str1 + str2
  66. else:
  67. if str1 == 'div' or str1 == 'mod':
  68. lexic.append([str1, "ариф_знак"])
  69. break
  70. else:
  71. lexic.append([str1, "идентификатор"])
  72. break
  73. break
  74. elif status[i][1] == "ариф_знак":
  75. str1 = status[i][0]
  76. while True:
  77. i += 1
  78. if status[i][1] == "ариф_знак":
  79. a = "REJECT"
  80. vivod(a)
  81. sys.exit()
  82. elif status[i][1] != "цифра":
  83. lexic.append([str1, "ариф_знак"])
  84. break
  85. else:
  86. while True:
  87. if status[i][1] == "цифра":
  88. str2 = status[i][0]
  89. str1 = str1 + str2
  90. i += 1
  91. else:
  92. lexic.append([str1, "число с ариф_знаком"])
  93. break
  94. break
  95. elif status[i][1] == "цифра":
  96. str1 = status[i][0]
  97. while True:
  98. i += 1
  99. if status[i][1] == "цифра":
  100. str2 = status[i][0]
  101. str1 = str1 + str2
  102. else:
  103. lexic.append([str1, "число без ариф_знака"])
  104. break
  105. elif status[i][1] == "двтч" and status[i + 1][1] == "равно":
  106. lexic.append([status[i][0]+status[i + 1][0], "присваивание"])
  107. i += 2
  108. elif status[i][1] == "тчкзпт":
  109. lexic.append([status[i][0], "тчкзпт"])
  110. i += 1
  111. elif status[i][1] == "пробел":
  112. i += 1
  113. elif status[i][1] == "кв_скобка1":
  114. lexic.append([status[i][0], "кв_скобка1"])
  115. i += 1
  116. elif status[i][1] == "кв_скобка2":
  117. lexic.append([status[i][0], "кв_скобка2"])
  118. i += 1
  119. elif status[i][1] == "кр_скобка1":
  120. lexic.append([status[i][0], "кр_скобка1"])
  121. i += 1
  122. elif status[i][1] == "кр_скобка2":
  123. lexic.append([status[i][0], "кр_скобка2"])
  124. i += 1
  125.  
  126. else:
  127. i += 1
  128. return lexic
  129.  
  130.  
  131. def keyword(lexic): # блок поиска ключевых слов
  132. print(lexic)
  133. key = []
  134. i = 0
  135. key_word_pascal = ["and", "end", "nil", "set", "array", "file", "not", "then", "begin", "for", "of", "to", "case",
  136. "function",
  137. "or", "type", "const", "goto", "packed", "until", "div", "if", "procedure", "var", "do", "in",
  138. "program",
  139. "while", "downto", "label", "record", "with", "else", "mod", "repeat"]
  140. while i < (len(lexic)):
  141. if lexic[i][1] == 'идентификатор':
  142. j = 0
  143. while j < len(key_word_pascal):
  144. if lexic[i][0] == key_word_pascal[j]:
  145. print("runtime error : unexpected symbol")
  146. a = "REJECT"
  147. vivod(a)
  148. sys.exit()
  149. else:
  150. j+=1
  151. key.append(lexic[i][1])
  152. i += 1
  153.  
  154. else:
  155. key.append(lexic[i][1])
  156. i += 1
  157. return key
  158.  
  159.  
  160. def syntax(key): # синтаксический блок
  161. print(key)
  162. prim1 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число без ариф_знака', 'кр_скобка2',
  163. 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число без ариф_знака', 'кр_скобка2',
  164. 'кв_скобка2', 'тчкзпт']
  165.  
  166. prim2 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число без ариф_знака', 'кр_скобка2',
  167. 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число с ариф_знаком', 'кр_скобка2',
  168. 'кв_скобка2', 'тчкзпт']
  169.  
  170. prim3 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число с ариф_знаком', 'кр_скобка2',
  171. 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число с ариф_знаком', 'кр_скобка2',
  172. 'кв_скобка2', 'тчкзпт']
  173.  
  174. prim4 = ['идентификатор', 'присваивание', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число с ариф_знаком', 'кр_скобка2',
  175. 'кв_скобка2', 'ариф_знак', 'идентификатор', 'кв_скобка1', 'идентификатор', 'кр_скобка1', 'число без ариф_знака', 'кр_скобка2',
  176. 'кв_скобка2', 'тчкзпт']
  177.  
  178.  
  179. if key == prim1 or key == prim2 or key == prim3 or key == prim4:
  180. return "ACCEPT"
  181. else:
  182. return "REJECT"
  183.  
  184.  
  185. def vvod(): # блок чтения цепочек из файла(ввод данных)
  186. f = open("input.txt") # открытие файла
  187. str = f.read() # чтение файла
  188. f.close()
  189. str = str.lower() # понижение регистра
  190. return str
  191.  
  192.  
  193. def vivod(a): # блок записи соответствия цепочеек в файл(вывод данных)
  194. w = open("output.txt", "w") # открытие файла для записи
  195. w.write(a)
  196. w.close()
  197. return print("Программа завершена.")
  198.  
  199.  
  200. def main(): # вызов всех подпрограмм
  201. str1 = vvod()
  202. status = transliteration(str1)
  203. lexic = lexical(status)
  204. key = keyword(lexic)
  205. vivod(syntax(key))
  206. return 0
  207.  
  208.  
  209. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement