parser.py

Go to the documentation of this file.
00001 import re
00002 from structure import *
00003 
00004 class L20nParser():
00005     def __init__(self):
00006         self.patterns = {}
00007         self.patterns['ws'] = re.compile('^\s+')
00008         self.patterns['id'] = re.compile('^\w+')
00009         self.patterns['entry'] = re.compile('(^<)|(^\/\*)|(\[%%)')
00010         self.patterns['group'] = (re.compile(u'^\[%%\s*'), re.compile(u'^%%\]'))
00011 
00012     def parse(self, content):
00013         self.content = content
00014         self.lol = LOL()
00015         self.lol.add(self.get_ws())
00016         while self.content:
00017             self.get_entry()
00018         return self.lol
00019 
00020     def get_entry(self):
00021         entry = None
00022         match = self.patterns['entry'].match(self.content)
00023         if not match:
00024             raise Exception()
00025 
00026         if self.content[0] == '<':
00027             entry = self.get_entity()
00028         elif self.content[0] == '/':
00029             entry = self.get_comment()
00030         elif self.content[0] == '[':
00031             entry = self.get_group()
00032         else:
00033             raise Exception()
00034         self.lol.add(entry)
00035         self.get_ws()
00036         return entry
00037 
00038     def get_ws(self):
00039         match = self.patterns['ws'].match(self.content)
00040         if not match:
00041             return None
00042         self.content = self.content[match.end(0):]
00043         #return WS(match.group(0)) # this line costs a lot
00044 
00045     def get_group(self):
00046         group = Group()
00047         match = self.patterns['group'][0].match(self.content)
00048         if not match:
00049             raise Exception()
00050         self.content = self.content[match.end(0):]
00051         match = self.patterns['group'][1].match(self.content)
00052         while not match:
00053             entry = self.get_entry()
00054             group.add(entry)
00055             match = self.patterns['group'][1].match(self.content)
00056         self.content = self.content[match.end(0):]
00057         return group
00058 
00059     def get_entity(self):
00060         if self.content[0] != '<':
00061             raise Exception()
00062         entity = Entity()
00063         self.content = self.content[1:]
00064         id = self.get_id()
00065         entity.id = id
00066         self.get_ws()
00067         if self.content[0] == '[':
00068             index = self.get_index()
00069             entity.index = index
00070         if self.content[0] != ':':
00071             raise Exception()
00072         self.content = self.content[1:]
00073         self.get_ws()
00074         if self.content[0] == '(':
00075             value = self.get_macro()
00076         else:
00077             value = self.get_value()
00078         entity.value = value
00079         self.getWS()
00080         while self.content[0] != '>':
00081             key_value_pair = self.get_key_value_pair()
00082             entity.key_value_pair = key_value_pair # list here should be!
00083             self.get_ws()
00084         self.content = self.content[1:]
00085         return entity
00086     
00087     def get_id(self):
00088         match = self.patterns['id'].match(self.content)
00089         if not match:
00090             raise Exception()
00091         self.content = self.content[match.end(0):]
00092         return match.group(0)
00093 
00094     def get_index(self):
00095         index = Index()
00096         if self.content[0] != '[':
00097             raise Exception()
00098         self.content = self.content[1:]
00099         self.get_ws()
00100         expression = self.get_expression()
00101         index.expression = expression
00102         self.get_ws()
00103         if self.content[0] != ']':
00104             raise Exception()
00105         self.content = self.content[1:]
00106         return index
00107     
00108     def get_macro(self):
00109         macro = Macro()
00110         idlist = []
00111         if self.content[0]!='(':
00112             raise Exception()
00113         self.content = self.content[1:]
00114         self.get_ws()
00115         while self.content[0]!=')':
00116             id = self.get_id()
00117             idlist.append(id)
00118             self.get_ws()
00119             while self.content[0]==',':
00120                 self.content = self.content[1:]
00121                 self.get_ws()
00122                 id=self.get_id()
00123                 idlist.append(id)
00124                 self.get_ws()
00125         self.content = self.content[1:]
00126         self.get_ws()
00127         if self.content[:2]!='->':
00128             raise Exception()
00129         self.content = self.content[2:]
00130         self.getWS()
00131         if self.content[0]!='{':
00132             raise Exception()
00133         self.content = self.content[1:]
00134         self.get_ws()
00135         expression=self.get_expression()
00136         macro.structure.append(expression)
00137         self.get_ws()
00138         if self.content[0]!='}':
00139             raise Exception()
00140         self.content = self.content[1:]
00141         return macro
00142     
00143     def get_value(self):
00144         if self.content[0]=="'" or \
00145             self.content[0]=='"':
00146             value = self.get_string()
00147         elif self.content[0]=='[':
00148             value = self.get_array()
00149         elif self.content[0]=='{':
00150             value = self.get_hash()
00151         else:
00152             raise Exception()
00153         return value
00154 
00155     def get_key_value_pair(self):
00156         key_value_pair = KeyValuePair()
00157         id = self.get_id()
00158         key_value_pair.key = id
00159         if self.content[0]!=':':
00160             raise Exception()
00161         self.content = self.content[1:]
00162         key_value_pair.ws.append(self.get_ws())
00163         value = self.get_value()
00164         key_value_pair.value = value
00165         return key_value_pair
00166     
00167     def get_comment(self):
00168         if self.content[:2] != '/*':
00169             raise Exception()
00170         pattern = re.compile('\*\/')
00171         m = pattern.search(self.content)
00172         if not m:
00173             raise Exception()
00174         comment = self.content[2:m.start(0)]
00175         self.content = self.content[m.end(0):]
00176         self.lol.add(Comment(comment))
00177     
00178     def get_string(self):
00179         string = String()
00180         if self.content[0]!='"' and \
00181              self.content[0]!="'":
00182             raise Exception()
00183         str_end = self.content[0]
00184         buffer = ''
00185         literal = re.compile('^([^\\\\$'+str_end+']+)')
00186         self.content = self.content[1:]
00187         while self.content[0]!=str_end:
00188             if self.content[0]=='\\':
00189                 self.content = self.content[1:]
00190                 buffer = buffer + this.content[0]
00191                 self.content = self.content[1:]
00192             if self.content[0]=='$':
00193                 self.content = self.content[1:]
00194                 if self.content[0]!='{':
00195                     raise Exception()
00196                 self.content = self.content[1:]
00197                 expander = Expander()
00198                 expression = self.getExpression()
00199                 if buffer:
00200                     string.buffer = buffer
00201                     buffer = ''
00202                 expander.expression = expression
00203                 if self.content[0]!='}':
00204                     raise Exception()
00205                 self.content = self.content[1:]
00206                 if not (self.content[0]=='s' or \
00207                     self.content[0]=='i'):
00208                     raise Exception()
00209                 expander.flag = self.content[0]
00210                 self.content = self.content[1:]
00211             m = literal.match(self.content)
00212             if m:
00213                 buffer = buffer + m.group(1)
00214                 self.content = self.content[m.end(0):]
00215         self.content = self.content[1:]
00216         string.buffer = buffer
00217         return string
00218     
00219     def get_array(self):
00220         array = Array()
00221         if self.content[0]!='[':
00222             raise Exception()
00223         self.content=self.content[1:]
00224         self.get_ws()
00225         value = self.get_value()
00226         array.values.append(value)
00227         while self.content[0]==',':
00228             self.content=self.content[1:]
00229             self.get_ws()
00230             value = self.get_value()
00231             array.values.append(value)
00232             self.get_ws()
00233         if self.content[0]!=']':
00234             raise Exception()
00235         self.content=self.content[1:]
00236         return array
00237     
00238     def get_hash(self):
00239         hash = Hash()
00240         if self.content[0]!='{':
00241             raise Exception()
00242         self.content = self.content[1:]
00243         self.get_ws()
00244         key_value_pair = self.get_key_value_pair()
00245         hash.key_value_pairs[key_value_pair.key] = key_value_pair
00246         self.get_ws()
00247         if self.content[0]==',':
00248             self.content = self.content[1:]
00249             self.get_ws()
00250             keyValuePair = self.get_key_value_pair()
00251             hash.key_value_pairs[key_value_pair.key] = key_value_pair
00252             self.get_ws()
00253         if self.content[0]!='}':
00254             raise Exception()
00255         self.content = self.content[1:]
00256         return hash
00257     
00258     def get_expression(self):
00259         return self.get_conditional_expression()
00260 
00261     
00262     def get_prefix_expression(self, pattern, type, prefix):
00263         higher_expression = prefix()
00264         self.get_ws()
00265         m = pattern.match(self.content)
00266         if not m:
00267             return higher_expression
00268         operator_expression = type()
00269         operator_expression.append(higher_expression)
00270         while m:
00271             operator_expression.append(Operator(m.group(0)))
00272             self.content = self.content[m.end(0):]
00273             self.get_ws()
00274             higher_expression = prefix()
00275             operator_expression.append(higher_expression)
00276             self.get_ws()
00277             m = pattern.match(self.content)
00278         return operator_expression
00279     
00280     def get_postfix_expression(self, pattern, type, postfix):
00281         m = pattern.match(self.content)
00282         if not m:
00283             return postfix()
00284         operator_expression = type()
00285         operator_expression.append(Operator(m.group(0)))
00286         self.content = self.content[m.end(0):]
00287         self.get_ws()
00288         operator_expression2 = type()
00289         operator_expression.append(operator_expression2)
00290         return operator_expression
00291         
00292         
00293     def get_conditional_expression(self):
00294         or_expression = self.get_or_expression()
00295         self.get_ws()
00296         pattern = re.compile('^\?')
00297         m = pattern.match(self.content)
00298         if not m:
00299             return or_expression
00300         conditional_expression = ConditionalExpression()
00301         conditional_expression.append(or_expression)
00302         self.content=self.content[m.end(0):]
00303         self.get_ws()
00304         expression = self.get_expression()
00305         conditional_expression.append(expression)
00306         self.get_ws()
00307         pattern = re.compile('^:')
00308         m = pattern.match(self.content)
00309         if not m:
00310             raise Exception()
00311         self.content=self.content[1:]
00312         self.get_ws()
00313         conditional_expression2 = self.get_conditional_expression()
00314         conditional_expression.append(conditional_expression2)
00315         self.get_ws()
00316         return conditional_expression
00317 
00318     def get_or_expression(self):
00319         return self.get_prefix_expression(re.compile('^\|\|'), OrExpression, self.get_and_expression)
00320     
00321     def getAndExpression(self):
00322         return self.get_prefix_expression(re.compile('^\&\&'), AndExpression, self.get_equality_expression)
00323     
00324     def getEqualityExpression(self):
00325         return self.get_prefix_expression(re.compile('^[!=]='), EqualityExpression, self.get_relational_expression)
00326     
00327     def getRelationalExpression(self):
00328         return self.get_prefix_expression(re.compile('^[<>]=?'), RelationalExpression, self.get_additive_expression)
00329 
00330     def getAdditiveExpression(self):
00331         return self.get_prefix_expression(re.compile('^[\+\-]'), AdditiveExpression, self.get_multiplicative_expression)
00332     
00333     def getMultiplicativeExpression(self):
00334         return self.get_prefix_expression(re.compile('^[\*\/\%]'), MultiplicativeExpression, self.get_unary_expression)
00335     
00336     def getUnaryExpression(self):
00337         return self.get_postfix_expression(re.compile('^[\+\-\!]'), UnaryExpression, self.get_primary_expression)
00338         
00339     def get_primary_expression(self):
00340         if self.content[0]=='(':
00341             primary_expression = BraceExpression()
00342             self.content = self.content[1:]
00343             expression = self.get_expression()
00344             primary_expression.append(expression)
00345             self.get_ws()
00346             if self.content[0]!=')':
00347                 raise Exception()
00348             self.content = self.content[1:]
00349             self.get_ws()
00350             return primary_expression
00351         # number
00352         pattern = re.compile('^[0-9]+')
00353         match = pattern.match(self.content)
00354         if match:
00355             self.content = self.content[match.end(0):]
00356             self.get_ws()
00357             return int(match.group(0))
00358         # lookahead for value
00359         char = self.content[0]
00360         if char=='"' or char=="'" or char=='[' or char=='{':
00361             return self.get_value()
00362         # idref (with index?) or macrocall
00363         idref = self.get_idref()
00364         # check for index
00365         if self.content[0]=='[':
00366             index=self.get_index()
00367             idref.append(index)
00368             return idref
00369         if self.content[0]!='(':
00370             return idref
00371         primary_expression = MacroCall()
00372         primary_expression.structure.append(idref)
00373         self.content = self.content[1:]
00374         self.get_ws()
00375         if self.content[0]!=')':
00376             expression = self.get_expression()
00377             primary_expression.structure.append(expression)
00378             self.get_ws()
00379             while self.content[0]==',':
00380                 self.content = self.content[1:]
00381                 self.get_ws()
00382                 expression=self.getExpression()
00383                 primary_expression.structure.append(expression)
00384                 self.get_ws()
00385         if self.content[0]!=')':
00386             raise Exception()
00387         self.content=self.content[1:]
00388         self.get_ws()
00389         return primary_expression
00390     
00391     def get_idref(self):
00392         idref = Idref()
00393         id = self.get_id()
00394         idref.append(id)
00395         while self.content[0]=='.':
00396             self.content = self.content[1:]
00397             id = self.get_id()
00398             idref.append(id)
00399         return idref

Generated on Tue May 12 17:37:27 2009 for silme by  doxygen 1.5.8