annotate Lib/lib2to3/patcomp.py @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents 119e4323400d
children 7700408f65fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1 # Copyright 2006 Google, Inc. All Rights Reserved.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
2 # Licensed to PSF under a Contributor Agreement.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
3
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
4 """Pattern compiler.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
5
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
6 The grammer is taken from PatternGrammar.txt.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
7
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
8 The compiler compiles a pattern to a pytree.*Pattern instance.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
9 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
10
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
11 __author__ = "Guido van Rossum <guido@python.org>"
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
12
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
13 # Python imports
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
14 import os
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
15
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
16 # Fairly local imports
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
17 from .pgen2 import driver
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
18 from .pgen2 import literals
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
19 from .pgen2 import token
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
20 from .pgen2 import tokenize
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
21
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
22 # Really local imports
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
23 from . import pytree
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
24 from . import pygram
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
25
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
26 # The pattern grammar file
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
27 _PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__),
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
28 "PatternGrammar.txt")
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
29
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
30
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
31 def tokenize_wrapper(input):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
32 """Tokenizes a string suppressing significant whitespace."""
53821
fb10b88afd40 Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45906
diff changeset
33 skip = set((token.NEWLINE, token.INDENT, token.DEDENT))
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
34 tokens = tokenize.generate_tokens(driver.generate_lines(input).next)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
35 for quintuple in tokens:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
36 type, value, start, end, line_text = quintuple
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
37 if type not in skip:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
38 yield quintuple
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
39
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
40
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
41 class PatternCompiler(object):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
42
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
43 def __init__(self, grammar_file=_PATTERN_GRAMMAR_FILE):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
44 """Initializer.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
45
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
46 Takes an optional alternative filename for the pattern grammar.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
47 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
48 self.grammar = driver.load_grammar(grammar_file)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
49 self.syms = pygram.Symbols(self.grammar)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
50 self.pygrammar = pygram.python_grammar
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
51 self.pysyms = pygram.python_symbols
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
52 self.driver = driver.Driver(self.grammar, convert=pattern_convert)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
53
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
54 def compile_pattern(self, input, debug=False):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
55 """Compiles a pattern string to a nested pytree.*Pattern object."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
56 tokens = tokenize_wrapper(input)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
57 root = self.driver.parse_tokens(tokens, debug=debug)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
58 return self.compile_node(root)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
59
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
60 def compile_node(self, node):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
61 """Compiles a node, recursively.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
62
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
63 This is one big switch on the node type.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
64 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
65 # XXX Optimize certain Wildcard-containing-Wildcard patterns
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
66 # that can be merged
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
67 if node.type == self.syms.Matcher:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
68 node = node.children[0] # Avoid unneeded recursion
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
69
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
70 if node.type == self.syms.Alternatives:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
71 # Skip the odd children since they are just '|' tokens
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
72 alts = [self.compile_node(ch) for ch in node.children[::2]]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
73 if len(alts) == 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
74 return alts[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
75 p = pytree.WildcardPattern([[a] for a in alts], min=1, max=1)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
76 return p.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
77
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
78 if node.type == self.syms.Alternative:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
79 units = [self.compile_node(ch) for ch in node.children]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
80 if len(units) == 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
81 return units[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
82 p = pytree.WildcardPattern([units], min=1, max=1)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
83 return p.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
84
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
85 if node.type == self.syms.NegatedUnit:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
86 pattern = self.compile_basic(node.children[1:])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
87 p = pytree.NegatedPattern(pattern)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
88 return p.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
89
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
90 assert node.type == self.syms.Unit
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
91
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
92 name = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
93 nodes = node.children
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
94 if len(nodes) >= 3 and nodes[1].type == token.EQUAL:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
95 name = nodes[0].value
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
96 nodes = nodes[2:]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
97 repeat = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
98 if len(nodes) >= 2 and nodes[-1].type == self.syms.Repeater:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
99 repeat = nodes[-1]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
100 nodes = nodes[:-1]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
101
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
102 # Now we've reduced it to: STRING | NAME [Details] | (...) | [...]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
103 pattern = self.compile_basic(nodes, repeat)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
104
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
105 if repeat is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
106 assert repeat.type == self.syms.Repeater
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
107 children = repeat.children
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
108 child = children[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
109 if child.type == token.STAR:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
110 min = 0
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
111 max = pytree.HUGE
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
112 elif child.type == token.PLUS:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
113 min = 1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
114 max = pytree.HUGE
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
115 elif child.type == token.LBRACE:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
116 assert children[-1].type == token.RBRACE
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
117 assert len(children) in (3, 5)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
118 min = max = self.get_int(children[1])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
119 if len(children) == 5:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
120 max = self.get_int(children[3])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
121 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
122 assert False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
123 if min != 1 or max != 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
124 pattern = pattern.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
125 pattern = pytree.WildcardPattern([[pattern]], min=min, max=max)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
126
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
127 if name is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
128 pattern.name = name
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
129 return pattern.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
130
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
131 def compile_basic(self, nodes, repeat=None):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
132 # Compile STRING | NAME [Details] | (...) | [...]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
133 assert len(nodes) >= 1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
134 node = nodes[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
135 if node.type == token.STRING:
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
136 value = unicode(literals.evalString(node.value))
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
137 return pytree.LeafPattern(content=value)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
138 elif node.type == token.NAME:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
139 value = node.value
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
140 if value.isupper():
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
141 if value not in TOKEN_MAP:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
142 raise SyntaxError("Invalid token: %r" % value)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
143 return pytree.LeafPattern(TOKEN_MAP[value])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
144 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
145 if value == "any":
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
146 type = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
147 elif not value.startswith("_"):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
148 type = getattr(self.pysyms, value, None)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
149 if type is None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
150 raise SyntaxError("Invalid symbol: %r" % value)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
151 if nodes[1:]: # Details present
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
152 content = [self.compile_node(nodes[1].children[1])]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
153 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
154 content = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
155 return pytree.NodePattern(type, content)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
156 elif node.value == "(":
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
157 return self.compile_node(nodes[1])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
158 elif node.value == "[":
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
159 assert repeat is None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
160 subpattern = self.compile_node(nodes[1])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
161 return pytree.WildcardPattern([[subpattern]], min=0, max=1)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
162 assert False, node
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
163
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
164 def get_int(self, node):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
165 assert node.type == token.NUMBER
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
166 return int(node.value)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
167
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
168
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
169 # Map named tokens to the type value for a LeafPattern
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
170 TOKEN_MAP = {"NAME": token.NAME,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
171 "STRING": token.STRING,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
172 "NUMBER": token.NUMBER,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
173 "TOKEN": None}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
174
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
175
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
176 def pattern_convert(grammar, raw_node_info):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
177 """Converts raw node information to a Node or Leaf instance."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
178 type, value, context, children = raw_node_info
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
179 if children or type in grammar.number2symbol:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
180 return pytree.Node(type, children, context=context)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
181 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
182 return pytree.Leaf(type, value, context=context)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
183
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
184
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
185 def compile_pattern(pattern):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
186 return PatternCompiler().compile_pattern(pattern)