コード例 #1
0
 def _add_defined_attributes(self, ast):
     defines = compress_seq(self.defines())
     if not isinstance(ast, (AST, Node)):
         return
     for d, l in defines:
         if not hasattr(ast, d):
             setattr(ast, d, [] if l else None)
コード例 #2
0
 def _parse_rhs(self, ctx, exp):
     ruleinfo = RuleInfo(self.name, exp.parse, self.params, self.kwparams)
     result = ctx._call(ruleinfo)
     if isinstance(result, AST):
         defines = compress_seq(self.defines())
         result._define([d for d, l in defines if not l],
                        [d for d, l in defines if l])
     return result
コード例 #3
0
 def _parse_rhs(self, ctx, exp):
     ruleinfo = RuleInfo(self.name, exp.parse, self.params, self.kwparams)
     result = ctx._call(ruleinfo)
     if isinstance(result, AST):
         defines = compress_seq(self.defines())
         result._define(
             [d for d, l in defines if not l],
             [d for d, l in defines if l]
         )
     return result
コード例 #4
0
    def _add_defined_attributes(self, ctx, ast=None):
        if ast is None:
            return
        if not hasattr(ast, '_define'):
            return

        defines = dict(compress_seq(self.defines()))

        keys = [k for k, list in defines.items() if not list]
        list_keys = [k for k, list in defines.items() if list]
        ctx._define(keys, list_keys)
        ast._define(keys, list_keys)
コード例 #5
0
    def render_fields(self, fields):
        self.reset_counter()

        params = kwparams = ''
        if self.node.params:
            params = ', '.join(
                self.param_repr(self.rend(p))
                for p in self.node.params
            )
        if self.node.kwparams:
            kwparams = ', '.join(
                '%s=%s'
                %
                (k, self.param_repr(self.rend(v)))
                for k, v in self.kwparams.items()
            )

        if params and kwparams:
            params = params + ', ' + kwparams
        elif kwparams:
            params = kwparams

        fields.update(params=params)

        defines = compress_seq(self.defines())
        ldefs = set(safe_name(d) for d, l in defines if l)
        sdefs = set(safe_name(d) for d, l in defines if not l and d not in ldefs)

        if not (sdefs or ldefs):
            sdefines = ''
        else:
            sdefs = '[%s]' % ', '.join(urepr(d) for d in sorted(sdefs))
            ldefs = '[%s]' % ', '.join(urepr(d) for d in sorted(ldefs))
            if not ldefs:
                sdefines = '\n\n    self.ast._define(%s, %s)' % (sdefs, ldefs)
            else:
                sdefines = indent(
                    '\n' +
                    trim(self.define_template % (sdefs, ldefs))
                )

        fields.update(defines=sdefines)
        fields.update(
            check_name='\n    self._check_name()' if self.is_name else '',
        )
        leftrec = self.node.is_leftrec
        fields.update(leftrec='\n@leftrec' if leftrec else '')
        fields.update(nomemo='\n@nomemo' if not self.node.is_memoizable and not leftrec else '')
コード例 #6
0
ファイル: objectmodel.py プロジェクト: sdcloudt/TatSu
    def render_fields(self, fields):
        defs = [safe_name(d) for d, l in compress_seq(self.defines())]
        defs = list(sorted(set(defs)))
        spec = fields["spec"]

        kwargs = '\n'.join('%s = None' % d for d in defs)
        if kwargs:
            kwargs = indent(kwargs)
        else:
            kwargs = indent('pass')

        fields.update(
            class_name=spec.class_name,
            base=spec.base,
            kwargs=kwargs,
        )
コード例 #7
0
ファイル: python.py プロジェクト: neogeny/TatSu
    def make_defines_declaration(self):
        defines = compress_seq(self.defines())
        ldefs = oset(safe_name(d) for d, l in defines if l)
        sdefs = oset(
            safe_name(d) for d, l in defines if not l and d not in ldefs)

        if not (sdefs or ldefs):
            return ''
        else:
            sdefs = '[%s]' % ', '.join(sorted(repr(d) for d in sdefs))
            ldefs = '[%s]' % ', '.join(sorted(repr(d) for d in ldefs))
            if not ldefs:
                return '\n\n    self._define(%s, %s)' % (sdefs, ldefs)
            else:
                return indent('\n' + trim(self.define_template %
                                          (sdefs, ldefs)))
コード例 #8
0
    def render_fields(self, fields):
        defs = [safe_name(d) for d, l in compress_seq(self.defines())]
        defs = list(sorted(set(defs)))

        kwargs = '\n'.join('%s = None' % d for d in defs)
        if kwargs:
            kwargs = indent(kwargs)
        else:
            kwargs = indent('pass')

        spec = _typespec(self.node)

        fields.update(
            class_name=spec.class_name,
            base=spec.base,
            kwargs=kwargs,
        )