class Entity(Entry): id = pyast.field(Identifier) index = pyast.seq(Expression, null=True) value = pyast.field(Value, null=True) attrs = pyast.dict(Attribute, null=True) local = pyast.field(bool, default=False) def _template(self): return "<%(id)s %(value)s>"
class Entity(ast.Node): _debug = True id = ast.field(str) value = ast.field(Value, null=True) @property def _template(self): if self.value: return '<%(id)s %(value)s>' return '<%(id)s>'
class Value(ast.Node): content = ast.field(str) _template = '"%(content)s"' def __repr__(self): content = self.content.replace('"', '\\"') return super(Value, self).__repr__(fields={'content': content})
class Expander(Node): expression = pyast.field(Expression)
class VariableExpression(Expression): id = pyast.field(Identifier)
class ImportStatement(Statement): uri = pyast.field(String)
class Value(ast.Node): content = ast.field(str) @property def _template(self): return '"%(content)s"'
class Attribute(KeyValuePair): local = pyast.field(bool, default=False)
class BinaryOperator(Operator): token = pyast.field( ("==", "!=", "<", "<=", ">", ">=", "+", "-", "*", "/", "%"))
class UnaryExpression(Expression): operator = pyast.field(UnaryOperator) argument = pyast.field(Expression)
class CallExpression(MemberExpression): callee = pyast.field(Expression) arguments = pyast.seq(Expression, null=True)
class BinaryExpression(Expression): operator = pyast.field(BinaryOperator) left = pyast.field(Expression) right = pyast.field(Expression)
class ConditionalExpression(Expression): test = pyast.field(Expression) consequent = pyast.field(Expression) alternate = pyast.field(Expression)
class LogicalExpression(Expression): operator = pyast.field(LogicalOperator) left = pyast.field(Expression) right = pyast.field(Expression)
class Literal(Expression): value = pyast.field(int) __template = '%(value)s'
class LogicalOperator(Operator): token = pyast.field(("||", "&&"))
class KeyValuePair(Node): key = pyast.field(Identifier) value = pyast.field(Value) _abstract = True
class Comment(Entry): content = pyast.field(basestring, null=True) _template = "/* %(content)s */"
class HashItem(KeyValuePair): default = pyast.field(bool, default=False)
class KVP(ast.Node): key = ast.field(str) value = ast.field(str)
class PropertyExpression(MemberExpression): expression = pyast.field(Expression) property = pyast.field(Expression) computed = pyast.field(bool)
class UnaryOperator(Operator): token = pyast.field(("-", "+", "!"))
class Macro(Entry): id = pyast.field(Identifier) args = pyast.seq(VariableExpression) expression = pyast.field(Expression) attrs = pyast.seq(Attribute, null=True)
class AttributeExpression(MemberExpression): expression = pyast.field(Expression) attribute = pyast.field(Expression) computed = pyast.field(bool)
class Value(ast.Node): content = ast.field(str) _template = '"%(content)s"'
class ParenthesisExpression(Expression): expression = pyast.field(Expression)
class Entity(ast.Node): _debug = True id = ast.field(str) value = ast.field(str) _template = '<%(id)s %(value)s>'
class GlobalsExpression(Expression): id = pyast.field(Identifier)
class Identifier(Expression): name = pyast.field(pyast.re('[_a-zA-Z]\w*')) _template = "%(name)s"
class String(Value): content = pyast.field(basestring) _template = "\"%(content)s\""