Changeset 199

Show
Ignore:
Timestamp:
05/12/05 04:17:42 (4 years ago)
Author:
athomas
Message:
  • Quite a few bug fixes.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • manage/branches/python/CLI.py

    r198 r199  
    8787        def __init__(self, state, context, grammar, token = None, message = None): 
    8888                if not message: message = str(state) 
    89                 self.state, self.message, self.context, self.grammar, self.token = state, message, context, grammar, token 
     89                self.state, self.message, self.context, self.__grammar, self.token = state, message, context, grammar, token 
    9090 
    9191        def __call__(self): 
     
    9494        def execute(self): 
    9595                if self.state == Result.OK: 
    96                         return self.context(self.grammar) 
     96                        return self.context(self.__grammar) 
    9797                raise RuntimeError("CLI parse result was not OK, can't execute") 
    9898 
    9999        def candidates(self): 
    100                 return self.context.candidates(self.grammar) 
     100                return self.context.candidates(self.__grammar) 
    101101 
    102102        def help(self): 
    103                 return self.context.extract_help(self.grammar) 
    104  
    105 class Error(Result): 
     103                return self.context.extract_help(self.__grammar) 
     104 
     105class Error(Result, Exception): 
    106106        def __init__(self, message, context, token, grammar): 
    107107                Result.__init__(self, Result.ERROR, context, grammar, token, message) 
     108                Exception.__init__(self) 
    108109 
    109110class CLI: 
     
    115116                        self.__count = {} 
    116117                        self.__rangemap = {} 
    117                         self.grammar = self.__copy_grammar(grammar) 
     118                        self.__grammar = grammar 
    118119                        self.text = text 
    119120                        self.tokens = tokens 
     
    121122                        self.nodes = [] 
    122123                        self.result = None 
    123                         self.pre_parse(self.grammar) 
    124  
    125                 def __copy_grammar(self, grammar): 
    126                         out = {} 
    127                         for k, v in grammar.iteritems(): 
    128                                 t = type(v) 
    129                                 if t is dict: 
    130                                         out[k] = self.__copy_grammar(v) 
    131                                 else: 
    132                                         if t is types.FunctionType: 
    133                                                 out[k] = v 
    134                                         else: 
    135                                                 out[k] = copy.copy(v) 
    136                         return out 
     124                        self.pre_parse(self.__grammar) 
    137125 
    138126                def pre_parse(self, grammar, grammar_key = None): 
     
    144132 
    145133                def parse(self): 
    146                         return self.parse_branch(self.grammar, self.tokens, self.nodes) 
    147  
    148                 def traversed(self, node): 
    149                         return self.range(node)[2] 
     134                        return self.parse_branch(self.__grammar, self.tokens, self.nodes) 
    150135 
    151136                def traverse(self, node): 
     
    324309                                help, htype = node[HELP], type(node[HELP]) 
    325310                                if htype is dict: 
     311                                        # Delete RANGE from help tree - useless anyway 
     312                                        if RANGE in help: del(help[RANGE]) 
    326313                                        return help 
    327314                                elif htype is tuple or htype is list: 
     
    354341                                        help = self.parse_help_node(k, v) 
    355342                                if not help: 
    356                                         out.append([ k, "No HELP for this grammar node." ]) 
     343                                        if type(k) is not types.FunctionType: 
     344                                                out.append([ k, "No HELP for this grammar node." ]) 
    357345                                else: 
    358346                                        keys = help.keys() 
     
    436424 
    437425        def __init__(self, grammar = {}): 
    438                 self.grammar = grammar 
    439                 self.tokenise = re.compile(r'(\'(?:[^\\\']|.)*\'|"(?:[^\\"]|.)*")|(\S+)') 
     426                self.__grammar = grammar 
     427                self.__tokenise = re.compile(r'(\'(?:[^\\\']|.)*\'|"(?:[^\\"]|.)*")|(\S+)') 
    440428 
    441429        def parse(self, command): 
    442430                tokens = [] 
    443431                if type(command) is str: 
    444                         for token in self.tokenise.finditer(command): 
     432                        for token in self.__tokenise.finditer(command): 
    445433                                tokens.append(token) 
    446434                else: 
    447435                        raise TypeError("CLI.parse() must be passed a string command") 
    448                 context = CLI.Context(self.grammar, tokens, command) 
     436                context = CLI.Context(self.__grammar, tokens, command) 
    449437                return context.parse()