summaryrefslogtreecommitdiff
path: root/test/recdescent1.rl
blob: 1ffca2800802b66b92171a635576dae5663de356 (plain)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 * @LANG: c
 * Test growable stack.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

%%{
	machine recdescent;

	prepush { 
		if ( top == stack_size ) {
			printf( "growing stack\n" );
			stack_size = top * 2;
			stack = (int*)realloc( stack, sizeof(int)*stack_size );
		}
	}

	postpop { 
		if ( stack_size > (top * 4) ) {
			stack_size = top * 2;
			stack = (int*)realloc( stack, sizeof(int)*stack_size );
			printf( "shrinking stack\n" );
		}
	}

	action item_start { item = p; }

	action item_finish
	{
		printf( "item: " );
		fwrite( item, 1, p-item, stdout );
		printf( "\n" );
	}

	action call_main
	{
		printf( "calling main\n" );
		fcall main;
	}

	action return_main
	{
		if ( top == 0 ) {
			printf( "STRAY CLOSE\n" );
			fbreak;
		}

		printf( "returning from main\n" );
		fhold;
		fret;
	}

	id = [a-zA-Z_]+;
	number = [0-9]+;
	ws = [ \t\n]+;

	main := ( 
		ws |
		( number | id ) >item_start %item_finish |

		'{' @call_main '}' |

		'}' @return_main
	)**;
}%%

%% write data;

void test( char *buf )
{
	int cs;
	int *stack;
	int top, stack_size;
	char *p, *pe, *eof, *item = 0;

	int len = strlen( buf );

	%% write init;

	stack_size = 1;
	stack = (int*)malloc( sizeof(int) * stack_size );

	p = buf;
	pe = buf + len;
	eof = pe;

	%% write exec;

	if ( cs == recdescent_error ) {
		/* Machine failed before finding a token. */
		printf( "PARSE ERROR\n" );
	}
}

int main()
{
	test( "88 foo { 99 {{{{}}}}{ } }");
	test( "76 } sadf");
	return 0;
}

#ifdef _____OUTPUT_____
item: 88
item: foo
calling main
item: 99
calling main
growing stack
calling main
growing stack
calling main
calling main
growing stack
returning from main
returning from main
returning from main
returning from main
shrinking stack
calling main
returning from main
returning from main
shrinking stack
item: 76
STRAY CLOSE
#endif