~washort/pymeta/ometa-2

« back to all changes in this revision

Viewing changes to pymeta/builder.py

  • Committer: Allen Short
  • Date: 2009-11-10 06:40:06 UTC
  • mfrom: (43.2.9 error-reporting)
  • Revision ID: washort@allen-shorts-macbook-pro.local-20091110064006-og3a54tl6z0yyi75
MergeĀ "error-reporting"

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
import linecache, sys
3
3
from types import ModuleType as module
4
4
 
 
5
import itertools, linecache, sys
5
6
 
6
7
class TreeBuilder(object):
7
8
    """
75
76
    def _generate(self, retrn=False):
76
77
        result = self._generateNode(self.tree)
77
78
        if retrn:
78
 
            self.lines.append("return " + result)
 
79
            self.lines.append("return (%s, self.currentError)" % (result,))
79
80
        elif result:
80
81
            self.lines.append(result)
81
82
        return self.lines
105
106
        @param name: The name of the rule generating this thunk.
106
107
        @param expr: A list of lines of Python code.
107
108
        """
 
109
        
108
110
        subwriter = PythonWriter(expr)
109
 
        flines = subwriter._generate(retrn=True)
 
111
        flines  = subwriter._generate(retrn=True)
110
112
        fname = self._gensym(name)
111
113
        self._writeFunction(fname, (),  flines)
112
114
        return fname
118
120
        variable name bound to its value.
119
121
        """
120
122
        name = self._gensym(typ)
121
 
        self.lines.append("%s = %s" % (name, e))
 
123
        self.lines.append("%s, lastError = %s" % (name, e))
 
124
        self.lines.append("self.considerError(lastError)")
122
125
        return name
123
126
 
124
127
 
140
143
        Generate code for running embedded Python expressions.
141
144
        """
142
145
        
143
 
        return self._expr('python', 'eval(%r, self.globals, _locals)' %(expr,))
 
146
        return self._expr('python', 'eval(%r, self.globals, _locals), None' %(expr,))
144
147
 
145
148
 
146
149
    def generate_Apply(self, ruleName, codeName, rawArgs):
183
186
        """
184
187
        realf = self._newThunkFor("optional", expr)
185
188
        passf = self._gensym("optional")
186
 
        self._writeFunction(passf, (), ["pass"])
 
189
        self._writeFunction(passf, (), ["return (None, self.input.nullError())"])
187
190
        return self._expr('or', 'self._or([%s])' % (', '.join([realf, passf])))
188
191
 
189
192
 
270
273
        rulelines = ["_locals = {'self': self}",
271
274
                     "self.locals[%r] = _locals" % (name,)]
272
275
        subwriter = PythonWriter(expr)
273
 
        flines = subwriter._generate(retrn=True)
 
276
        flines  = subwriter._generate(retrn=True)
274
277
        rulelines.extend(flines)
275
278
        self._writeFunction("rule_" + name, ("self",), rulelines)
276
279