--- yapps2-2.2.1.orig/doc/yapps2.tex
+++ yapps2-2.2.1/doc/yapps2.tex
@@ -795,7 +795,7 @@ import Xparser
 
 class MyX(Xparser.X):
     def printmsg(self):
-        print "Hello!"
+        print("Hello!")
 \end{verbatim}
 
 \mysubsection{Customizing Scanners}
@@ -924,7 +924,7 @@ portion of the input matched by the curr
       {{ start = self._scanner.pos }}
       a b c 
       {{ end = self._scanner.pos }}
-      {{ print 'Text is', self._scanner.input[start:end] }}
+      {{ print('Text is', self._scanner.input[start:end]) }}
 \end{verbatim}
 
 \mysubsection{Pre- and Post-Parser Code}
--- yapps2-2.2.1.orig/examples/calc.g
+++ yapps2-2.2.1/examples/calc.g
@@ -3,12 +3,12 @@ globalvars = {}       # We will store th
 def lookup(map, name):
     for x,v in map:  
         if x == name: return v
-    if not globalvars.has_key(name): print 'Undefined (defaulting to 0):', name
+    if name not in globalvars: print('Undefined (defaulting to 0):', name)
     return globalvars.get(name, 0)
 
 def stack_input(scanner,ign):
     """Grab more input"""
-    scanner.stack_input(raw_input(">?> "))
+    scanner.stack_input(input(">?> "))
 
 %%
 parser Calculator:
@@ -20,10 +20,10 @@ parser Calculator:
     token VAR: "[a-zA-Z_]+"
 
     # Each line can either be an expression or an assignment statement
-    rule goal:   expr<<[]>> END            {{ print '=', expr }}
+    rule goal:   expr<<[]>> END            {{ print('=', expr) }}
                                            {{ return expr }}
                | "set" VAR expr<<[]>> END  {{ globalvars[VAR] = expr }}
-                                           {{ print VAR, '=', expr }}
+                                           {{ print(VAR, '=', expr) }}
                                            {{ return expr }}
 
     # An expression is the sum and difference of factors
@@ -47,18 +47,18 @@ parser Calculator:
                  "in" expr<<V>>           {{ return expr }}
 %%
 if __name__=='__main__':
-    print 'Welcome to the calculator sample for Yapps 2.'
-    print '  Enter either "<expression>" or "set <var> <expression>",'
-    print '  or just press return to exit.  An expression can have'
-    print '  local variables:  let x = expr in expr'
+    print('Welcome to the calculator sample for Yapps 2.')
+    print('  Enter either "<expression>" or "set <var> <expression>",')
+    print('  or just press return to exit.  An expression can have')
+    print('  local variables:  let x = expr in expr')
     # We could have put this loop into the parser, by making the
     # `goal' rule use (expr | set var expr)*, but by putting the
     # loop into Python code, we can make it interactive (i.e., enter
     # one expression, get the result, enter another expression, etc.)
     while 1:
-        try: s = raw_input('>>> ')
+        try: s = input('>>> ')
         except EOFError: break
         if not s.strip(): break
         parse('goal', s)
-    print 'Bye.'
+    print('Bye.')
 
--- yapps2-2.2.1.orig/examples/xml.g
+++ yapps2-2.2.1/examples/xml.g
@@ -54,13 +54,13 @@ if __name__ == '__main__':
              '<begin> middle </end>',
              '<begin> <nested attr=\'baz\' another="hey"> foo </nested> <nested> bar </nested> </begin>',
             ]
-    print
-    print '____Running tests_______________________________________'
+    print()
+    print('____Running tests_______________________________________')
     for test in tests:
-        print
+        print()
         try:
             parser = xml(xmlScanner(test))
             output = '%s ==> %s' % (repr(test), repr(parser.node()))
-        except (yappsrt.SyntaxError, AssertionError) as e:
+        except (runtime.SyntaxError, AssertionError) as e:
             output = '%s ==> FAILED ==> %s' % (repr(test), e)
-        print output
+        print(output)
--- yapps2-2.2.1.orig/setup.py
+++ yapps2-2.2.1/setup.py
@@ -1,13 +1,13 @@
 #!/usr/bin/env python
 
-from setuptools import setup, find_packages
+from setuptools import setup
 import os
 from yapps import __version__ as version
 
 pkg_root = os.path.dirname(__file__)
 
 # Error-handling here is to allow package to be built w/o README included
-try: readme = open(os.path.join(pkg_root, 'README.txt')).read()
+try: readme = open(os.path.join(pkg_root, 'README.md')).read()
 except IOError: readme = ''
 
 setup(
@@ -15,15 +15,15 @@ setup(
     version = version,
     author = 'Amit J. Patel, Matthias Urlichs',
     author_email = 'amitp@cs.stanford.edu, smurf@debian.org',
-    maintainer = 'Mike Kazantsev',
-    maintainer_email = 'mk.fraggod@gmail.com',
+    maintainer = 'Matthias Urlichs',
+    maintainer_email = 'smurf@debian.org',
     license = 'MIT',
-    url = 'https://github.com/mk-fg/yapps',
+    url = 'https://github.com/smurfix/yapps',
 
     description = 'Yet Another Python Parser System',
     long_description = readme,
 
-    packages = find_packages(),
+    packages = ['yapps'],
     include_package_data = True,
     package_data = {'': ['README.txt']},
     exclude_package_data = {'': ['README.*']},
--- yapps2-2.2.1.orig/test.sh
+++ yapps2-2.2.1/test.sh
@@ -4,10 +4,10 @@ set -e
 trap 'echo ERROR' 0 
 
 export PYTHONPATH=$(pwd)
-for PY_G in python python3 ; do
+for PY_G in python3 ; do
 $PY_G ./yapps2 examples/expr.g examples/expr.py
 
-for PY_X in python python3 ; do
+for PY_X in python3 ; do
 test "$(echo "1+2*3+4" | $PY_X examples/expr.py goal)" = 11
 done
 
--- yapps2-2.2.1.orig/yapps/cli_tool.py
+++ yapps2-2.2.1/yapps/cli_tool.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 #
 # Yapps 2 - yet another python parser system
--- yapps2-2.2.1.orig/yapps/parsetree.py
+++ yapps2-2.2.1/yapps/parsetree.py
@@ -270,9 +270,9 @@ class Generator:
 
     def generate_output(self):
         self.calculate()
+        self.write("from __future__ import print_function\n")
         self.write(self.preparser)
         self.write("# Begin -- grammar generated by Yapps\n")
-        self.write("from __future__ import print_function\n")
         self.write("import sys, re\n")
         self.write("from yapps import runtime\n")
         self.write("\n")
--- yapps2-2.2.1.orig/yapps/runtime.py
+++ yapps2-2.2.1/yapps/runtime.py
@@ -175,7 +175,7 @@ class Scanner(object):
         file,line,p = pos
         if file != self.filename:
             if self.stack: return self.stack.print_line_with_pointer(pos,length=length,out=out)
-            print >>out, "(%s: not in input buffer)" % file
+            print("(%s: not in input buffer)" % file, file=out)
             return
 
         text = self.input
@@ -198,7 +198,7 @@ class Scanner(object):
                     break
                 spos = cr+1
         else:
-            print >>out, "(%s:%d not in input buffer)" % (file,origline)
+            print("(%s:%d not in input buffer)" % (file,origline), file=out)
             return
 
         # Now try printing part of the line
@@ -227,8 +227,8 @@ class Scanner(object):
             p = p - 7
 
         # Now print the string, along with an indicator
-        print >>out, '> ',text
-        print >>out, '> ',' '*p + '^'
+        print('> ',text, file=out)
+        print('> ',' '*p + '^', file=out)
 
     def grab_input(self):
         """Get more input if possible."""
@@ -316,7 +316,7 @@ class Scanner(object):
                     del self.tokens[0]
                 self.tokens.append(tok)
                 self.last_read_token = tok
-                # print repr(tok)
+                # print(repr(tok))
                 return tok
             else:
                 ignore = self.ignore[best_pat]
