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