YahiaOsama

Untitled

Apr 19th, 2019
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | None | 0 0
  1. import argparse
  2. from collections import deque
  3. from antlr4 import *
  4. from milestone_2Lexer import milestone_2Lexer
  5. from milestone_2Listener import milestone_2Listener
  6. from antlr4.error.ErrorListener import *
  7. from antlr4.error.Errors import RecognitionException
  8. from milestone_2Parser import milestone_2Parser
  9. from antlr4.tree.Trees import Trees
  10. from antlr4.Token import CommonToken
  11.  
  12. class NimSyntaxError(Exception):
  13. def __init__(self, symbol, line, column, msg):
  14. self.symbol = symbol
  15. self.line = line
  16. self.column = column
  17. self.msg = "At line %d, column %d: %s" % (line, column, msg)
  18.  
  19. class NimErrorListener(ErrorListener):
  20. def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
  21. raise NimSyntaxError(offendingSymbol, line, column, msg)
  22.  
  23. class NimListener(milestone_2Listener):
  24. def enterEveryRule(self, ctx):
  25. #print("Entered rule: %s" % ctx.getText())
  26. pass
  27.  
  28. class NimLexer(milestone_2Lexer):
  29. def __init__(self, input, output=None):
  30. super().__init__(input, output)
  31. self.token_queue = deque()
  32. self.indent_stack = [0]
  33. self.last_token = None
  34.  
  35. def insertIndent(self, indent_level):
  36. indent_token = self.createToken(milestone_2Parser.INDENT, " " * indent_level)
  37. self.indent_stack.append(indent_level)
  38. self.token_queue.append(indent_token)
  39.  
  40. def insertDedent(self):
  41. dedent_token = self.createToken(milestone_2Parser.DEDENT, "")
  42. self.token_queue.append(dedent_token)
  43. self.indent_stack.pop()
  44.  
  45. def nextToken(self):
  46. while not self.token_queue:
  47. token = super().nextToken()
  48. if token.type == self.NEWLINE:
  49. indent_level = token.text.count(" ")
  50. if indent_level > self.indent_stack[-1]:
  51. self.token_queue.append(token)
  52. self.insertIndent(indent_level)
  53. elif indent_level < self.indent_stack[-1]:
  54. self.token_queue.append(token)
  55. while self.indent_stack and self.indent_stack[-1] > indent_level:
  56. self.insertDedent()
  57. else:
  58. self.token_queue.append(token)
  59. elif token.type == token.EOF:
  60. # Encountered EOF, need to dedent all indents
  61. while self.indent_stack and self.indent_stack[-1] > 0:
  62. self.insertDedent()
  63. self.token_queue.append(token)
  64. else:
  65. self.token_queue.append(token)
  66. return self.token_queue.popleft()
  67.  
  68. def createToken(self, type, text):
  69. stop = self.getCharIndex()-1
  70. start = stop if text == "" else stop - len(text) + 1
  71. return CommonToken(
  72. self._tokenFactorySourcePair,
  73. type,
  74. self.DEFAULT_TOKEN_CHANNEL,
  75. start, stop
  76. )
  77.  
  78.  
  79. def get_token_type(token):
  80. if token.type == milestone_2Parser.EOF:
  81. return "EOF"
  82. return milestone_2Parser.symbolicNames[token.type]
  83.  
  84.  
  85. def print_tokens(input_stream):
  86. input_stream.seek(0)
  87. lexer = NimLexer(input_stream)
  88. token_stream = CommonTokenStream(lexer)
  89. parser = milestone_2Parser(token_stream)
  90. token = lexer.nextToken()
  91. while token.type != token.EOF:
  92. print(get_token_type(token))
  93. token = lexer.nextToken()
  94.  
  95. def check_validity(input_stream):
  96. input_stream.seek(0)
  97. lexer = NimLexer(input_stream)
  98. token_stream = CommonTokenStream(lexer)
  99. parser = milestone_2Parser(token_stream)
  100. parser.removeErrorListeners()
  101. parser.addErrorListener(NimErrorListener())
  102. walker = ParseTreeWalker()
  103. output = "valid"
  104. try:
  105. tree = parser.start()
  106. walker.walk(NimListener(),tree)
  107. except Exception as e:
  108. print("Nim Syntax Error: %s" % e.msg)
  109. output = "invalid"
  110. print(output)
  111.  
  112.  
  113. def main():
  114. with open(args.file, "r") as file:
  115. lines = file.read()
  116. input_stream = InputStream(lines)
  117. print_tokens(input_stream)
  118. check_validity(input_stream)
  119.  
  120. if __name__ == '__main__':
  121. parser = argparse.ArgumentParser(add_help=True, description='Sample Commandline')
  122.  
  123. parser.add_argument('--file', action="store", help="path of file to take as input", nargs="?", metavar="file")
  124.  
  125. args = parser.parse_args()
  126.  
  127. main()
Add Comment
Please, Sign In to add comment