diff options
author | sienkiew <sienkiew@d34015c8-bcbb-4646-8ac8-8ba5febf221d> | 2011-09-23 14:03:46 -0400 |
---|---|---|
committer | sienkiew <sienkiew@d34015c8-bcbb-4646-8ac8-8ba5febf221d> | 2011-09-23 14:03:46 -0400 |
commit | 2402b5a9be840e39749a245fea2a516da38a6f64 (patch) | |
tree | 8f881c4bada72c6c73be6c9fd855ed6b825a6ee0 | |
parent | d76e399d5a2eb254246896b060c13f6de26f504d (diff) | |
download | exyapps-2402b5a9be840e39749a245fea2a516da38a6f64.tar.gz |
store the runtime code inline in the generated parser
git-svn-id: http://svn.stsci.edu/svn/ssb/etal/exyapps/trunk@428 d34015c8-bcbb-4646-8ac8-8ba5febf221d
-rw-r--r-- | exyapps/parsetree.py | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/exyapps/parsetree.py b/exyapps/parsetree.py index 8831609..5e38665 100644 --- a/exyapps/parsetree.py +++ b/exyapps/parsetree.py @@ -19,6 +19,17 @@ The main logic of Yapps is in this module. import sys, re +import os.path + +# load the contents of the runtime file into memory; it will be +# incorporated into the parser later. +runtime_py_filename = os.path.dirname(__file__)+"/runtime.py" +f = open( runtime_py_filename ,"r") +runtime_contents = f.read() +f.close() +del f + + ###################################################################### INDENT = ' '*4 class Generator: @@ -31,6 +42,7 @@ class Generator: self.options = options self.preparser = '' self.postparser = None + self.inline_runtime = 1 self.tokens = {} # Map from tokens to regexps self.ignore = {} # List of token names to ignore in parsing, map to statements @@ -272,21 +284,30 @@ class Generator: self.write(self.preparser) self.write("# Begin -- grammar generated by Yapps\n") self.write("import sys, re\n") - self.write("from exyapps import runtime\n") + + # + if self.inline_runtime : + self.write("###### included from %s\n"%runtime_py_filename) + self.write(runtime_contents) + self.write("###### end of runtime.py\n") + else : + self.write("from exyapps.runtime import SyntaxError, NoMoreTokens, Token, Scanner, Parser, Context, print_error, wrap_error_reporter\n") + self.write("\n") - self.write("class ", self.name, "Scanner(runtime.Scanner):\n") + + self.write("class %sScanner(Scanner):\n" % self.name ) self.write(" patterns = [\n") for p in self.terminals: self.write(" (%s, re.compile(%s)),\n" % ( repr(p), repr(self.tokens[p]))) self.write(" ]\n") self.write(" def __init__(self, str,*args,**kw):\n") - self.write(" runtime.Scanner.__init__(self,None,%s,str,*args,**kw)\n" % + self.write(" Scanner.__init__(self,None,%s,str,*args,**kw)\n" % self.repr_ignore()) self.write("\n") - self.write("class ", self.name, "(runtime.Parser):\n") - self.write(INDENT, "Context = runtime.Context\n") + self.write("class ", self.name, "(Parser):\n") + self.write(INDENT, "Context = Context\n") for r in self.goals: self.write(INDENT, "def ", r, "(self") if self.params[r]: self.write(", ", self.params[r]) @@ -298,8 +319,8 @@ class Generator: self.write("\n") self.write("def parse(rule, text):\n") - self.write(" P = ", self.name, "(", self.name, "Scanner(text))\n") - self.write(" return runtime.wrap_error_reporter(P, rule)\n") + self.write(" P = %s(%sScanner(text))\n"%( self.name, self.name) ) + self.write(" return wrap_error_reporter(P, rule)\n") self.write("\n") if self.postparser is not None: self.write("# End -- grammar generated by Yapps\n") @@ -562,7 +583,7 @@ class Choice(Node): if tokens_unseen: gen.write(indent, "else:\n") - gen.write(indent, INDENT, "raise runtime.SyntaxError(_token[0], ") + gen.write(indent, INDENT, "raise SyntaxError(_token[0], ") gen.write("'Could not match ", self.rule, "')\n") class Wrapper(Node): @@ -605,7 +626,7 @@ class Option(Wrapper): if gen.has_option('context-insensitive-scanner'): gen.write(indent, "if %s:\n" % gen.not_peek_test(gen.non_ignored_tokens(), self.follow)) - gen.write(indent+INDENT, "raise runtime.SyntaxError(pos=self._scanner.get_pos(), context=_context, msg='Need one of ' + ', '.join(%s))\n" % + gen.write(indent+INDENT, "raise SyntaxError(pos=self._scanner.get_pos(), context=_context, msg='Need one of ' + ', '.join(%s))\n" % repr(self.first)) @@ -638,7 +659,7 @@ class Plus(Wrapper): if gen.has_option('context-insensitive-scanner'): gen.write(indent, "if %s:\n" % gen.not_peek_test(gen.non_ignored_tokens(), self.follow)) - gen.write(indent+INDENT, "raise runtime.SyntaxError(pos=self._scanner.get_pos(), context=_context, msg='Need one of ' + ', '.join(%s))\n" % + gen.write(indent+INDENT, "raise SyntaxError(pos=self._scanner.get_pos(), context=_context, msg='Need one of ' + ', '.join(%s))\n" % repr(self.first)) @@ -669,6 +690,6 @@ class Star(Wrapper): if gen.has_option('context-insensitive-scanner'): gen.write(indent, "if %s:\n" % gen.not_peek_test(gen.non_ignored_tokens(), self.follow)) - gen.write(indent+INDENT, "raise runtime.SyntaxError(pos=self._scanner.get_pos(), context=_context, msg='Need one of ' + ', '.join(%s))\n" % + gen.write(indent+INDENT, "raise SyntaxError(pos=self._scanner.get_pos(), context=_context, msg='Need one of ' + ', '.join(%s))\n" % repr(self.first)) |