|
6 | 6 | Only supports top level module decl, not view. I'm guessing that view |
7 | 7 | is intended to support the browser and I'm not interested in the |
8 | 8 | browser. |
| 9 | +
|
| 10 | +Changes for Python: Add support for module versions |
9 | 11 | """ |
10 | 12 |
|
11 | 13 | #__metaclass__ = type |
@@ -36,6 +38,12 @@ def __init__(self, value, lineno): |
36 | 38 |
|
37 | 39 | def __str__(self): |
38 | 40 | return self.value |
| 41 | + |
| 42 | +class String(Token): |
| 43 | + def __init__(self, value, lineno): |
| 44 | + self.type = 'String' |
| 45 | + self.value = value |
| 46 | + self.lineno = lineno |
39 | 47 |
|
40 | 48 | class ASDLSyntaxError: |
41 | 49 |
|
@@ -63,6 +71,10 @@ def t_id(self, s): |
63 | 71 | # XXX doesn't distinguish upper vs. lower, which is |
64 | 72 | # significant for ASDL. |
65 | 73 | self.rv.append(Id(s, self.lineno)) |
| 74 | + |
| 75 | + def t_string(self, s): |
| 76 | + r'"[^"]*"' |
| 77 | + self.rv.append(String(s, self.lineno)) |
66 | 78 |
|
67 | 79 | def t_xxx(self, s): # not sure what this production means |
68 | 80 | r"<=" |
@@ -98,19 +110,26 @@ def typestring(self, tok): |
98 | 110 | def error(self, tok): |
99 | 111 | raise ASDLSyntaxError(tok.lineno, tok) |
100 | 112 |
|
101 | | - def p_module_0(self, (module, name, _0, _1)): |
102 | | - " module ::= Id Id { } " |
| 113 | + def p_module_0(self, (module, name, version, _0, _1)): |
| 114 | + " module ::= Id Id version { } " |
103 | 115 | if module.value != "module": |
104 | 116 | raise ASDLSyntaxError(module.lineno, |
105 | 117 | msg="expected 'module', found %s" % module) |
106 | | - return Module(name, None) |
| 118 | + return Module(name, None, version) |
107 | 119 |
|
108 | | - def p_module(self, (module, name, _0, definitions, _1)): |
109 | | - " module ::= Id Id { definitions } " |
| 120 | + def p_module(self, (module, name, version, _0, definitions, _1)): |
| 121 | + " module ::= Id Id version { definitions } " |
110 | 122 | if module.value != "module": |
111 | 123 | raise ASDLSyntaxError(module.lineno, |
112 | 124 | msg="expected 'module', found %s" % module) |
113 | | - return Module(name, definitions) |
| 125 | + return Module(name, definitions, version) |
| 126 | + |
| 127 | + def p_version(self, (version, V)): |
| 128 | + "version ::= Id String" |
| 129 | + if version.value != "version": |
| 130 | + raise ASDLSyntaxError(version.lineno, |
| 131 | + msg="expected 'version', found %" % version) |
| 132 | + return V |
114 | 133 |
|
115 | 134 | def p_definition_0(self, (definition,)): |
116 | 135 | " definitions ::= definition " |
@@ -209,9 +228,10 @@ class AST: |
209 | 228 | pass # a marker class |
210 | 229 |
|
211 | 230 | class Module(AST): |
212 | | - def __init__(self, name, dfns): |
| 231 | + def __init__(self, name, dfns, version): |
213 | 232 | self.name = name |
214 | 233 | self.dfns = dfns |
| 234 | + self.version = version |
215 | 235 | self.types = {} # maps type name to value (from dfns) |
216 | 236 | for type in dfns: |
217 | 237 | self.types[type.name.value] = type.value |
|
0 commit comments