Introduction
In class we looked at depython
, some types for representing python abstract syntax trees.
In python you can introspect code using the ast
module.
import ast
ast.dump(ast.parse("123"))
The result is
Module(body=[Expr(value=Num(n=123))])
A more complicated example:
ast.dump(ast.parse("2 + 3"))
Results in
Module(body=[Expr(value=BinOp(left=Num(n=2), op=Add(), right=Num(n=3)))])
Types
We can define OCaml types similar to the above representations of python ast
(* depython - data types for representing python code
Copyright 2022 Humberto Ortiz-Zuazaga <humberto.ortiz@upr.edu>
See LICENSE file for details.
*)
type binop = Add | Sub | Mul | Div
type expr =
| BinOp of binop * expr * expr
| Num of int
| Name of string
type stm =
| Expr of expr
| Print of expr
| Assign of string * expr
type prog = Module of stm list
let p1 = Module [Assign ("a", BinOp (Add, Num 5, Num 4))];;
let rec interp e =
(* unfinished *)
match e with
| Num x -> x
| BinOp (Add, e1, e2) -> interp e1 + interp e2
I have made a github repository with the depython data types.
Homework
Implement a function to compute the depth of the largest expression in a depython prog
. Be careful to check everywhere there may be an expression.
Examples
Some example depython programs and their depth:
Module [Expr (Num 33)]
Depth 0.
Module [Print (BinOp (Sub, Num 112, Num 23))]
Depth 1.
Module [Assign ("a", Num 4);
Expr (BinOp (Add, Num 8,
BinOp (Mul , Name "a", Name "a")))]
Depth 2.