diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2006-02-28 00:12:47 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2006-02-28 00:12:47 (GMT) |
commit | eae93b763cf84ef4fa44357190c7fdca3b8695fc (patch) | |
tree | c4be51df1b1dd568847f5802c6628935b195b9e2 /Parser | |
parent | a7446e3438194e8abdfe75c2667b03a219e22a0b (diff) | |
download | cpython-eae93b763cf84ef4fa44357190c7fdca3b8695fc.zip cpython-eae93b763cf84ef4fa44357190c7fdca3b8695fc.tar.gz cpython-eae93b763cf84ef4fa44357190c7fdca3b8695fc.tar.bz2 |
Add support for version field on Modules
Diffstat (limited to 'Parser')
-rw-r--r-- | Parser/Python.asdl | 2 | ||||
-rw-r--r-- | Parser/asdl.py | 34 | ||||
-rwxr-xr-x | Parser/asdl_c.py | 1 |
3 files changed, 29 insertions, 8 deletions
diff --git a/Parser/Python.asdl b/Parser/Python.asdl index ba4459e..11c9665 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 5b856dd..2128732 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 4ac3f74..3f62af3 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) |