diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7c7727320efe5ec04bd8bc43d4cbd7012f118e72
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,29 @@
+CC=gcc
+CFLAGS=-Wall -pedantic -Wextra -g
+LFLAGS=
+
+OUTPUT=fml
+
+SRC_DIR=./src
+BUILD_DIR=./build
+
+.PHONY: init fml
+
+all: init fml
+
+fml: $(BUILD_DIR)/arena.o $(BUILD_DIR)/parser.o $(SRC_DIR)/fml.c #$(BUILD_DIR)/%.o
+	$(CC) $(CFLAGS) $(LFLAGS) $? -o $(OUTPUT)
+
+
+%.o: $(SRC_DIR)/%.c
+	$(CC) $(CFLAGS) -c $< -o $@
+	
+$(BUILD_DIR)/parser.o: $(SRC_DIR)/parser.c
+	$(CC) $(CFLAGS) -c $< -o $@
+	
+$(BUILD_DIR)/arena.o: $(SRC_DIR)/arena.c
+	$(CC) $(CFLAGS) -c $< -o $@
+	
+
+init:
+	mkdir -p build
diff --git a/src/fml.c b/src/fml.c
index 67325264b57a317c6253a6f1e9e7bf3efb24d8fa..ed1cf6de40bb19f2f841ef7be6d45503214386b0 100644
--- a/src/fml.c
+++ b/src/fml.c
@@ -1,5 +1,60 @@
-int main ( int argc, const char * argv [] ) {
+#include <stdio.h>
+#include <string.h>
+#include <stddef.h>
+#include <ctype.h>
 
+#include "arena.h"
+#include "parser.h"
 
-  return 0;
-}
\ No newline at end of file
+#define AST_INTERPRETER_COMMAND "ast_interpret"
+#define RUN "run"
+#define MAX_ARG_LEN 20
+
+int main ( int argc, char **argv ) {
+	if ( argc < 2 ) {
+		fprintf( stderr, "Error: expected at least one argument\n" );
+		return 1;
+	}
+
+  u8 flag = 0;
+  u8 ast_interpret = 0;
+  size_t len;
+  for ( int arg = 1; arg < argc; ++arg ) {
+    len = strlen ( argv [ arg ] );
+    if ( len > MAX_ARG_LEN ) {
+		  fprintf( stderr, "Error: unsupported argument.\n" );
+      flag = 1;
+    }
+    for ( size_t j = 0; j < len; j++ )
+      argv [ arg ] [ j ] = tolower ( argv [ arg ] [ j ] );
+    if ( strncpy ( argv [ arg ], AST_INTERPRETER_COMMAND, len ) == 0 )
+      ast_interpret = 1;
+    else if ( strncpy ( argv [ arg ], RUN, len ) == 0 )
+      ast_interpret = 1;
+    else {
+		  fprintf( stderr, "Error: unsupported argument.\n" );
+      flag = 1;
+    }    
+  }
+
+  if ( flag ) 
+    return 1;
+
+	Arena arena;
+	arena_init( &arena );
+
+	Ast *ast = parse_src ( &arena, (Str) { .str = (u8 *) argv[1], .len = strlen(argv[1]) } );
+
+	if ( ast == NULL ) {
+		fprintf ( stderr, "Failed to parse source\n" );
+		arena_destroy ( &arena );
+		return 1;
+	}
+
+  if ( ast_interpret )
+    return 88;
+
+	arena_destroy( &arena );
+
+	return 0;
+}