Neon_Falcon

Практика(Питон, вариант К)

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