Tensor Comprehensions
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
tree.h File Reference
#include <functional>
#include <memory>
#include <vector>
#include "tc/lang/lexer.h"
Include dependency graph for tree.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  lang::Tree
 
struct  lang::String
 
struct  lang::Number
 
struct  lang::Bool
 
struct  lang::Compound
 
struct  lang::pretty_tree
 tree pretty printer More...
 

Namespaces

 lang
 

Typedefs

using lang::TreeRef = std::shared_ptr< Tree >
 
using lang::TreeList = std::vector< TreeRef >
 

Detailed Description

Tree's are used to represent all forms of TC IR, pre- and post-typechecking. Rather than have a full class hierarchy for all TC statements, Trees are a slight variation of Lisp S-expressions. for instance the expression a*b+1 is represented as: (+ (* (ident a) (ident b)) (const 1)) Atoms like 'a', 'b', and '1' are represented by subclasses of Tree which define stringValue() and doubleValue(). Everything else is a Compound object, which has a 'kind' that is a token from Lexer.h's TokenKind enum, and contains a list of subtrees. Like TokenKind single-character operators like '+' are representing using the character itself, so add.kind() == '+'. Compound objects are also always associated with a SourceRange for reporting error message.

Memory management of trees is done using shared_ptr.