Skip to content

Latest commit

 

History

History
146 lines (126 loc) · 2.98 KB

README.md

File metadata and controls

146 lines (126 loc) · 2.98 KB

#Yaml AST beautifier

The script astdumper.py contained in this repository pretty prints the AST trees used by Quantified Code. They are representing the AST as a YAML documents. But unfortunately the map elements within this YAML are unsorted which makes it hard to read the syntax trees.

How to use

First install the following requirements:

  • Python 3
  • pyyaml (pip install pyyaml)

Run the script astdumper.py. It accepts the input on stdin. Alternatively you might specify a file name as first parameter.

Integration with VIM

If you use VIM as your text editor, you can use the piping functionality using the following key sequence:

:%!astdumper.py

(assuming that astdumper.py is in your PATH environment variable)

Usage with xsel

In order to pretty print an AST which is saved in the clipboard buffer, you might use the following bash command:

xsel -b | astdumper.py

Example

The AST for

def greet(who):
  print("Hello " + who + "!")

greet("World")

generated by QuantifiedCode is

- args:
    args:
      - ctx:
          node_type: param
        id: who
        node_type: name
    defaults: []
    kwarg: null
    node_type: arguments
    vararg: null
  body:
    - dest: null
      nl: true
      node_type: print
      values:
        - left:
            left:
              node_type: str
              s: 'Hello '
            node_type: binop
            op:
              node_type: add
            right:
              ctx:
                node_type: load
              id: who
              node_type: name
          node_type: binop
          op:
            node_type: add
          right:
            node_type: str
            s: '!'
  decorator_list: []
  docstring: null
  name: greet
  node_type: functiondef
- node_type: expr
  value:
    args:
      - node_type: str
        s: World
    func:
      ctx:
        node_type: load
      id: greet
      node_type: name
    keywords: []
    kwargs: null
    node_type: call
    starargs: null

This tool transforms the AST into:

- node_type: functiondef
  name: greet
  args:
    node_type: arguments
    args:
    - node_type: name
      id: who
      ctx: {node_type: param}
    defaults: []
    kwarg: null
    vararg: null
  decorator_list: []
  docstring: null
  body:
  - node_type: print
    dest: null
    nl: true
    values:
    - node_type: binop
      left:
        node_type: binop
        left: {node_type: str, s: 'Hello '}
        op: {node_type: add}
        right:
          node_type: name
          id: who
          ctx: {node_type: load}
      op: {node_type: add}
      right: {node_type: str, s: '!'}
- node_type: expr
  value:
    node_type: call
    func:
      node_type: name
      id: greet
      ctx: {node_type: load}
    args:
    - {node_type: str, s: World}
    starargs: null
    keywords: []
    kwargs: null

Both YAML documents are semantically equivalent but I consider the second one much more suitable for human beings.