import re import sys from base_classes import Statement, Variable #from expression import Expression # Auxiliary tools from utils import split_comma, specs_split_comma, AnalyzeError, ParseError,\ get_module_file, parse_bind, parse_result, is_name class StatementWithNamelist(Statement): """ [ :: ] """ def process_item(self): if self.item.has_map(): self.isvalid = False return if hasattr(self,'stmtname'): clsname = self.stmtname else: clsname = self.__class__.__name__ line = self.item.get_line()[len(clsname):].lstrip() if line.startswith('::'): line = line[2:].lstrip() self.items = items = [] for item in split_comma(line): if not is_name(item): self.isvalid = False return items.append(item) return def __str__(self): if hasattr(self,'stmtname'): clsname = self.stmtname.upper() else: clsname = self.__class__.__name__.upper() s = ', '.join(self.items) if s: s = ' ' + s return self.get_indent_tab() + clsname + s # Execution statements class GeneralAssignment(Statement): """ = => """ match = re.compile(r'\w[^=]*\s*=\>?').match item_re = re.compile(r'(?P\w[^=]*)\s*(?P=\>?)\s*(?P.*)\Z',re.I).match def process_item(self): m = self.item_re(self.item.get_line()) if not m: self.isvalid = False return self.sign = sign = m.group('sign') if isinstance(self, Assignment) and sign != '=': self.isvalid = False return elif isinstance(self, PointerAssignment) and sign != '=>': self.isvalid = False return else: if sign=='=>': self.__class__ = PointerAssignment else: self.__class__ = Assignment apply_map = self.item.apply_map self.variable = apply_map(m.group('variable').replace(' ','')) self.expr = apply_map(m.group('expr')) return def __str__(self): return self.get_indent_tab() + '%s %s %s' \ % (self.variable, self.sign, self.expr) def analyze(self): return class Assignment(GeneralAssignment): pass class PointerAssignment(GeneralAssignment): pass class Assign(Statement): """ ASSIGN