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
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
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
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
00359 char = self.content[0]
00360 if char=='"' or char=="'" or char=='[' or char=='{':
00361 return self.get_value()
00362
00363 idref = self.get_idref()
00364
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