-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparsing.c
52 lines (51 loc) · 1.53 KB
/
parsing.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Read Evaluate Print Loop....
#include "mpc.h"
#include <readline/history.h>
#include <readline/readline.h>
#include <stdio.h>
#include <stdlib.h>
int
main ()
{
/* 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);
/*char input[2048];*/
puts ("Lisp Version 1.0.0.1");
puts ("Press Ctrl-c to exit\n");
while (1)
{
char *input = readline ("Lispy>");
add_history (input);
/*printf ("Am i really a %s\n", 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 (input);
}
/* Undefine and Delete our Parsers */
mpc_cleanup (4, Number, Operator, Expr, Lispy);
return 0;
}