| Index: frog/scripts/tree_gen.py
|
| diff --git a/frog/scripts/tree_gen.py b/frog/scripts/tree_gen.py
|
| deleted file mode 100755
|
| index 973d7b7a812512f83e9fed5c79c005bd6cbc1394..0000000000000000000000000000000000000000
|
| --- a/frog/scripts/tree_gen.py
|
| +++ /dev/null
|
| @@ -1,243 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| -# for details. All rights reserved. Use of this source code is governed by a
|
| -# BSD-style license that can be found in the LICENSE file.
|
| -
|
| -'''Generates the many subtypes of Node as well as a NodeVisitor into
|
| - tree.g.dart.'''
|
| -
|
| -from codegen import CodeWriter
|
| -
|
| -class Node:
|
| - def __init__(self, name, properties=None):
|
| - if properties is None:
|
| - self.properties = []
|
| - else:
|
| - self.properties = [p.strip().split() for p in properties.split(',')]
|
| - self.kind = self.__class__.__name__
|
| -
|
| - self.name = name
|
| - if self.name.endswith('!'):
|
| - self.name = self.name[:-1]
|
| - self.fullname = self.name
|
| - else:
|
| - self.fullname = self.name + self.kind
|
| -
|
| - def write(self, cw):
|
| - cw.enterBlock('class %s extends %s {' % (self.fullname, self.kind))
|
| -
|
| - for typ, name in self.properties:
|
| - cw.writeln('%s %s;', typ, name)
|
| -
|
| - args = ['this.%s' % name for typ, name in self.properties]
|
| - args.append('SourceSpan span')
|
| -
|
| - cw.writeln('')
|
| -
|
| - cw.writeln('%s(%s): super(span) {}', self.fullname, ', '.join(args));
|
| -
|
| - cw.writeln('')
|
| -
|
| - cw.writeln('visit(TreeVisitor visitor) => visitor.visit%s(this);'
|
| - % self.fullname)
|
| -
|
| - cw.exitBlock('}')
|
| -
|
| - def writeVisitInterfaceMethod(self, cw):
|
| - cw.writeln('visit%s(%s node);', self.fullname, self.fullname)
|
| -
|
| - def writePrettyPrintMethod(self, cw):
|
| - cw.enterBlock('void visit%s(%s node) {' % (self.fullname, self.fullname))
|
| - if oneLineProperties(self.properties):
|
| - cw.writeln(
|
| - 'output.heading(%r + output.toValue(node.%s) + ")", node.span);' %
|
| - (self.fullname + '(', self.properties[0][1]))
|
| - else:
|
| - cw.writeln('output.heading(%r, node.span);' % self.fullname)
|
| - for typ, name in self.properties:
|
| - if isNodeType(typ):
|
| - cw.writeln('output.writeNode(%r, node.%s);', name, name)
|
| - elif isListType(typ):
|
| - innerType = typ[len('List<'):-1]
|
| - if isNodeType(innerType):
|
| - cw.writeln('output.writeNodeList(%r, node.%s);', name, name)
|
| - else:
|
| - cw.writeln('output.writeList(%r, node.%s);', name, name)
|
| - else:
|
| - cw.writeln('output.writeValue(%r, node.%s);', name, name)
|
| - cw.exitBlock('}')
|
| -
|
| -def oneLineProperties(properties):
|
| - if len(properties) != 1: return False
|
| -
|
| - propType = properties[0][0]
|
| -
|
| - if propType == 'Identifier': return True
|
| - if isNodeType(propType): return False
|
| - if isListType(propType): return False
|
| -
|
| - return True
|
| -
|
| -def isNodeType(typ):
|
| - return (typ.endswith('Expression') or typ.endswith('Statement') or
|
| - typ.endswith('Node') or typ.endswith('TypeReference') or
|
| - typ.endswith('Identifier') or typ.endswith('Definition'))
|
| -
|
| -def isListType(typ):
|
| - return typ.startswith('List<')
|
| -
|
| -class Expression(Node): pass
|
| -
|
| -class Statement(Node): pass
|
| -
|
| -class Definition(Node): pass
|
| -
|
| -class TypeReference(Node): pass
|
| -
|
| -nodes = [
|
| - Definition('Directive', 'Identifier name, List<ArgumentNode> arguments'),
|
| -
|
| - Definition('Type',
|
| - 'bool isClass, Identifier name, List<ParameterType> typeParameters, '+
|
| - 'List<TypeReference> extendsTypes, List<TypeReference> implementsTypes, '+
|
| - 'NativeType nativeType, DefaultTypeReference defaultType, '+
|
| - 'List<Statement> body'),
|
| -
|
| - Definition('FunctionType',
|
| - 'FunctionDefinition func, List<ParameterType> typeParameters'),
|
| -
|
| - Definition('Variable',
|
| - 'List<Token> modifiers, TypeReference type, List<Identifier> names,' +
|
| - 'List<Expression> values'),
|
| -
|
| - Definition('Function',
|
| - 'List<Token> modifiers, TypeReference returnType, Identifier name,' +
|
| - 'List<FormalNode> formals, List<Expression> initializers, ' +
|
| - 'String nativeBody, Statement body'),
|
| -
|
| - Statement('Return', 'Expression value'),
|
| - Statement('Throw', 'Expression value'),
|
| - Statement('Assert', 'Expression test'),
|
| -
|
| - Statement('Break', 'Identifier label'),
|
| - Statement('Continue', 'Identifier label'),
|
| -
|
| - Statement('If',
|
| - 'Expression test, Statement trueBranch, Statement falseBranch'),
|
| - Statement('While', 'Expression test, Statement body'),
|
| - Statement('Do', 'Statement body, Expression test'),
|
| - Statement('For',
|
| - 'Statement init, Expression test, List<Expression> step, Statement body'),
|
| - Statement('ForIn',
|
| - 'DeclaredIdentifier item, Expression list, Statement body'),
|
| -
|
| - Statement('Try',
|
| - 'Statement body, List<CatchNode> catches, Statement finallyBlock'),
|
| - Statement('Switch', 'Expression test, List<CaseNode> cases'),
|
| -
|
| - Statement('Block', 'List<Statement> body'),
|
| -
|
| - Statement('Labeled', 'Identifier name, Statement body'),
|
| - Statement('Expression', 'Expression body'),
|
| - Statement('Empty'),
|
| - Statement('Diet'),
|
| -
|
| - Expression('Lambda', 'FunctionDefinition func'),
|
| - Expression('Call', 'Expression target, List<ArgumentNode> arguments'),
|
| -
|
| - # These three desugar into Call, but that is handled in gen, not parser.
|
| - Expression('Index', 'Expression target, Expression index'),
|
| - Expression('Binary', 'Token op, Expression x, Expression y'),
|
| - Expression('Unary', 'Token op, Expression self'),
|
| -
|
| - Expression('Postfix', 'Expression body, Token op'),
|
| -
|
| - Expression('New',
|
| - 'bool isConst, TypeReference type, Identifier name,' +
|
| - 'List<ArgumentNode> arguments'),
|
| -
|
| - Expression('List',
|
| - 'bool isConst, TypeReference itemType, List<Expression> values'),
|
| - Expression('Map',
|
| - 'bool isConst, TypeReference keyType, TypeReference valueType,' +
|
| - 'List<Expression> items'),
|
| -
|
| - Expression('Conditional',
|
| - 'Expression test, Expression trueBranch, Expression falseBranch'),
|
| -
|
| - Expression('Is', 'bool isTrue, Expression x, TypeReference type'),
|
| - Expression('Paren', 'Expression body'),
|
| - Expression('Await', 'Expression body'),
|
| -
|
| - Expression('Dot', 'Expression self, Identifier name'),
|
| - Expression('Var', 'Identifier name'),
|
| -
|
| - Expression('This'),
|
| - Expression('Super'),
|
| -
|
| - Expression('Literal', 'Value value'),
|
| -
|
| - Expression('StringInterp', 'List<Expression> pieces'),
|
| -
|
| - # TODO(jimhug): Split into Simple and Qualified names
|
| - TypeReference('Simple', 'Type type'),
|
| - TypeReference('Name',
|
| - 'bool isFinal, Identifier name, List<Identifier> names'),
|
| -
|
| - TypeReference('Generic',
|
| - 'TypeReference baseType, List<TypeReference> typeArguments, int depth'),
|
| - TypeReference('Function',
|
| - 'bool isFinal, FunctionDefinition func'),
|
| - # TODO(jimhug): This shouldn't be a subtype of TypeReference.
|
| - TypeReference('Default', 'bool oldFactory, NameTypeReference baseType, '+
|
| - 'List<ParameterType> typeParameters'),
|
| -
|
| - Node('Argument', 'Identifier label, Expression value'),
|
| - Node('Formal',
|
| - 'bool isThis, bool isRest, TypeReference type, Identifier name,'+
|
| - 'Expression value'),
|
| -
|
| - Node('Catch',
|
| - 'DeclaredIdentifier exception, DeclaredIdentifier trace, Statement body'),
|
| - Node('Case',
|
| - 'Identifier label, List<Expression> cases, List<Statement> statements'),
|
| -
|
| - # Don't want to add Node to these names, use ! as convention to say so.
|
| - Node('TypeParameter!', 'Identifier name, TypeReference extendsType'),
|
| -
|
| - # TODO(jimhug): Consider removing this node and just using String.
|
| - Node('Identifier!', 'String name'),
|
| -
|
| - # Pseudo Expression for cover grammar approach
|
| - Expression('DeclaredIdentifier!',
|
| - 'TypeReference type, Identifier name, bool isFinal'),
|
| -]
|
| -
|
| -def main():
|
| - cw = CodeWriter(__file__)
|
| -
|
| - for node in nodes:
|
| - node.write(cw)
|
| - cw.writeln()
|
| -
|
| - cw.writeln()
|
| - cw.enterBlock('interface TreeVisitor {')
|
| - for node in nodes:
|
| - node.writeVisitInterfaceMethod(cw)
|
| - cw.writeln()
|
| -
|
| - cw.exitBlock('}')
|
| -
|
| - cw.writeln()
|
| - cw.enterBlock('class TreePrinter implements TreeVisitor {')
|
| -
|
| - cw.writeln('var output;')
|
| - cw.writeln('TreePrinter(this.output) { output.printer = this; }')
|
| - for node in nodes:
|
| - node.writePrettyPrintMethod(cw)
|
| - cw.writeln()
|
| - cw.exitBlock('}')
|
| -
|
| - cw.writeToFile('tree')
|
| -
|
| -if __name__ == '__main__': main()
|
|
|