annotate Lib/lib2to3/patcomp.py @ 58765:2ba7677bfa95 legacy-trunk

testCopysign was defined twice in test_math; combine the definitions
author Mark Dickinson <dickinsm@gmail.com>
date Sat, 06 Feb 2010 23:11:25 +0000
parents 732f72cbaf7d
children 9fe562a2f0e3
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
55358
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
17 from .pgen2 import driver, literals, token, tokenize, parse, grammar
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
18
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
19 # Really local imports
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
20 from . import pytree
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
21 from . import pygram
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
22
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
23 # The pattern grammar file
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
24 _PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__),
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
25 "PatternGrammar.txt")
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
26
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
27
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
28 class PatternSyntaxError(Exception):
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
29 pass
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
30
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
31
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
32 def tokenize_wrapper(input):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
33 """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
34 skip = set((token.NEWLINE, token.INDENT, token.DEDENT))
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
35 tokens = tokenize.generate_tokens(driver.generate_lines(input).next)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
36 for quintuple in tokens:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
37 type, value, start, end, line_text = quintuple
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
38 if type not in skip:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
39 yield quintuple
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
42 class PatternCompiler(object):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
43
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
44 def __init__(self, grammar_file=_PATTERN_GRAMMAR_FILE):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
45 """Initializer.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
46
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
47 Takes an optional alternative filename for the pattern grammar.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
48 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
49 self.grammar = driver.load_grammar(grammar_file)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
50 self.syms = pygram.Symbols(self.grammar)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
51 self.pygrammar = pygram.python_grammar
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
52 self.pysyms = pygram.python_symbols
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
53 self.driver = driver.Driver(self.grammar, convert=pattern_convert)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
54
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
55 def compile_pattern(self, input, debug=False):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
56 """Compiles a pattern string to a nested pytree.*Pattern object."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
57 tokens = tokenize_wrapper(input)
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
58 try:
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
59 root = self.driver.parse_tokens(tokens, debug=debug)
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
60 except parse.ParseError as e:
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
61 raise PatternSyntaxError(str(e))
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
62 return self.compile_node(root)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
63
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
64 def compile_node(self, node):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
65 """Compiles a node, recursively.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
66
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
67 This is one big switch on the node type.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
68 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
69 # XXX Optimize certain Wildcard-containing-Wildcard patterns
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
70 # that can be merged
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
71 if node.type == self.syms.Matcher:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
72 node = node.children[0] # Avoid unneeded recursion
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
73
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
74 if node.type == self.syms.Alternatives:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
75 # Skip the odd children since they are just '|' tokens
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
76 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
77 if len(alts) == 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
78 return alts[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
79 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
80 return p.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
81
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
82 if node.type == self.syms.Alternative:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
83 units = [self.compile_node(ch) for ch in node.children]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
84 if len(units) == 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
85 return units[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
86 p = pytree.WildcardPattern([units], min=1, max=1)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
87 return p.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
88
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
89 if node.type == self.syms.NegatedUnit:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
90 pattern = self.compile_basic(node.children[1:])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
91 p = pytree.NegatedPattern(pattern)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
92 return p.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
93
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
94 assert node.type == self.syms.Unit
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
95
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
96 name = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
97 nodes = node.children
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
98 if len(nodes) >= 3 and nodes[1].type == token.EQUAL:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
99 name = nodes[0].value
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
100 nodes = nodes[2:]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
101 repeat = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
102 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
103 repeat = nodes[-1]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
104 nodes = nodes[:-1]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
105
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
106 # Now we've reduced it to: STRING | NAME [Details] | (...) | [...]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
107 pattern = self.compile_basic(nodes, repeat)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
108
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
109 if repeat is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
110 assert repeat.type == self.syms.Repeater
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
111 children = repeat.children
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
112 child = children[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
113 if child.type == token.STAR:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
114 min = 0
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
115 max = pytree.HUGE
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
116 elif child.type == token.PLUS:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
117 min = 1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
118 max = pytree.HUGE
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
119 elif child.type == token.LBRACE:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
120 assert children[-1].type == token.RBRACE
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
121 assert len(children) in (3, 5)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
122 min = max = self.get_int(children[1])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
123 if len(children) == 5:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
124 max = self.get_int(children[3])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
125 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
126 assert False
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
127 if min != 1 or max != 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
128 pattern = pattern.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
129 pattern = pytree.WildcardPattern([[pattern]], min=min, max=max)
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 if name is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
132 pattern.name = name
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
133 return pattern.optimize()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
134
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
135 def compile_basic(self, nodes, repeat=None):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
136 # Compile STRING | NAME [Details] | (...) | [...]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
137 assert len(nodes) >= 1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
138 node = nodes[0]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
139 if node.type == token.STRING:
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53821
diff changeset
140 value = unicode(literals.evalString(node.value))
55358
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
141 return pytree.LeafPattern(_type_of_literal(value), value)
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
142 elif node.type == token.NAME:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
143 value = node.value
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
144 if value.isupper():
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
145 if value not in TOKEN_MAP:
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
146 raise PatternSyntaxError("Invalid token: %r" % value)
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
147 if nodes[1:]:
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
148 raise PatternSyntaxError("Can't have details for token")
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
149 return pytree.LeafPattern(TOKEN_MAP[value])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
150 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
151 if value == "any":
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
152 type = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
153 elif not value.startswith("_"):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
154 type = getattr(self.pysyms, value, None)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
155 if type is None:
54696
7700408f65fc Merged revisions 72523,72950-72951,72994,73003,73033,73036-73040,73091-73093,73096,73179-73181,73192,73231,73244,73255-73256,73365 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53934
diff changeset
156 raise PatternSyntaxError("Invalid symbol: %r" % value)
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
157 if nodes[1:]: # Details present
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
158 content = [self.compile_node(nodes[1].children[1])]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
159 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
160 content = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
161 return pytree.NodePattern(type, content)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
162 elif node.value == "(":
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
163 return self.compile_node(nodes[1])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
164 elif node.value == "[":
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
165 assert repeat is None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
166 subpattern = self.compile_node(nodes[1])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
167 return pytree.WildcardPattern([[subpattern]], min=0, max=1)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
168 assert False, node
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
169
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
170 def get_int(self, node):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
171 assert node.type == token.NUMBER
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
172 return int(node.value)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
173
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 # Map named tokens to the type value for a LeafPattern
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
176 TOKEN_MAP = {"NAME": token.NAME,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
177 "STRING": token.STRING,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
178 "NUMBER": token.NUMBER,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
179 "TOKEN": None}
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
180
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
181
55358
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
182 def _type_of_literal(value):
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
183 if value[0].isalpha():
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
184 return token.NAME
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
185 elif value in grammar.opmap:
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
186 return grammar.opmap[value]
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
187 else:
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
188 return None
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
189
732f72cbaf7d Merged revisions 73771,73811,73840,73842,73848-73849,73861,73957-73960,73964-73969,73972-73974,73977,73981,73984,74065,74113 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54696
diff changeset
190
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
191 def pattern_convert(grammar, raw_node_info):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
192 """Converts raw node information to a Node or Leaf instance."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
193 type, value, context, children = raw_node_info
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
194 if children or type in grammar.number2symbol:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
195 return pytree.Node(type, children, context=context)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
196 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
197 return pytree.Leaf(type, value, context=context)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
198
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
199
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
200 def compile_pattern(pattern):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
201 return PatternCompiler().compile_pattern(pattern)