Ejemplo n.º 1
0
 def assign(self):
     content = self._content
     if content is not None:
         definition = (
             types.declaration((self.content_symbol,)),
             content)
         return types.definitions((definition,))
Ejemplo n.º 2
0
 def assign(self):
     content = self._content
     if content is not None:
         definition = (types.declaration(
             (self.content_symbol, )), content)
         return types.definitions((definition, ))
Ejemplo n.º 3
0
                    expr = self.expression(string[i:j])
                except SyntaxError, e:
                    if string.rfind(';', i, j) > 0:
                        continue
                    raise e
                
                break
                
            defines.append((var, expr))

            if j < 0:
                break
            
            i = j + 1

        return types.definitions(defines)

    def definition(self, string):
        defs = self.definitions(string)
        if len(defs) != 1:
            raise ValueError, "Multiple definitions not allowed."

        return defs[0]

    def output(self, string):
        """String output; supports 'structure' keyword.
        
        >>> class MockExpressionTranslator(ExpressionTranslator):
        ...     def validate(self, string):
        ...         return True
        ...
Ejemplo n.º 4
0
    def definitions(self, string):
        """Semi-colon separated variable definitions.
        
        >>> class MockExpressionTranslator(ExpressionTranslator):
        ...     def tales(self, string, escape=None):
        ...         if string == '' or ';' in string.replace("';'", "''"):
        ...             raise SyntaxError()
        ...         return types.value(string.strip())

        >>> definitions = MockExpressionTranslator().definitions
        
        Single define:
        
        >>> definitions("variable expression")
        definitions((declaration('variable'), value('expression')),)
        
        Multiple defines:
        
        >>> definitions("variable1 expression1; variable2 expression2")
        definitions((declaration('variable1'), value('expression1')),
                    (declaration('variable2'), value('expression2')))

        Defines are only split on semi-colon if a valid declaration is
        available.
        
        >>> definitions("variable1 ';'+expression1; variable2 expression2")
        definitions((declaration('variable1'), value("';'+expression1")),
                    (declaration('variable2'), value('expression2')))

        Tuple define:
        
        >>> definitions("(variable1, variable2) (expression1, expression2)")
        definitions((declaration('variable1', 'variable2'),
                    value('(expression1, expression2)')),)

        Global defines:

        >>> definitions("global variable expression")
        definitions((declaration('variable', global_scope=True), value('expression')),)

        >>> definitions("variable1 expression1; global variable2 expression2")
        definitions((declaration('variable1'), value('expression1')),
                    (declaration('variable2', global_scope=True), value('expression2')))

        Space, the 'in' operator and '=' may be used to separate
        variable from expression.

        >>> definitions("variable in expression")
        definitions((declaration('variable'), value('expression')),)        
        
        >>> definitions("variable1 = expression1; variable2 = expression2")
        definitions((declaration('variable1'), value('expression1')),
                    (declaration('variable2'), value('expression2')))

        >>> definitions("variable1=expression1; variable2=expression2")
        definitions((declaration('variable1'), value('expression1')),
                    (declaration('variable2'), value('expression2')))
        
        A define clause that ends in a semicolon:
        
        >>> definitions("variable expression;")
        definitions((declaration('variable'), value('expression')),)
        
        A define clause with a trivial expression (we do allow this):
        
        >>> definitions("variable")
        definitions((declaration('variable'), None),)
        
        A proper define clause following one with a trivial expression:
        
        >>> definitions("variable1 expression; variable2")
        definitions((declaration('variable1'), value('expression')),
                    (declaration('variable2'), None))
        """

        string = string.replace('\n', '').strip()

        defines = []
        i = 0
        while i < len(string):
            while string[i] == ' ':
                i += 1

            global_scope = False
            if string[i:].startswith('global'):
                global_scope = True
                i += 6

            # get variable definition
            if string[i] == '(':
                j = string.find(')', i+1)
                if j == -1:
                    raise ValueError, "Invalid variable tuple definition (%s)." % string
                var = self.declaration(string[i+1:j])
                j += 1
            else:
                j = string.find('=', i + 1)
                k = string.find(' ', i + 1)
                if k < j and k > -1 or j < 0:
                    j = k
                
                if j < 0:
                    var = self.declaration(string[i:])
                    j = len(string)
                else:
                    var = self.declaration(string[i:j])

            var.global_scope = global_scope

            # get expression
            i = j + len(string) - j - len(string[j:].lstrip())

            token = string[i:]
            if token.startswith('=='):
                raise ValueError("Invalid variable definition (%s)." % string)
            elif token.startswith('='):
                i += 1
            elif token.startswith('in '):
                i += 3

            try:
                expr = self.tales(string[i:], ';')
                j = -1
            except SyntaxError:
                expr = None
                j = len(string)

            while j > i:
                j = string.rfind(';', i, j)
                if j < 0:
                    # this is always a re-raise from right above
                    raise

                try:
                    expr = self.tales(string[i:j], ';')
                except SyntaxError:
                    if string.rfind(';', i, j) > 0:
                        continue
                    raise

                break

            defines.append((var, expr))

            if j < 0:
                break

            i = j + 1

        return types.definitions(defines)