Commit eae93b76 authored by Martin v. Löwis's avatar Martin v. Löwis

Add support for version field on Modules

parent a7446e34
-- ASDL's five builtin types are identifier, int, string, object, bool -- ASDL's five builtin types are identifier, int, string, object, bool
module Python module Python version "$Revision$"
{ {
mod = Module(stmt* body) mod = Module(stmt* body)
| Interactive(stmt* body) | Interactive(stmt* body)
......
...@@ -6,6 +6,8 @@ http://www.cs.princeton.edu/~danwang/Papers/dsl97/dsl97-abstract.html. ...@@ -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 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 is intended to support the browser and I'm not interested in the
browser. browser.
Changes for Python: Add support for module versions
""" """
#__metaclass__ = type #__metaclass__ = type
...@@ -36,6 +38,12 @@ class Id(Token): ...@@ -36,6 +38,12 @@ class Id(Token):
def __str__(self): def __str__(self):
return self.value return self.value
class String(Token):
def __init__(self, value, lineno):
self.type = 'String'
self.value = value
self.lineno = lineno
class ASDLSyntaxError: class ASDLSyntaxError:
...@@ -63,6 +71,10 @@ class ASDLScanner(spark.GenericScanner, object): ...@@ -63,6 +71,10 @@ class ASDLScanner(spark.GenericScanner, object):
# XXX doesn't distinguish upper vs. lower, which is # XXX doesn't distinguish upper vs. lower, which is
# significant for ASDL. # significant for ASDL.
self.rv.append(Id(s, self.lineno)) 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 def t_xxx(self, s): # not sure what this production means
r"<=" r"<="
...@@ -98,19 +110,26 @@ class ASDLParser(spark.GenericParser, object): ...@@ -98,19 +110,26 @@ class ASDLParser(spark.GenericParser, object):
def error(self, tok): def error(self, tok):
raise ASDLSyntaxError(tok.lineno, tok) raise ASDLSyntaxError(tok.lineno, tok)
def p_module_0(self, (module, name, _0, _1)): def p_module_0(self, (module, name, version, _0, _1)):
" module ::= Id Id { } " " module ::= Id Id version { } "
if module.value != "module": if module.value != "module":
raise ASDLSyntaxError(module.lineno, raise ASDLSyntaxError(module.lineno,
msg="expected 'module', found %s" % module) msg="expected 'module', found %s" % module)
return Module(name, None) return Module(name, None, version)
def p_module(self, (module, name, _0, definitions, _1)): def p_module(self, (module, name, version, _0, definitions, _1)):
" module ::= Id Id { definitions } " " module ::= Id Id version { definitions } "
if module.value != "module": if module.value != "module":
raise ASDLSyntaxError(module.lineno, raise ASDLSyntaxError(module.lineno,
msg="expected 'module', found %s" % module) 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,)): def p_definition_0(self, (definition,)):
" definitions ::= definition " " definitions ::= definition "
...@@ -209,9 +228,10 @@ class AST: ...@@ -209,9 +228,10 @@ class AST:
pass # a marker class pass # a marker class
class Module(AST): class Module(AST):
def __init__(self, name, dfns): def __init__(self, name, dfns, version):
self.name = name self.name = name
self.dfns = dfns self.dfns = dfns
self.version = version
self.types = {} # maps type name to value (from dfns) self.types = {} # maps type name to value (from dfns)
for type in dfns: for type in dfns:
self.types[type.name.value] = type.value self.types[type.name.value] = type.value
......
...@@ -524,6 +524,7 @@ class ASTModuleVisitor(PickleVisitor): ...@@ -524,6 +524,7 @@ class ASTModuleVisitor(PickleVisitor):
self.emit('if (PyDict_SetItemString(d, "AST", (PyObject*)AST_type) < 0) return;', 1) 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('if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)', 1)
self.emit("return;", 2) self.emit("return;", 2)
self.emit("/* %s */" % mod.version.value, 1)
for dfn in mod.dfns: for dfn in mod.dfns:
self.visit(dfn) self.visit(dfn)
self.emit("}", 0) self.emit("}", 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment