Pārlūkot izejas kodu

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 gadi atpakaļ
vecāks
revīzija
f045bb872e
3 mainītis faili ar 39 papildinājumiem un 3 dzēšanām
  1. 4 0
      c/mul/.gitignore
  2. 10 2
      c/mul/Makefile
  3. 25 1
      c/mul/main.c

+ 4 - 0
c/mul/.gitignore

@ -0,0 +1,4 @@
1
/mpc.c
2
/mpc.h
3
4
/mul

+ 10 - 2
c/mul/Makefile

@ -3,8 +3,16 @@ CC=gcc -std=c99
3 3
run: mul
4 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 17
clean:
10 18
	rm -f mul

+ 25 - 1
c/mul/main.c

@ -2,17 +2,41 @@
2 2
3 3
#include <editline/readline.h>
4 4
5
#include "mpc.h"
6
5 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 22
	puts("mul v0.0.1\n");
7 23
8 24
	while (1) {
9 25
		char* input = readline("> ");
10 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 37
		free(input);
15 38
	}
16 39
40
	mpc_cleanup(4, Number, Operator, Expr, Lang);
17 41
	return 0;
18 42
}