Writing and improving a C interpreter from the book "Born to Code in C"
C 30.40%Rust 69.60%
c-interpreter's Introduction
Cyclone
Writing and Improvising a C-Clone interpreter
The language tokens being considered are:
TOKEN
EXAMPLE
LBRACE
' { '
RBRACE
' } '
LPAREN
' ( '
RPAREN
' ) '
ASSIGN
' = '
COMMA
' , '
DIGIT
123
FLOAT
3.14
ADDOP
' + ' , ' - '
MULOP
' * ' , ' / ', ' % '
LT
' < '
GT
' > '
EQ
' =='
LE
' <='
GE
' >= '
TYPE
' int '
IDENT
' i ' , ' tree '
The production rules to evaluating code:
Note, the terms in capitals imply the token should be consumed when parsing
name
definition
program
MAIN block
block
LBRACE statement_list RBRACE
statement_list
[statement *(SEMI statement) [SEMI]]
statement
(expr SEMI | declaration | block)
expr
addop *(ASSIGN expr)
addop
term *((PLUS/MINUS) expr)
mulop
atom ((MUL/DIV) expr)
atom
(PLUS/MINUS) atom | INTEGER | LPAREN expr RPAREN | IDENTIFIER
declaration
type IDENTIFIER [ASSIGN expr] SEMI
type
INT,FLOAT //TODO: IMPLEMENT FLOAT
Pay attention to the definition of statement list, here I'm saying that it is possible to have an empty statement list, as well as that the last statement doesn't necesarily need a closing SEMI. This is because I'm using rust syntax, in which if the last statement doesn't use a closing semi, it is considered a return value.
Something is not right... the current declaration scheme is pretty rigid, and does not support user defined types. This isn't a problem now, but, it might be in the future.