loader.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import os
  2. import sys
  3. from codecs import open
  4. from grammar_compiler_visitor import GrammarCompilerVisitor
  5. from hutnparser import Parser
  6. from meta_grammar import Grammar
  7. def dump(obj, nested_level=0, output=sys.stdout):
  8. spacing = ' '
  9. if type(obj) == dict:
  10. print >> output, '%s{' % ((nested_level) * spacing)
  11. for k, v in obj.items():
  12. if hasattr(v, '__iter__'):
  13. print >> output, '%s%s:' % ((nested_level + 1) * spacing, k)
  14. dump(v, nested_level + 1, output)
  15. else:
  16. print >> output, '%s%s: %s' % ((nested_level + 1) * spacing, k, v)
  17. print >> output, '%s}' % (nested_level * spacing)
  18. elif type(obj) == list:
  19. print >> output, '%s[' % ((nested_level) * spacing)
  20. for v in obj:
  21. if hasattr(v, '__iter__'):
  22. dump(v, nested_level + 1, output)
  23. else:
  24. print >> output, '%s%s' % ((nested_level + 1) * spacing, v)
  25. print >> output, '%s]' % ((nested_level) * spacing)
  26. else:
  27. print >> output, '%s%s' % (nested_level * spacing, obj)
  28. def read(n, *args):
  29. CUR_PATH = os.path.split(__file__)[0]
  30. with open(os.path.join(CUR_PATH, n), *args, encoding='utf-8') as f:
  31. return f.read()
  32. def loader(inputfile = './grammars/examples/meta_grammar.g', grammarfile = './grammars/examples/meta_grammar.g'):
  33. grammar = Grammar()
  34. # out1 = open('previous.rules', 'w')
  35. # dump(grammar.rules, 0, out1)
  36. # out2 = open('previous.tokens', 'w')
  37. # dump(grammar.tokens, 0, out2)
  38. result = parser = Parser(grammar, hide_implicit = True).parse(read(grammarfile))
  39. if(not result['status'] == Parser.Constants.Success):
  40. print 'not a valid grammar!'
  41. print result
  42. return
  43. tree = result['tree']
  44. visitor = GrammarCompilerVisitor()
  45. structure = visitor.visit(tree)
  46. grammar.rules = structure['rules']
  47. grammar.tokens = structure['tokens']
  48. # out3 = open('after.rules', 'w')
  49. # dump(structure['rules'], 0, out3)
  50. # out4 = open('after.tokens', 'w')
  51. # dump(structure['tokens'], 0, out4)
  52. result = parser = Parser(grammar, hide_implicit = True).parse(read(inputfile))
  53. if(not result['status'] == Parser.Constants.Success):
  54. print 'not a valid input file!'
  55. print result
  56. return
  57. Parser.DefaultPrinter().visit(result['tree'])
  58. Parser.PrettyPrinter().visit(result['tree'])
  59. if __name__ == "__main__":
  60. if(len(sys.argv) == 3):
  61. fileName = sys.argv[1]
  62. loader(sys.argv[1], sys.argv[2])
  63. else:
  64. loader()