Advertisement
YahiaOsama

Untitled

Apr 20th, 2019
87
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. class NimLexer(milestone_2Lexer):
  28. def __init__(self, input, output=None):
  29. super().__init__(input, output)
  30. self.token_queue = deque()
  31. self.indent_stack = [0]
  32. self.last_token = None
  33.  
  34. def insertIndent(self, indent_level):
  35. indent_token = self.createToken(milestone_2Parser.INDENT, " " * indent_level)
  36. self.indent_stack.append(indent_level)
  37. self.token_queue.append(indent_token)
  38.  
  39. def insertDedent(self):
  40. dedent_token = self.createToken(milestone_2Parser.DEDENT, "")
  41. self.token_queue.append(dedent_token)
  42. self.indent_stack.pop()
  43.  
  44. def nextToken(self):
  45. while not self.token_queue:
  46. token = super().nextToken()
  47. if token.type == self.NEWLINE:
  48. indent_level = token.text.count(" ")
  49. if indent_level > self.indent_stack[-1]:
  50. self.token_queue.append(token)
  51. self.insertIndent(indent_level)
  52. elif indent_level < self.indent_stack[-1]:
  53. self.token_queue.append(token)
  54. while self.indent_stack and self.indent_stack[-1] > indent_level:
  55. self.insertDedent()
  56. else:
  57. self.token_queue.append(token)
  58. elif token.type == token.EOF:
  59. # Encountered EOF, need to dedent all indents
  60. while self.indent_stack and self.indent_stack[-1] > 0:
  61. self.insertDedent()
  62. self.token_queue.append(token)
  63. else:
  64. self.token_queue.append(token)
  65. return self.token_queue.popleft()
  66.  
  67. def createToken(self, type, text):
  68. stop = self.getCharIndex()-1
  69. start = stop if text == "" else stop - len(text) + 1
  70. return CommonToken(
  71. self._tokenFactorySourcePair,
  72. type,
  73. self.DEFAULT_TOKEN_CHANNEL,
  74. start, stop
  75. )
  76.  
  77.  
  78. def get_token_type(token):
  79. if token.type == milestone_2Parser.EOF:
  80. return "EOF"
  81. return milestone_2Parser.symbolicNames[token.type]
  82.  
  83.  
  84. def print_tokens(input_stream):
  85. input_stream.seek(0)
  86. lexer = NimLexer(input_stream)
  87. token_stream = CommonTokenStream(lexer)
  88. parser = milestone_2Parser(token_stream)
  89. token = lexer.nextToken()
  90. while token.type != token.EOF:
  91. print(get_token_type(token))
  92. token = lexer.nextToken()
  93.  
  94. def check_validity(input_stream):
  95. input_stream.seek(0)
  96. lexer = NimLexer(input_stream)
  97. token_stream = CommonTokenStream(lexer)
  98. parser = milestone_2Parser(token_stream)
  99. parser.removeErrorListeners()
  100. parser.addErrorListener(NimErrorListener())
  101. walker = ParseTreeWalker()
  102. output = "valid"
  103. try:
  104. tree = parser.start()
  105. walker.walk(NimListener(),tree)
  106. except Exception as e:
  107. print("Nim Syntax Error: %s" % e.msg)
  108. output = "invalid"
  109. print(output)
  110.  
  111.  
  112. def main():
  113. with open(args.file, "r") as file:
  114. lines = file.read()
  115. input_stream = InputStream(lines)
  116. print_tokens(input_stream)
  117. check_validity(input_stream)
  118.  
  119. if __name__ == '__main__':
  120. parser = argparse.ArgumentParser(add_help=True, description='Sample Commandline')
  121.  
  122. parser.add_argument('--file', action="store", help="path of file to take as input", nargs="?", metavar="file")
  123.  
  124. args = parser.parse_args()
  125.  
  126. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement