summaryrefslogtreecommitdiffstats
path: root/Parser
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2006-02-28 00:12:47 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2006-02-28 00:12:47 (GMT)
commiteae93b763cf84ef4fa44357190c7fdca3b8695fc (patch)
treec4be51df1b1dd568847f5802c6628935b195b9e2 /Parser
parenta7446e3438194e8abdfe75c2667b03a219e22a0b (diff)
downloadcpython-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.asdl2
-rw-r--r--Parser/asdl.py34
-rwxr-xr-xParser/asdl_c.py1
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)