Użyta gramatyka - patrykkurczyna/ClojureInterpreter GitHub Wiki
Rozpoznawany język jest zgodny z załączoną gramatyką:
input -> expr_list
expr_list -> expr_list expression
expression -> '(' ID expr_list ')'
expression -> '(' DEFUN ID list expr_list ')'
expression -> '(' LOOP expression expr_list ')'
expression -> atom
atom -> INTEGER
atom -> FLOAT
atom -> STRING
atom -> BRACKET expr_list ')'
atom -> idname
idname -> ID
list -> '(' ')'
list -> '(' expr_list '.' expression ')'
list -> '(' expr_list ')'
Tokeny rozpoznajemy następująco:
-
FLOAT
r"-?(\d+(.\d*)|.\d+)" -
INTEGER
r"-?\d+" -
STRING
r'"([^\\n]|(\.))*?"' -
ID
r"[a-zA-Z_]\w*|+|-|/|*|<=|>=|<|>"
Gdy znajdziemy token 'defun' lub 'loop' to zmieniamy jego typ z ID na odpowiednio 'DEFUN' lub 'LOOP'.
-
BRACKET
r''(' -
COMMENT
r'[;][^\n]*'
Komentarze rozpoczynają się średnikiem i kończą się znakiem końca linii.