Skip to content

Instantly share code, notes, and snippets.

@jacqueswww
Last active November 9, 2021 02:55
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jacqueswww/aa24d22d95a578429e0f25f5f2de0b36 to your computer and use it in GitHub Desktop.
Save jacqueswww/aa24d22d95a578429e0f25f5f2de0b36 to your computer and use it in GitHub Desktop.
First VyperNode output
class VyperNode:
def __init__(source_code, pos):
self.source_code = source_code
self.lineno, self.col_offset = pos
class Name(VyperNode):
pass
class Subscript(VyperNode):
pass
class Index(VyperNode):
pass
class arg(VyperNode):
pass
class Tuple(VyperNode):
pass
class FunctionDef(VyperNode):
pass
class arguments(VyperNode):
pass
class Import(VyperNode):
pass
class Call(VyperNode):
pass
class Str(VyperNode):
pass
class Compare(VyperNode):
pass
class Num(VyperNode):
pass
class NameConstant(VyperNode):
pass
class Attribute(VyperNode):
pass
class BinOp(VyperNode):
pass
class BoolOp(VyperNode):
pass
class UnaryOp(VyperNode):
pass
class List(VyperNode):
pass
class Dict(VyperNode):
pass
class Bytes(VyperNode):
pass
class Add(VyperNode):
pass
class Sub(VyperNode):
pass
class Mult(VyperNode):
pass
class Div(VyperNode):
pass
class Mod(VyperNode):
pass
class Pow(VyperNode):
pass
class In(VyperNode):
pass
class Gt(VyperNode):
pass
class GtE(VyperNode):
pass
class LtE(VyperNode):
pass
class Lt(VyperNode):
pass
class Eq(VyperNode):
pass
class NotEq(VyperNode):
pass
class And(VyperNode):
pass
class Or(VyperNode):
pass
class Not(VyperNode):
pass
class USub(VyperNode):
pass
class Expr(VyperNode):
pass
class Pass(VyperNode):
pass
class AnnAssign(VyperNode):
pass
class Assign(VyperNode):
pass
class If(VyperNode):
pass
class Assert(VyperNode):
pass
class For(VyperNode):
pass
class AugAssign(VyperNode):
pass
class Break(VyperNode):
pass
class Continue(VyperNode):
pass
class Return(VyperNode):
pass
class Delete(VyperNode):
pass
class stmt(VyperNode):
pass
class ClassDef(VyperNode):
pass
class ImportFrom(VyperNode):
pass
@rocky
Copy link

rocky commented Apr 1, 2019

Suggestions:

Add an id field so that a program can refer to an AST node by its id.

If you define a string srcmap analogous to how solc does it, that would help interoperability of tools (e.g. static analysis tools, linters, tracers). It is documented here.

There is an implicit compression that can be generalized: if a length is 1 it can be omitted. If there is only one "file" or (container) it would be 0 and that would be omitted. So then the only change is from line/col to byte offset, a single (string) value.

Also note that when you get down to bytecode or ewasm. The sourcemap idea can be used again and it allows for a construct to refer to mulitiple non-contiguous regions of llvm/evm bytecode/ewasm.

On second thought, where the id field is most important is in the JSON representation. In addition to the id field, there would be the class names would appear as a field in "nodeType" (as it does in solc's ast) And there would be a "nodes" field which contains all of the children nodes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment