From eae93b763cf84ef4fa44357190c7fdca3b8695fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Tue, 28 Feb 2006 00:12:47 +0000 Subject: [PATCH] Add support for version field on Modules --- Parser/Python.asdl | 2 +- Parser/asdl.py | 34 +++++++++++++++++++++++++++------- Parser/asdl_c.py | 1 + 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Parser/Python.asdl b/Parser/Python.asdl index ba4459e458c..11c9665fddf 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -1,6 +1,6 @@ -- ASDL's five builtin types are identifier, int, string, object, bool -module Python +module Python version "$Revision$" { mod = Module(stmt* body) | Interactive(stmt* body) diff --git a/Parser/asdl.py b/Parser/asdl.py index 5b856dda529..2128732cfba 100644 --- a/Parser/asdl.py +++ b/Parser/asdl.py @@ -6,6 +6,8 @@ http://www.cs.princeton.edu/~danwang/Papers/dsl97/dsl97-abstract.html. Only supports top level module decl, not view. I'm guessing that view is intended to support the browser and I'm not interested in the browser. + +Changes for Python: Add support for module versions """ #__metaclass__ = type @@ -36,6 +38,12 @@ class Id(Token): def __str__(self): return self.value + +class String(Token): + def __init__(self, value, lineno): + self.type = 'String' + self.value = value + self.lineno = lineno class ASDLSyntaxError: @@ -63,6 +71,10 @@ class ASDLScanner(spark.GenericScanner, object): # XXX doesn't distinguish upper vs. lower, which is # significant for ASDL. self.rv.append(Id(s, self.lineno)) + + def t_string(self, s): + r'"[^"]*"' + self.rv.append(String(s, self.lineno)) def t_xxx(self, s): # not sure what this production means r"<=" @@ -98,19 +110,26 @@ class ASDLParser(spark.GenericParser, object): def error(self, tok): raise ASDLSyntaxError(tok.lineno, tok) - def p_module_0(self, (module, name, _0, _1)): - " module ::= Id Id { } " + def p_module_0(self, (module, name, version, _0, _1)): + " module ::= Id Id version { } " if module.value != "module": raise ASDLSyntaxError(module.lineno, msg="expected 'module', found %s" % module) - return Module(name, None) + return Module(name, None, version) - def p_module(self, (module, name, _0, definitions, _1)): - " module ::= Id Id { definitions } " + def p_module(self, (module, name, version, _0, definitions, _1)): + " module ::= Id Id version { definitions } " if module.value != "module": raise ASDLSyntaxError(module.lineno, msg="expected 'module', found %s" % module) - return Module(name, definitions) + return Module(name, definitions, version) + + def p_version(self, (version, V)): + "version ::= Id String" + if version.value != "version": + raise ASDLSyntaxError(version.lineno, + msg="expected 'version', found %" % version) + return V def p_definition_0(self, (definition,)): " definitions ::= definition " @@ -209,9 +228,10 @@ class AST: pass # a marker class class Module(AST): - def __init__(self, name, dfns): + def __init__(self, name, dfns, version): 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 4ac3f74ceec..3f62af36be5 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -524,6 +524,7 @@ class ASTModuleVisitor(PickleVisitor): self.emit('if (PyDict_SetItemString(d, "AST", (PyObject*)AST_type) < 0) return;', 1) self.emit('if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)', 1) self.emit("return;", 2) + self.emit("/* %s */" % mod.version.value, 1) for dfn in mod.dfns: self.visit(dfn) self.emit("}", 0)