-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.in
175 lines (134 loc) · 7.3 KB
/
grammar.in
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# this is a sample comment!
PROGRAM -> @jump_to_main GLOBAL_STATEMENT_LANGUAGE @check_all_function_have_signature eof
GLOBAL_STATEMENT_LANGUAGE -> GLOBAL_STATEMENT_VARIABLES_START GLOBAL_STATEMENT_FUNCTION_START
GLOBAL_STATEMENT_VARIABLES_START -> GLOBAL_STATEMENT_VARIABLES GLOBAL_STATEMENT_VARIABLES_LANGUAGE
GLOBAL_STATEMENT_VARIABLES_START -> nil
GLOBAL_STATEMENT_VARIABLES_LANGUAGE -> nil
GLOBAL_STATEMENT_VARIABLES_LANGUAGE -> GLOBAL_STATEMENT_VARIABLES GLOBAL_STATEMENT_VARIABLES_LANGUAGE
GLOBAL_STATEMENT_VARIABLES -> DECLARATION_STATEMENT
GLOBAL_STATEMENT_FUNCTION_START -> GLOBAL_STATEMENT_FUNCTION GLOBAL_STATEMENT_FUNCTION_LANGUAGE
GLOBAL_STATEMENT_FUNCTION_START -> nil
GLOBAL_STATEMENT_FUNCTION_LANGUAGE -> nil
GLOBAL_STATEMENT_FUNCTION_LANGUAGE -> GLOBAL_STATEMENT_FUNCTION GLOBAL_STATEMENT_FUNCTION_LANGUAGE
GLOBAL_STATEMENT_FUNCTION -> FUNCTION_DECLARATION
FUNCTION_DECLARATION -> @start_of_function function FUNCTION_DECLARATION2
FUNCTION_DECLARATION2 -> @push void @push identifier ( FUNCTION_VARIABLES ) REST_OF_FUNCTION_VOID
FUNCTION_DECLARATION2 -> @push TYPE @push identifier ( FUNCTION_VARIABLES ) REST_OF_FUNCTION_NOT_VOID
REST_OF_FUNCTION_VOID -> { @function_declaration VOID_FUNCTION_STATEMENT_LANGUAGE @jump_out_of_void_function }
REST_OF_FUNCTION_VOID -> @signature_function_declaration ;
REST_OF_FUNCTION_NOT_VOID -> { @function_declaration NOT_VOID_FUNCTION_STATEMENT_LANGUAGE @jump_out_of_not_void_function }
REST_OF_FUNCTION_NOT_VOID -> @signature_function_declaration ;
FUNCTION_VARIABLES -> nil
FUNCTION_VARIABLES -> @push TYPE @push identifier FUNCTION_VARIABLES2
FUNCTION_VARIABLES2 -> , @push TYPE @push identifier FUNCTION_VARIABLES2
FUNCTION_VARIABLES2 -> nil
VOID_FUNCTION_STATEMENT_LANGUAGE -> VOID_FUNCTION_STATEMENT VOID_FUNCTION_STATEMENT_LANGUAGE
VOID_FUNCTION_STATEMENT_LANGUAGE -> nil
VOID_FUNCTION_STATEMENT -> return @return_void ;
VOID_FUNCTION_STATEMENT -> STATEMENT
NOT_VOID_FUNCTION_STATEMENT_LANGUAGE -> NOT_VOID_FUNCTION_STATEMENT NOT_VOID_FUNCTION_STATEMENT_LANGUAGE
NOT_VOID_FUNCTION_STATEMENT_LANGUAGE -> nil
NOT_VOID_FUNCTION_STATEMENT -> return @return_not_void NOT_VOID_RETURN ;
NOT_VOID_RETURN -> identifier
NOT_VOID_RETURN -> number
NOT_VOID_FUNCTION_STATEMENT -> STATEMENT
STATEMENT_LANGUAGE -> STATEMENT STATEMENT_LANGUAGE
STATEMENT_LANGUAGE -> nil
STATEMENT -> DECLARATION_STATEMENT
STATEMENT -> IF_STATEMENT
STATEMENT -> DO_WHILE_STATEMENT
STATEMENT -> WHILE_STATEMENT
STATEMENT -> INCREMENT_DECREMENT_STATEMENT2 ;
STATEMENT -> FOR_STATEMENT
STATEMENT -> ASSIGNMENT_STATEMENT
STATEMENT -> SWITCH_STATEMENT
STATEMENT -> ;
STATEMENT -> CALL_FUNCTION ;
CALL_FUNCTION -> @call_function call @push identifier ( CALL_FUNCTION2
CALL_FUNCTION2 -> CALL_FUNCTION3
CALL_FUNCTION2 -> @push identifier CALL_FUNCTION3
CALL_FUNCTION3 -> , @push identifier CALL_FUNCTION3
CALL_FUNCTION3 -> ) @finish_function_call
#CALL_FUNCTION_OR_identifier -> CALL_FUNCTION
#CALL_FUNCTION_OR_identifier -> @push identifier
TYPE -> int
TYPE -> char
TYPE -> double
TYPE -> bool
DECLARATION_STATEMENT -> @push TYPE @push identifier DECLARATION_STATEMENT3
DECLARATION_STATEMENT3 -> VARIABLE_DECLARATION
DECLARATION_STATEMENT3 -> [ ARRAY_DECLARATION2
VARIABLE_DECLARATION -> VARIABLE_DECLARATION2 DECLARATION_STATEMENT2
VARIABLE_DECLARATION2 -> = @c_desc_with_assign number
VARIABLE_DECLARATION2 -> @c_desc nil
ARRAY_DECLARATION2 -> @c_desc_normal_array number ] DECLARATION_STATEMENT2
ARRAY_DECLARATION2 -> @push ] = { @push number ARRAY_DECLARATION3
ARRAY_DECLARATION3 -> , @push number ARRAY_DECLARATION3
ARRAY_DECLARATION3 -> @c_desc_weird_array } ;
DECLARATION_STATEMENT2 -> , @push identifier DECLARATION_STATEMENT3
DECLARATION_STATEMENT2 -> @pop ;
ASSIGNMENT_STATEMENT -> @push identifier OPTIONAL_ARRAY_INDEX @push ASSIGNMENT_OPERATOR MATH_EXPRESSION ASSIGNMENT_STATEMENT2 @complete_assignment
ASSIGNMENT_STATEMENT2 -> ;
ASSIGNMENT_STATEMENT2 -> COMPARISON_OPERATOR MATH_EXPRESSION ;
MATH_EXPRESSION -> CALL_FUNCTION
MATH_EXPRESSION -> MATH_TERM MATH_EXPRESSION2
MATH_EXPRESSION2 -> + MATH_TERM @add_expression MATH_EXPRESSION2
MATH_EXPRESSION2 -> - MATH_TERM @sub_expression MATH_EXPRESSION2
MATH_EXPRESSION2 -> nil
#MATH_TERM -> CALL_FUNCTION
MATH_TERM -> MATH_FACTOR MATH_TERM2
MATH_TERM2 -> * MATH_FACTOR @mult_expression MATH_TERM2
MATH_TERM2 -> / MATH_FACTOR @divide_expression MATH_TERM2
MATH_TERM2 -> nil
MATH_FACTOR -> @push identifier OPTIONAL_ARRAY_INDEX
MATH_FACTOR -> ( MATH_EXPRESSION )
MATH_FACTOR -> @push number
MATH_FACTOR -> - MATH_FACTOR
OPTIONAL_ARRAY_INDEX -> [ MATH_EXPRESSION @array ]
OPTIONAL_ARRAY_INDEX -> nil
ASSIGNMENT_OPERATOR -> =
ASSIGNMENT_OPERATOR -> +=
ASSIGNMENT_OPERATOR -> -=
ASSIGNMENT_OPERATOR -> *=
ASSIGNMENT_OPERATOR -> /=
COMPARISON_OPERATOR -> ==
COMPARISON_OPERATOR -> !=
COMPARISON_OPERATOR -> <=
COMPARISON_OPERATOR -> >=
COMPARISON_OPERATOR -> <
COMPARISON_OPERATOR -> >
BOOLEAN_EXPRESSION -> nil
IF_STATEMENT -> if @push_start_of_if ( BOOLEAN_EXPRESSION @start_of_if ) { STATEMENT_LANGUAGE @if_jump_out } ELSE_STATEMENT
ELSE_STATEMENT -> @end_of_all_if nil
ELSE_STATEMENT -> else ELSE_STATEMENT2
ELSE_STATEMENT2 -> if ( BOOLEAN_EXPRESSION @start_of_if ) { STATEMENT_LANGUAGE @if_jump_out } ELSE_STATEMENT
ELSE_STATEMENT2 -> { STATEMENT_LANGUAGE @end_of_all_if }
DO_WHILE_STATEMENT -> @start_of_loop do @push_pc { LOOP_STATEMENT_LANGUAGE } while ( @push_continue_destination BOOLEAN_EXPRESSION @do_while_end ) @end_of_loop
WHILE_STATEMENT -> @start_of_loop while @push_pc ( @push_continue_destination BOOLEAN_EXPRESSION @start_of_while ) { LOOP_STATEMENT_LANGUAGE @end_of_while } @end_of_loop
FOR_STATEMENT -> @start_of_loop for ( SIMPLE_ASSIGNMENT_STATEMENT ; @push_pc BOOLEAN_EXPRESSION @for_jump_out ; @push_continue_destination INCREMENT_DECREMENT_STATEMENT @for_go_to_expression ) { LOOP_STATEMENT_LANGUAGE @complete_for } @end_of_loop
SIMPLE_ASSIGNMENT_STATEMENT -> @push identifier = @for_simple_assign SIMPLE_ASSIGNMENT_STATEMENT2
SIMPLE_ASSIGNMENT_STATEMENT -> @push TYPE @push identifier = @for_simple_declaration SIMPLE_ASSIGNMENT_STATEMENT2
SIMPLE_ASSIGNMENT_STATEMENT2 -> number
SIMPLE_ASSIGNMENT_STATEMENT2 -> identifier
INCREMENT_DECREMENT_STATEMENT -> INCREMENT_DECREMENT_STATEMENT2
INCREMENT_DECREMENT_STATEMENT -> @push identifier @push PLUS_PLUS_OR_MINUS_MINUS @id_inc_dec
INCREMENT_DECREMENT_STATEMENT2 -> @push PLUS_PLUS_OR_MINUS_MINUS @push identifier @inc_dec_id
PLUS_PLUS_OR_MINUS_MINUS -> ++
PLUS_PLUS_OR_MINUS_MINUS -> --
LOOP_STATEMENT_LANGUAGE -> LOOP_STATEMENT LOOP_STATEMENT_LANGUAGE
LOOP_STATEMENT_LANGUAGE -> nil
LOOP_STATEMENT -> @push_break break ;
LOOP_STATEMENT -> @push_continue continue ;
LOOP_STATEMENT -> STATEMENT
SWITCH_STATEMENT -> switch ( @start_of_switch_case identifier ) { CASE_STATEMENT
CASE_STATEMENT -> @push_pc case @push number : CASE_STATEMENT2
CASE_STATEMENT2 -> CASE_STATEMENT_LANGUAGE CASE_STATEMENT3
CASE_STATEMENT3 -> CASE_STATEMENT
CASE_STATEMENT3 -> DEFAULT_STATEMENT @complete_switch }
DEFAULT_STATEMENT -> nil
DEFAULT_STATEMENT -> @push_default default : CASE_STATEMENT_LANGUAGE
CASE_STATEMENT_LANGUAGE -> CASE_STATEMENT_LANGUAGE2 CASE_STATEMENT_LANGUAGE
CASE_STATEMENT_LANGUAGE -> nil
CASE_STATEMENT_LANGUAGE2 -> @push_break break ;
CASE_STATEMENT_LANGUAGE2 -> STATEMENT
# this is a sample comment!