Browse Source

Add chapter 6

master
T. Meissner 6 years ago
parent
commit
84abd5e5eb
2 changed files with 97 additions and 0 deletions
  1. +13
    -0
      chapter_06/Makefile
  2. +84
    -0
      chapter_06/parsing.c

+ 13
- 0
chapter_06/Makefile View File

@ -0,0 +1,13 @@
MPC_DIR := ../mpc
all: parsing
%: %.c
cc -std=c11 -Wall $@.c ${MPC_DIR}/mpc.c -ledit -o $@
.PHONY: clean
clean:
rm -rf parsing

+ 84
- 0
chapter_06/parsing.c View File

@ -0,0 +1,84 @@
#include <stdio.h>
#include <stdlib.h>
#include "../mpc/mpc.h"
/* If we are on Windows compile these functions */
#ifdef _WIN32
#include <string.h>
#include <assert.h>
static char buffer[2048];
/* Fake readline function */
char* readline(char* prompt) {
fputs(prompt, stdout);
fgets(buffer, 2048, stdin);
char* cpy = malloc(strlen(buffer)+1);
assert(cpy != NULL)
strcpy(cpy, buffer);
cpy[strlen(cpy)-1] = '\0';
return cpy;
}
/* Fake add_history function */
void add_history(char* unused) {}
/* Otherwise include the editline headers
could use __APPLE__ for detection of OSX */
#else
#include <editline/readline.h>
#endif
int main(int argc, char const *argv[])
{
/* Create some parsers */
mpc_parser_t* Number = mpc_new("number");
mpc_parser_t* Operator = mpc_new("operator");
mpc_parser_t* Expr = mpc_new("expr");
mpc_parser_t* Lispy = mpc_new("lispy");
/* Define them with the following language */
mpca_lang(MPCA_LANG_DEFAULT,
" \
number : /-?[0-9]+/ ; \
operator : '+' | '-' | '*' | '/' ; \
expr : <number> | '(' <operator> <expr>+ ')' ; \
lispy : /^/ <operator> <expr>+ /$/ ; \
",
Number, Operator, Expr, Lispy);
/* Print version and exit information */
puts("Lispy version 0.0.0.0.1");
puts("Press Ctrl+c to exit\n");
/* In a never ending loop */
while (1) {
/* Output our prompt and get input */
char* input = readline("lispy> ");
/* Add input to history */
add_history(input);
/* Attempt to parse the user input */
mpc_result_t r;
if (mpc_parse("<stdin>", input, Lispy, &r)) {
/* On success print the AST */
mpc_ast_print(r.output);
mpc_ast_delete(r.output);
} else {
/* Otherwise print the error */
mpc_err_print(r.error);
mpc_err_delete(r.error);
}
/* Free retrieved input */
free(input);
}
/* Undefine and delete our parsers */
mpc_cleanup(4, Number, Operator, Expr, Lispy);
return 0;
}

Loading…
Cancel
Save