Writing and Improvising a C-Clone interpreter
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 ' |
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.
name | definition |
---|---|
function | TYPE IDENTIFIER argument_list block |
argument_list | LPAREN argument *(COMMA argument) RPAREN |
argument | TYPE IDENT |