aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsienkiew <sienkiew@d34015c8-bcbb-4646-8ac8-8ba5febf221d>2011-09-23 14:03:46 -0400
committersienkiew <sienkiew@d34015c8-bcbb-4646-8ac8-8ba5febf221d>2011-09-23 14:03:46 -0400
commit2402b5a9be840e39749a245fea2a516da38a6f64 (patch)
tree8f881c4bada72c6c73be6c9fd855ed6b825a6ee0
parentd76e399d5a2eb254246896b060c13f6de26f504d (diff)
downloadexyapps-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.py43
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))