00001 from silme.core.entity import EntityList, Entity
00002 from structure import *
00003 import re
00004
00005 class IncParser():
00006 patterns = {}
00007 patterns['entity'] = re.compile('^#define[ \t]*([^ \t]+)[ \t]*(.*)',re.M)
00008 patterns['comment'] = re.compile('^(# [^\n]*\n?)+',re.M)
00009
00010
00011
00012 @classmethod
00013 def parse(cls, text, code='default'):
00014 prop = IncStructure()
00015 cls.build_element_list(text, prop, code=code)
00016 prop.fallback = code
00017 return prop
00018
00019
00020 @classmethod
00021 def parse_to_entitylist(cls, text, code='default'):
00022 entitylist = EntityList()
00023 text = cls.patterns['comment'].sub('', text)
00024 matchlist = cls.patterns['entity'].findall(text)
00025 for match in matchlist:
00026 entitylist.add_entity(Entity(match[0], match[1], code))
00027 return entitylist
00028
00029 @classmethod
00030 def parse_entity(cls, text, code='default'):
00031 match = self.patterns['entity'].match(text)
00032 if not match:
00033 raise Exception()
00034 entity = Entity(match.group(1))
00035 entity.set_value(match.group(2), code=code)
00036 return entity
00037
00038 @classmethod
00039 def build_element_list (cls, text, object, type='comment', code='default', pointer=0, end=None):
00040 cls.split_comments(text, object, code=code)
00041
00042 @classmethod
00043 def split_comments(cls, text, object, code='default', pointer=0, end=None):
00044 pattern = cls.patterns['comment']
00045 if end:
00046 match = pattern.search(text, pointer, end)
00047 else:
00048 match = pattern.search(text, pointer)
00049 while match:
00050 st0 = match.start(0)
00051 if st0 > pointer:
00052 cls.split_entities(text, object, code=code, pointer=pointer, end=st0)
00053 groups = match.groups()
00054 comment = Comment()
00055 cls.split_entities(match.group(0)[2:].replace('\n# ','\n'), comment, code=code)
00056 object.append(comment)
00057 pointer = match.end(0)
00058 if end:
00059 match = pattern.search(text, pointer, end)
00060 else:
00061 match = pattern.search(text, pointer)
00062 if (not end or (end > pointer)) and len(text) > pointer:
00063 cls.split_entities(text, object, code=code, pointer=pointer)
00064
00065 @classmethod
00066 def split_entities(cls, text, object, code='default', pointer=0, end=None):
00067 pattern = cls.patterns['entity']
00068 if end:
00069 match = pattern.search(text, pointer, end)
00070 else:
00071 match = pattern.search(text, pointer)
00072 while match:
00073 st0 = match.start(0)
00074 if st0 > pointer:
00075 object.append(text[pointer:st0])
00076 groups = match.groups()
00077 entity = Entity(groups[0])
00078 entity.set_value(groups[1], code)
00079 entity.params['source'] = {'type':'inc',
00080 'string':match.group(0),
00081 'valpos':match.start(2)-st0}
00082 object.append(entity)
00083 pointer = match.end(0)
00084 if end:
00085 match = pattern.search(text, pointer, end)
00086 else:
00087 match = pattern.search(text, pointer)
00088 if (not end or (end > pointer)) and len(text) > pointer:
00089 if end:
00090 object.append(text[pointer:end])
00091 else:
00092 object.append(text[pointer:])