diff options
Diffstat (limited to 'Parser')
-rw-r--r-- | Parser/Python.asdl | 2 | ||||
-rw-r--r-- | Parser/asdl.py | 23 | ||||
-rwxr-xr-x | Parser/asdl_c.py | 21 |
3 files changed, 24 insertions, 22 deletions
diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 9407b2f..8e2e1ac 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -1,6 +1,6 @@ -- ASDL's four builtin types are identifier, int, string, object -module Python version "$Revision$" +module Python { mod = Module(stmt* body) | Interactive(stmt* body) diff --git a/Parser/asdl.py b/Parser/asdl.py index 7b4e2dc..c63dfa7 100644 --- a/Parser/asdl.py +++ b/Parser/asdl.py @@ -114,28 +114,20 @@ class ASDLParser(spark.GenericParser, object): raise ASDLSyntaxError(tok.lineno, tok) def p_module_0(self, info): - " module ::= Id Id version { } " - module, name, version, _0, _1 = info + " module ::= Id Id { } " + module, name, _0, _1 = info if module.value != "module": raise ASDLSyntaxError(module.lineno, msg="expected 'module', found %s" % module) - return Module(name, None, version) + return Module(name, None) def p_module(self, info): - " module ::= Id Id version { definitions } " - module, name, version, _0, definitions, _1 = info + " module ::= Id Id { definitions } " + module, name, _0, definitions, _1 = info if module.value != "module": raise ASDLSyntaxError(module.lineno, msg="expected 'module', found %s" % module) - return Module(name, definitions, version) - - def p_version(self, info): - "version ::= Id String" - version, V = info - if version.value != "version": - raise ASDLSyntaxError(version.lineno, - msg="expected 'version', found %" % version) - return V + return Module(name, definitions) def p_definition_0(self, definition): " definitions ::= definition " @@ -246,10 +238,9 @@ class AST(object): pass # a marker class class Module(AST): - def __init__(self, name, dfns, version): + def __init__(self, name, dfns): self.name = name self.dfns = dfns - self.version = version self.types = {} # maps type name to value (from dfns) for type in dfns: self.types[type.name.value] = type.value diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index d6555d6..d7aecb5 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -5,6 +5,7 @@ # handle fields that have a type but no name import os, sys +import subprocess import asdl @@ -882,9 +883,6 @@ static int add_ast_fields(void) self.emit("if (!%s_singleton) return 0;" % cons.name, 1) -def parse_version(mod): - return mod.version.value[12:-3] - class ASTModuleVisitor(PickleVisitor): def visitModule(self, mod): @@ -904,7 +902,7 @@ class ASTModuleVisitor(PickleVisitor): self.emit("return NULL;", 2) # Value of version: "$Revision$" self.emit('if (PyModule_AddStringConstant(m, "__version__", "%s") < 0)' - % parse_version(mod), 1) + % (mod.version,), 1) self.emit("return NULL;", 2) for dfn in mod.dfns: self.visit(dfn) @@ -1137,6 +1135,18 @@ c_file_msg = """ """ + +def get_file_revision(f): + """Fish out the last change to a file in hg.""" + args = ["hg", "log", "--template", "{rev}:{node|short}", "--limit", "1"] + p = subprocess.Popen(args, stdout=subprocess.PIPE) + out = p.communicate()[0] + if p.returncode: + print >> sys.stderr, "error return code from hg" + sys.exit(1) + return out + + def main(srcfile): argv0 = sys.argv[0] components = argv0.split(os.sep) @@ -1145,6 +1155,7 @@ def main(srcfile): mod = asdl.parse(srcfile) if not asdl.check(mod): sys.exit(1) + mod.version = get_file_revision(srcfile) if INC_DIR: p = "%s/%s-ast.h" % (INC_DIR, mod.name) f = open(p, "w") @@ -1164,7 +1175,7 @@ def main(srcfile): p = os.path.join(SRC_DIR, str(mod.name) + "-ast.c") f = open(p, "w") f.write(auto_gen_msg) - f.write(c_file_msg % parse_version(mod)) + f.write(c_file_msg % (mod.version,)) f.write('#include "Python.h"\n') f.write('#include "%s-ast.h"\n' % mod.name) f.write('\n') |