Просмотр исходного кода

a simple parser using the mpc parser combinator library.

that such a thing even exists...

bonus points for using peg's? but then what ast would we get? mhh...
Lucas Stadler лет назад: 11
Родитель
Сommit
f045bb872e
3 измененных файлов с 39 добавлено и 3 удалено
  1. 4 0
      c/mul/.gitignore
  2. 10 2
      c/mul/Makefile
  3. 25 1
      c/mul/main.c

+ 4 - 0
c/mul/.gitignore

1
/mpc.c
2
/mpc.h
3
4
/mul

+ 10 - 2
c/mul/Makefile

3
run: mul
3
run: mul
4
	./mul
4
	./mul
5
5
6
mul: main.c
7
	$(CC) -ledit main.c -o mul
6
mul: main.c mpc.c mpc.h
7
	$(CC) -ledit -lm mpc.c main.c -o mul
8
9
mpc_base_url=https://raw.githubusercontent.com/orangeduck/mpc/a25dc955a
10
11
mpc.h:
12
	curl -O $(mpc_base_url)/mpc.h
13
14
mpc.c:
15
	curl -O $(mpc_base_url)/mpc.c
8
16
9
clean:
17
clean:
10
	rm -f mul
18
	rm -f mul

+ 25 - 1
c/mul/main.c

2
2
3
#include <editline/readline.h>
3
#include <editline/readline.h>
4
4
5
#include "mpc.h"
6
5
int main(int argc, char** argv) {
7
int main(int argc, char** argv) {
8
	mpc_parser_t* Number = mpc_new("number");
9
	mpc_parser_t* Operator = mpc_new("operator");
10
	mpc_parser_t* Expr = mpc_new("expr");
11
	mpc_parser_t* Lang = mpc_new("lang");
12
13
	mpca_lang(MPC_LANG_DEFAULT,
14
		"\
15
number   : /-?[0-9]+/ ; \
16
operator : '+' | '-' | '*' | '/' ; \
17
expr     : <number> | '(' <operator> <expr>+ ')' ; \
18
lang     : /^/ <expr>+ /$/ ; \
19
",
20
		Number, Operator, Expr, Lang);
21
6
	puts("mul v0.0.1\n");
22
	puts("mul v0.0.1\n");
7
23
8
	while (1) {
24
	while (1) {
9
		char* input = readline("> ");
25
		char* input = readline("> ");
10
		add_history(input);
26
		add_history(input);
11
27
12
		printf("%s, yes.", input);
28
		mpc_result_t r;
29
		if (mpc_parse("<stdin>", input, Lang, &r)) {
30
			mpc_ast_print(r.output);
31
			mpc_ast_delete(r.output);
32
		} else {
33
			mpc_err_print(r.error);
34
			mpc_err_delete(r.error);
35
		}
13
36
14
		free(input);
37
		free(input);
15
	}
38
	}
16
39
40
	mpc_cleanup(4, Number, Operator, Expr, Lang);
17
	return 0;
41
	return 0;
18
}
42
}