Skip to content

Commit

Permalink
Merge efb5830 into 30e706e
Browse files Browse the repository at this point in the history
  • Loading branch information
vsajip committed Aug 22, 2013
2 parents 30e706e + efb5830 commit 8096ae5
Show file tree
Hide file tree
Showing 19 changed files with 171 additions and 89 deletions.
2 changes: 2 additions & 0 deletions .travis.yml
Expand Up @@ -2,6 +2,8 @@ language: python
python:
- "2.6"
- "2.7"
- "3.2"
- "3.3"

install:
- "pip install pytest Twisted coveralls . --use-mirrors"
Expand Down
2 changes: 1 addition & 1 deletion examples/exceptions.py
Expand Up @@ -27,7 +27,7 @@

testSource = "<html<title>Yes</title><body><h1>Man, HTML is <i>great</i>.</h1><p>How could you even <b>think</b> otherwise?</p><img src='HIPPO.JPG'></img><a href='http://twistedmatrix.com'>A Good Website</a></body></html>"

print unwrapGrammar(TinyHTML)(testSource).apply('tag')
print(unwrapGrammar(TinyHTML)(testSource).apply('tag'))

# The "tag" rule uses the custom label construct "^ (valid tag)".
# When this rule fails, the exception raised will say
Expand Down
2 changes: 1 addition & 1 deletion examples/minml.py
Expand Up @@ -27,4 +27,4 @@

testSource = "<html><title>Yes</title><body><h1>Man, HTML is <i>great</i>.</h1><p>How could you even <b>think</b> otherwise?</p><img src='HIPPO.JPG'></img><a href='http://twistedmatrix.com'>A Good Website</a></body></html>"

print TinyHTML(testSource).html()
print(TinyHTML(testSource).html())
12 changes: 7 additions & 5 deletions examples/test_parsley_json.py
@@ -1,3 +1,5 @@
from __future__ import unicode_literals

from parsley_json import JSONParser
import unittest

Expand All @@ -17,11 +19,11 @@ def test_float(self):
self.assertEqual(JSONParser("1.2E6").number(), 1.2E6)

def test_string(self):
self.assertEqual(JSONParser('u2603').escapedUnicode(), u"\u2603")
self.assertEqual(JSONParser('"foo"').string(), u"foo")
self.assertEqual(JSONParser(r'"foo\n"').string(), u"foo\n")
self.assertEqual(JSONParser(r'"foo\rbaz\u2603"').string(), u"foo\rbaz\u2603")
self.assertEqual(JSONParser(r'"\\\/\b\"\f\t"').string(), u'\\/\b"\f\t')
self.assertEqual(JSONParser('u2603').escapedUnicode(), "\u2603")
self.assertEqual(JSONParser('"foo"').string(), "foo")
self.assertEqual(JSONParser(r'"foo\n"').string(), "foo\n")
self.assertEqual(JSONParser(r'"foo\rbaz\u2603"').string(), "foo\rbaz\u2603")
self.assertEqual(JSONParser(r'"\\\/\b\"\f\t"').string(), '\\/\b"\f\t')

def test_literals(self):
self.assertEqual(JSONParser(r'true').value(), True)
Expand Down
7 changes: 5 additions & 2 deletions ometa/builder.py
@@ -1,6 +1,9 @@
# -*- test-case-name: ometa.test.test_builder -*-
import ast
from StringIO import StringIO
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
from types import ModuleType as module
import linecache, sys
from terml.nodes import Term, Tag, coerceToTerm
Expand Down Expand Up @@ -437,7 +440,7 @@ def get_source(self, name):


def moduleFromGrammar(source, className, modname, filename):
mod = module(modname)
mod = module(str(modname))
mod.__name__ = modname
mod.__loader__ = GeneratedCodeLoader(source)
code = compile(source, filename, "exec")
Expand Down
5 changes: 4 additions & 1 deletion ometa/grammar.py
Expand Up @@ -5,7 +5,10 @@
"""
import os.path
import string
from StringIO import StringIO
try:
from StringIO import StringIO
except ImportError:
from io import StringIO

from terml.nodes import termMaker as t
import ometa
Expand Down
53 changes: 37 additions & 16 deletions ometa/interp.py
@@ -1,4 +1,14 @@
import string

try:
xrange
except NameError:
xrange = range
try:
basestring
except NameError:
basestring = str

from ometa.runtime import (InputStream, ParseError, EOFError, ArgInput,
joinErrors, expected, LeftRecursion)

Expand Down Expand Up @@ -26,7 +36,7 @@ def __init__(self, grammar, ruleName, callback=None, globals=None):
self.callback = callback
self.globals = globals or {}
self.rules = decomposeGrammar(grammar)
self.next = self.apply(ruleName, None, ())
self.next_ = self.apply(ruleName, None, ())
self._localsStack = []
self.currentResult = None
self.input = InputStream([], 0)
Expand All @@ -45,7 +55,7 @@ def receive(self, buf):
raise ValueError("Can't feed a parser that's been ended.")
self.input.data.extend(buf)
x = None
for x in self.next:
for x in self.next_:
if x is _feed_me:
return x
if self.callback:
Expand All @@ -62,7 +72,7 @@ def end(self):
return
self.ended = True
x = None
for x in self.next:
for x in self.next_:
pass
if self.callback:
self.callback(*x)
Expand All @@ -82,8 +92,12 @@ def _apply(self, rule, ruleName, args):
@param args: A sequence of arguments to it.
"""
if args:
if ((not getattr(rule, 'func_code', None))
or rule.func_code.co_argcount - 1 != len(args)):
if basestring is str:
attrname = '__code__'
else:
attrname = 'func_code'
if ((not getattr(rule, attrname, None))
or getattr(rule, attrname).co_argcount - 1 != len(args)):
for arg in args[::-1]:
self.input = ArgInput(arg, self.input)
g = rule()
Expand Down Expand Up @@ -249,7 +263,7 @@ def parse_Or(self, expr):
self.currentError = joinErrors(errors)
yield x
return
except ParseError, err:
except ParseError as err:
errors.append(err)
self.input = i
raise self.err(joinErrors(errors))
Expand All @@ -268,7 +282,8 @@ def parse_Many(self, expr, ans=None):
if x is _feed_me: yield x
ans.append(x[0])
self.currentError = x[1]
except ParseError, err:
except ParseError as e:
err = e
self.input = m
break
yield ans, err
Expand Down Expand Up @@ -321,7 +336,8 @@ def parse_Repeat(self, min, max, expr):
if x is _feed_me: yield x
v, e = x
ans.append(v)
except ParseError, e:
except ParseError as err:
e = err
self.input = m
break
yield ans, e
Expand Down Expand Up @@ -368,10 +384,10 @@ def parse_Label(self, expr, label_term):
for x in self._eval(expr):
if x is _feed_me:
yield x
print "^^", label
print("^^ %s" % label)
self.currentError = x[1].withMessage([("Custom Exception:", label, None)])
yield x[0], self.currentError
except ParseError, e:
except ParseError as e:
raise self.err(e.withMessage([("Custom Exception:", label, None)]))


Expand Down Expand Up @@ -456,7 +472,7 @@ def rule_letter(self):
except EOFError:
yield _feed_me
val, p = self.input.head()
if val in string.letters:
if val in getattr(string, 'letters', string.ascii_letters):
self.input = self.input.tail()
yield val, p
else:
Expand Down Expand Up @@ -492,6 +508,9 @@ def __init__(self, grammar, base, globals=None):
self.rules = {}
self._localsStack = []
self._globals = globals or {}
if basestring is str:
self._globals['basestring'] = str
self._globals['unichr'] = chr
self.rules = decomposeGrammar(grammar)
self.run = None
self._spanStart = 0
Expand Down Expand Up @@ -543,7 +562,7 @@ def _eval(self, run, expr):
try:
val, err = self._eval(run, args[0])
return val, err.withMessage([("Custom Exception:", label, None)])
except ParseError, e:
except ParseError as e:
raise e.withMessage([("Custom Exception:", label, None)])

elif name == "Token":
Expand All @@ -559,7 +578,8 @@ def _eval(self, run, expr):
m = run.input
v, _ = self._eval(run, args[0])
ans.append(v)
except ParseError, err:
except ParseError as e:
err = e
run.input = m
break
return ans, err
Expand Down Expand Up @@ -587,7 +607,8 @@ def _eval(self, run, expr):
m = run.input
v, e = self._eval(run, args[2])
ans.append(v)
except ParseError, e:
except ParseError as err:
e = err
run.input = m
break
return ans, e
Expand All @@ -609,7 +630,7 @@ def _eval(self, run, expr):
ret, err = x
errors.append(err)
return ret, joinErrors(errors)
except ParseError, err:
except ParseError as err:
errors.append(err)
run.input = m
raise joinErrors(errors)
Expand All @@ -619,7 +640,7 @@ def _eval(self, run, expr):
m = run.input
try:
self._eval(run, args[0])
except ParseError, err:
except ParseError as err:
run.input = m
return True, run.input.nullError()
else:
Expand Down
47 changes: 31 additions & 16 deletions ometa/runtime.py
Expand Up @@ -7,6 +7,12 @@
from terml.nodes import coerceToTerm, Term, termMaker as t
from ometa.builder import moduleFromGrammar, writePython

try:
basestring
except NameError:
basestring = str
unicode = str

TIMING = False

class ParseError(Exception):
Expand Down Expand Up @@ -189,7 +195,7 @@ def fromIterable(cls, iterable):
"""
if isinstance(iterable, (character, unicodeCharacter)):
raise TypeError("Characters are not iterable")
if isinstance(iterable, str):
if isinstance(iterable, bytes):
return WrappedValueInputStream(iterable, 0, wrapper=character)
elif isinstance(iterable, unicode):
return WrappedValueInputStream(iterable, 0,
Expand Down Expand Up @@ -391,7 +397,9 @@ def __init__(self, input, globals=None, name='<string>', tree=False,
self.globals = {}
else:
self.globals = globals

if basestring is str:
self.globals['basestring'] = str
self.globals['unichr'] = chr
self.currentError = self.input.nullError()

def considerError(self, error, typ=None):
Expand Down Expand Up @@ -466,8 +474,12 @@ def _apply(self, rule, ruleName, args):
@param args: A sequence of arguments to it.
"""
if args:
if ((not getattr(rule, 'func_code', None))
or rule.func_code.co_argcount - 1 != len(args)):
if basestring is str:
attrname = '__code__'
else:
attrname = 'func_code'
if ((not getattr(rule, attrname, None))
or getattr(rule, attrname).co_argcount - 1 != len(args)):
for arg in args[::-1]:
self.input = ArgInput(arg, self.input)
return rule()
Expand All @@ -481,7 +493,7 @@ def _apply(self, rule, ruleName, args):
try:
memoRec = self.input.setMemo(ruleName,
[rule(), self.input])
except ParseError, e:
except ParseError as e:
e.trail.append(ruleName)
raise
if lr.detected:
Expand Down Expand Up @@ -541,7 +553,8 @@ def many(self, fn, *initial):
m = self.input
v, _ = fn()
ans.append(v)
except ParseError, e:
except ParseError as err:
e = err
self.input = m
break
return ans, e
Expand All @@ -565,7 +578,8 @@ def repeat(self, min, max, fn):
m = self.input
v, e = fn()
ans.append(v)
except ParseError, e:
except ParseError as err:
e = err
self.input = m
break
return ans, e
Expand All @@ -584,7 +598,7 @@ def _or(self, fns):
ret, err = f()
errors.append(err)
return ret, joinErrors(errors)
except ParseError, e:
except ParseError as e:
errors.append(e)
self.input = m
raise joinErrors(errors)
Expand Down Expand Up @@ -613,7 +627,7 @@ def eatWhitespace(self):
while True:
try:
c, e = self.input.head()
except EOFError, e:
except EOFError as e:
break
tl = self.input.tail()
if c.isspace():
Expand Down Expand Up @@ -729,7 +743,7 @@ def token(self, tok):
for c in tok:
v, e = self.exactly(c)
return tok, e
except ParseError, e:
except ParseError as e:
self.input = m
raise e.withMessage(expected("token", tok))

Expand All @@ -743,7 +757,7 @@ def label(self, foo, label):
if self.currentError == err:
self.currentError = err2
return val, err2
except ParseError, e:
except ParseError as e:
raise e.withMessage([("Custom Exception:", label, None)])


Expand Down Expand Up @@ -821,17 +835,17 @@ def makeGrammar(cls, grammar, name='Grammar'):
start = time.time()
tree = g.parseGrammar(name)
if TIMING:
print "Grammar %r parsed in %g secs" % (name, time.time() - start)
print("Grammar %r parsed in %g secs" % (name, time.time() - start))
def cnt(n):
count = sum(cnt(a) for a in n.args) + 1
return count
print "%d nodes." % (cnt(tree))
print("%d nodes." % (cnt(tree)))
start = time.time()
modname = "pymeta_grammar__" + name
filename = "/pymeta_generated_code/" + modname + ".py"
source = writePython(tree, grammar)
if TIMING:
print "Grammar %r generated in %g secs" % (name, time.time() - start)
print("Grammar %r generated in %g secs" % (name, time.time() - start))
return moduleFromGrammar(source, name, modname, filename)


Expand Down Expand Up @@ -927,7 +941,7 @@ def eatWhitespace(self):
while True:
try:
c, e = self.input.head()
except EOFError, e:
except EOFError as e:
break
t = self.input.tail()
if c.isspace() or consumingComment:
Expand Down Expand Up @@ -956,7 +970,8 @@ def pythonExpr(self, endChars="\r\n"):
try:
c, e = self.rule_anything()
endchar = c
except ParseError, e:
except ParseError as err:
e = err
endchar = None
break
if c in endChars and len(stack) == 0:
Expand Down

0 comments on commit 8096ae5

Please sign in to comment.