mirror of
https://github.com/iritmaximus/ttk91-compiler.git
synced 2026-10-12 19:13:40 +03:00
improved readmes
This commit is contained in:
@@ -2,18 +2,5 @@
|
||||
|
||||
TTK-91 is a assembly-like language made for a Computer organization course in Helsinki University.
|
||||
The course used this language to teach how programming languages work, how code is compiled into machine language from a basic assembly-like language.
|
||||
This language is now retiring and as a tribute, I thought I would write a proper CLI compiler for the language in Haskell.
|
||||
|
||||
|
||||
## Todo
|
||||
* Implement
|
||||
* registers
|
||||
* memory
|
||||
* LOAD, STORE
|
||||
* arithmetic operations
|
||||
* comparison
|
||||
* jumps
|
||||
* Stack + operators
|
||||
* System calls
|
||||
* instruction translation to binary and hex
|
||||
* compiler configuration (stdin etc.)
|
||||
This is my take on writing the compiler. The main implementation is in C. The other ones are previous attempts when I hadn't read up on compiler design.
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
# TTK-91 Compiler
|
||||
This is my implementation of the TTK-91 Compiler in C.
|
||||
|
||||
## Overview
|
||||
First the soucre file is read and then fed into `scanner.c` produced by `scanner.flex` and
|
||||
lexing is done. After lexing the tokens are parsed by `parser.c` given by `parser.bison`.
|
||||
The parser will output an AST (Abstract Syntax Tree) which will be then transformed into an IR
|
||||
(Intermediate Representation).
|
||||
|
||||
|
||||
## Scanner
|
||||
The scanner reads through the whole file and splits it up into tokens according to the rules
|
||||
defined in `scanner.flex`. The rules are made up of mostly regular expressions. Few notable
|
||||
mentions are the `comment` token which matches everything after `;` until the EOF (End Of File)
|
||||
and `label` token which matches all words made up of letters in the Finnish alphabet + numbers + `_`
|
||||
starting with a letter.
|
||||
|
||||
## Parser
|
||||
The parser matches the tokens given by `scanner.c` to rules given in `parser.bison`. The left side
|
||||
represents a single non-terminal token and the right side represents all decompositions the
|
||||
non-terminal can be. For example if we had rule `expr: value TOKEN_PLUS value;`, and
|
||||
`value: TOKEN_NUM;` we could match all strings (assuming the scanner is normal) that have the from
|
||||
`x + y`. We then could say that `expr: value TOKEN_PLUS value { /* do C things */}` and
|
||||
feed the tokens to a function that creates a C representation of the same expression.
|
||||
In the C block `$n` means the n-th tokens of the rule and $$ means the left side of the rule.
|
||||
Example: `value: TOKEN_NUM { $$ = $1; }` means that that rule is equal to the first token of the
|
||||
rule. Adding to that `expr: value TOKEN_PLUS value { $$ = $1 + $3; }` means that expr is equal to
|
||||
both of the numbers added together. Read more about this from:
|
||||
`Introduction to Compilers and Language Design, Prof. Douglas Thain, Second Edition`.
|
||||
|
||||
## Types
|
||||
TODO
|
||||
|
||||
### Expr
|
||||
`expr` represents basically a line. It can contain a normal instruction, compiler definition or
|
||||
a comment.
|
||||
|
||||
### Value
|
||||
Reference in New Issue
Block a user