C++ Implementations of programming languages and type systems studied in "Types and Programming Languages" by Benjamin C. Pierce..
Implementations of programming languages and type systems studied in Types and Programming Languages.
Each subdirectory implements one of the languages studied in the book. Each such implementation consists of a lexer, parser, interpreter, and type system for the language implemented.
Each implementation contains 3 files:
Language | Directory | Status |
---|---|---|
Untyped Arithmetic Expressions | ch04_arith | :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Interpreter + Tests |
The Untyped Lmabda Calculus | ch07_untyped | :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Interpreter + Tests |
Typed Arithmetic Expressions | ch08_tyarith | :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Interpreter & Type Checker + Tests |
Simply Typed Lambda Calculus | ch10_simplebool | :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Type Checker + Tests :heavy_check_mark: Interpreter + Tests |
Typed Lambda Calculus (with various extensions) | ch11_fullsimple | Natural numbers (Nat) type support :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Type Checker + Tests Records and Projections :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Type Checker + Tests |
Typed Lambda Calculus with Subtyping | ch17_rcdjoinsub | :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Interpreter + Tests |
Typed Lambda Calculus with Imperative Objects | ch18_fullref Example Programs |
Let bindings support :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Interpreter + Tests References (Ref, Source, Sink) :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Interpreter + Tests Sequencing :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Interpreter + Tests Recursion :heavy_check_mark: Lexer + Tests :heavy_check_mark: Parser + Tests :heavy_check_mark: Interpreter + Tests |
cd ch##_<lang>
clang++ --std=c++17 test.cpp && ./a.out
cd ch##_<lang>
clang++ --std=c++17 interpreter.cpp && ./a.out "input program"