depager 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. data/ChangeLog +4 -0
  2. data/bin/depager +1 -0
  3. data/data/depager/misc/depager-mode.el +35 -24
  4. data/data/depager/pre-setup.rb +3 -0
  5. data/examples/Rakefile +36 -0
  6. data/examples/c89/c89.dr +496 -0
  7. data/examples/c89/c89.tab.rb +2197 -0
  8. data/examples/c89/test.c89 +10 -0
  9. data/{data/depager/sample → examples}/extension/paction.dr +0 -0
  10. data/{data/depager/sample → examples}/extension/pactiontest.dr +0 -0
  11. data/{data/depager/sample → examples}/pl0d/pl0ds.dr +0 -0
  12. data/examples/pl0d/pl0ds.tab.rb +1702 -0
  13. data/{data/depager/sample/pl0d/pl0test.pl0 → examples/pl0d/test.pl0ds} +0 -0
  14. data/{data/depager/sample → examples}/sample_calc/calc.action.dr +0 -0
  15. data/examples/sample_calc/calc.action.tab.rb +283 -0
  16. data/{data/depager/sample → examples}/sample_calc/calc.astdf.dr +0 -0
  17. data/examples/sample_calc/calc.astdf.tab.rb +476 -0
  18. data/{data/depager/sample → examples}/sample_calc/calc.astl.action.dr +0 -0
  19. data/examples/sample_calc/calc.astl.action.tab.rb +593 -0
  20. data/{data/depager/sample → examples}/sample_calc/calc.astl.dr +0 -0
  21. data/examples/sample_calc/calc.astl.tab.rb +501 -0
  22. data/{data/depager/sample → examples}/sample_calc/calc.atree.dr +0 -0
  23. data/examples/sample_calc/calc.atree.tab.rb +277 -0
  24. data/{data/depager/sample → examples}/sample_calc/calc.cst.dr +0 -0
  25. data/examples/sample_calc/calc.cst.tab.rb +478 -0
  26. data/{data/depager/sample → examples}/sample_calc/calc.dr +0 -0
  27. data/{data/depager/sample → examples}/sample_calc/calc.lex.dr +0 -0
  28. data/examples/sample_calc/calc.lex.tab.rb +192 -0
  29. data/{data/depager/sample → examples}/sample_calc/calc.nvaction.dr +0 -0
  30. data/examples/sample_calc/calc.nvaction.tab.rb +291 -0
  31. data/examples/sample_calc/calc.tab.rb +183 -0
  32. data/{data/depager/sample → examples}/sample_calc/calc_prec.nvaction.dr +0 -0
  33. data/examples/sample_calc/calc_prec.nvaction.tab.rb +257 -0
  34. data/examples/sample_calc/test.calc +1 -0
  35. data/{data/depager/sample/slex_test/slextest1.dr → examples/slex_test/divreg.slex.dr} +3 -11
  36. data/examples/slex_test/divreg.slex.tab.rb +227 -0
  37. data/{data/depager/sample/slex_test/slextest2.dr → examples/slex_test/ljoin.slex.dr} +10 -7
  38. data/examples/slex_test/ljoin.slex.tab.rb +277 -0
  39. data/examples/slex_test/test.divreg +1 -0
  40. data/examples/slex_test/test.ljoin +3 -0
  41. data/lib/depager.rb +194 -127
  42. data/lib/depager/Rakefile +8 -4
  43. data/lib/depager/ast_base.dr +3 -3
  44. data/lib/depager/ast_base.rb +197 -144
  45. data/lib/depager/atree.rb +55 -36
  46. data/lib/depager/cst.dr +6 -4
  47. data/lib/depager/cst.rb +69 -49
  48. data/lib/depager/grammar.rb +136 -0
  49. data/lib/depager/lex.dr +22 -8
  50. data/lib/depager/lex.rb +94 -53
  51. data/lib/depager/lr.rb +101 -167
  52. data/lib/depager/parse_action.rb +1 -1
  53. data/lib/depager/parser.rb +34 -7
  54. data/lib/depager/slex.dr +76 -36
  55. data/lib/depager/slex.rb +345 -151
  56. data/lib/depager/srp.rb +3 -2
  57. data/lib/depager/template/extension_lalr_slave.erb +1 -1
  58. data/lib/depager/template/single_lalr_parser.erb +1 -1
  59. data/lib/depager/utils.rb +2 -1
  60. data/lib/depager/version.rb +2 -2
  61. metadata +42 -28
  62. data/Manifest.txt +0 -52
  63. data/lib/depager/psrtmpl.rb +0 -33
data/ChangeLog CHANGED
@@ -1,3 +1,7 @@
1
+ 2007-08-21 maita <maita@fujiyama.slis.tsukuba.ac.jp>
2
+
3
+ * Bugfix.
4
+
1
5
  2007-05-27 maita <maita@fujiyama.slis.tsukuba.ac.jp>
2
6
 
3
7
  * Initial release.
data/bin/depager CHANGED
@@ -32,6 +32,7 @@ begin
32
32
  end
33
33
  end
34
34
  rescue SystemExit
35
+ raise
35
36
  rescue Exception
36
37
  warn "#{File.basename $0}: fatal error."
37
38
  warn "| #{$!}"
@@ -1,4 +1,4 @@
1
- ;; depager-mode.el
1
+ ; depager-mode.el
2
2
  ;; original is racc-mode.el
3
3
  ;; modified for Depager by M
4
4
  ;;
@@ -37,6 +37,9 @@
37
37
 
38
38
  (require 'derived)
39
39
 
40
+ (defconst depager-begin-rule-re "^[ \t]*#begin-rule[ \t]*$")
41
+ (defconst depager-end-rule-re "^[ \t]*#end-rule[ \t]*$")
42
+
40
43
  (define-derived-mode depager-mode ruby-mode "Depager"
41
44
  "Major mode for Depager editing."
42
45
  (interactive)
@@ -56,44 +59,51 @@
56
59
  (depager-indent-command))
57
60
 
58
61
  (defun depager-indent-line (&optional flag)
59
- (if (or (string-match "^#begin-rule[ \t]*$" (current-line))
60
- (string-match "^#end-rule[ \t]*$" (current-line)))
62
+ (if (or (string-match depager-begin-rule-re (current-line))
63
+ (string-match depager-end-rule-re (current-line)))
61
64
  (depager-indent-to 0)
62
65
  (if (point-in-rule)
63
- (depager-indent-to (depager-calculate-indent))
66
+ (progn ;(message "in-rule")
67
+ (depager-indent-to (depager-calculate-indent)))
64
68
  (if (point-before-rule)
65
- (depager-indent-to (depager-calculate-indent-before-rule))
66
- (ruby-indent-line t)))))
69
+ (progn ;(message "befor-rule")
70
+ (depager-indent-to (depager-calculate-indent-before-rule)))
71
+ (progn ;(message "other")
72
+ (ruby-indent-line t))))))
67
73
 
68
74
  (defun beginning-of-rule ()
69
75
  (beginning-of-buffer)
70
- (re-search-forward "^#begin-rule")
76
+ (re-search-forward depager-begin-rule-re)
71
77
  (beginning-of-line))
72
78
 
73
79
  (defun end-of-rule ()
74
80
  (beginning-of-buffer)
75
- (re-search-forward "^#end-rule")
81
+ (re-search-forward depager-end-rule-re)
76
82
  (end-of-line))
77
83
 
78
84
  (defun point-in-rule ()
79
85
  (save-excursion
80
- (let (forward-begin-rule (re-search-forward-without-moving-point "^#begin-rule"))
81
- (backward-end-rule (re-search-backward-without-moving-point "^#end-rule"))
82
- (forward-end-rule (re-search-forward-without-moving-point "^#end-rule"))
83
- (tmp (print "???")))
84
- (or (and forward-begin-rule
85
- backward-end-rule
86
- forward-end-rule
87
- (< forward-end-rule forward-begin-rule)
88
- (< forward-begin-rule backward-end-rule))
89
- (and backward-begin-rule
90
- forward-end-rule
91
- (< forward-begin-rule backward-end-rule)))))
86
+ (let ((backward-begin-rule
87
+ (re-search-backward-without-moving-point depager-begin-rule-re))
88
+ (backward-end-rule
89
+ (re-search-backward-without-moving-point depager-end-rule-re))
90
+ (forward-end-rule
91
+ (re-search-forward-without-moving-point depager-end-rule-re)))
92
+ (progn ;(message "%S %S" backward-begin-rule forward-end-rule)
93
+ (or (and backward-begin-rule
94
+ backward-end-rule
95
+ forward-end-rule
96
+ (< backward-end-rule backward-begin-rule)
97
+ (< backward-begin-rule forward-end-rule))
98
+ (and backward-begin-rule
99
+ (not backward-end-rule)
100
+ forward-end-rule
101
+ (< backward-begin-rule forward-end-rule)))))))
92
102
 
93
103
  (defun point-before-rule ()
94
104
  (save-excursion
95
105
  (and (not (point-in-rule))
96
- (re-search-forward-without-moving-point "^#begin-rule"))))
106
+ (re-search-forward-without-moving-point depager-begin-rule-re))))
97
107
 
98
108
  (defun point-in-p ()
99
109
  (save-excursion
@@ -115,7 +125,7 @@
115
125
  (defun match-token-line (str)
116
126
  (or (string-match "^[ \t]*|[ \t]*"
117
127
  str)
118
- (string-match "[ \t]*:[ \t]*\\(#.*\\)?\n$"
128
+ (string-match "^[ \t]*[a-zA-Z0-9\-_]+[ \t]*:[ \t]*\\(#.*\\)?\n$"
119
129
  str)
120
130
  (string-match "^[ \t]*=>[ \t]*"
121
131
  str)
@@ -128,7 +138,7 @@
128
138
  (forward-line -1)
129
139
  (while (string-match "^[ \t]*\n$" (current-line))
130
140
  (forward-line -1))
131
- (string-match "[ \t]*:[ \t]*\\(#.*\\)?$"
141
+ (string-match "^[ \t]*[a-zA-Z0-9\-_]+[ \t]*:[ \t]*\\(#.*\\)?$"
132
142
  (current-line))))
133
143
  (and (point-in-rule)
134
144
  (or (match-token-line (current-line))
@@ -174,7 +184,8 @@
174
184
 
175
185
  (defun depager-calculate-indent-before-rule ()
176
186
  (cond ((or (string-match "^%.*{[ \t]*$" (current-line))
177
- (string-match "^%}[ \t]*$" (current-line)))
187
+ (string-match "^%}[ \t]*$" (current-line))
188
+ (string-match "^%%[ \t]*$" (current-line)))
178
189
  0)
179
190
  ((point-in-p)
180
191
  (ruby-calculate-indent (max (save-excursion
@@ -0,0 +1,3 @@
1
+ require 'fileutils'
2
+ # FileUtils.cp_r("#{srcdir_root}/doc", '.')
3
+ FileUtils.cp_r("#{srcdir_root}/examples", '.')
data/examples/Rakefile ADDED
@@ -0,0 +1,36 @@
1
+ Dir.chdir(File.dirname(__FILE__))
2
+
3
+ require 'rake/clean'
4
+
5
+ DIRS = ['pl0d', 'sample_calc', 'slex_test', 'c89']
6
+ SRC = DIRS.map{|d| Dir["#{d}/*.dr"] }.flatten
7
+ OBJ = SRC.map{|i| i.sub(/\.dr$/, '.tab.rb')}
8
+ CLEAN.include(OBJ)
9
+
10
+ LIBDIR = "../lib"
11
+ BINDIR = "../bin"
12
+
13
+ SRC.each do |fn|
14
+ fn.match(/^([^\/]+)\/([^.]+)(\..+)?\.dr$/)
15
+ dir = $1
16
+ base = $2
17
+ dst = "#{dir}/#{$2}#{$3}.tab.rb"
18
+ exts = $3 && $3.split('.')[1 .. -1]
19
+ depends = exts ? exts.map{|i| "#{LIBDIR}/depager/#{i}.rb" } : []
20
+ depends = depends.unshift fn
21
+ test_ext = base.split('_')[0]
22
+
23
+ # puts %!#{dst} =>\n #{depends.join("\n ")}!
24
+ file dst => depends do
25
+ sh "ruby -I#{LIBDIR} #{BINDIR}/depager -g -o #{dst} #{fn}"
26
+ # raise unless $! == 0
27
+ Dir["#{dir}/*.#{test_ext}"].each do |t|
28
+ sh "ruby -I#{LIBDIR} #{dst} < #{t}"
29
+ end
30
+ end
31
+ end
32
+
33
+ task :default => OBJ
34
+ DIRS.each do |d|
35
+ task d => OBJ.select{|i| i =~ /^#{d}\// }
36
+ end
@@ -0,0 +1,496 @@
1
+ %class CParser
2
+ # from http://www.lysator.liu.se/c/ANSI-C-grammar-y.html and
3
+ # http://www.lysator.liu.se/c/ANSI-C-grammar-l.html
4
+ %extend Lexer ('depager/lex.rb')
5
+ #%decorate ShiftReducePrinter ('depager/srp.rb')
6
+ %inner{
7
+ def initialize
8
+ super
9
+ @keywords = {
10
+ "auto" => :AUTO,
11
+ "break" => :BREAK,
12
+ "case" => :CASE,
13
+ "char" => :CHAR,
14
+ "const" => :CONST,
15
+ "continue" => :CONTINUE,
16
+ "default" => :DEFAULT,
17
+ "do" => :DO,
18
+ "double" => :DOUBLE,
19
+ "else" => :ELSE,
20
+ "enum" => :ENUM,
21
+ "extern" => :EXTERN,
22
+ "float" => :FLOAT,
23
+ "for" => :FOR,
24
+ "goto" => :GOTO,
25
+ "if" => :IF,
26
+ "int" => :INT,
27
+ "long" => :LONG,
28
+ "register" => :REGISTER,
29
+ "return" => :RETURN,
30
+ "short" => :SHORT,
31
+ "signed" => :SIGNED,
32
+ "sizeof" => :SIZEOF,
33
+ "static" => :STATIC,
34
+ "struct" => :STRUCT,
35
+ "switch" => :SWITCH,
36
+ "typedef" => :TYPEDEF,
37
+ "union" => :UNION,
38
+ "unsigned" => :UNSIGNED,
39
+ "void" => :VOID,
40
+ "volatile" => :VOLATILE,
41
+ "while" => :WHILE,
42
+ }
43
+ end
44
+ %}
45
+ %%
46
+ %LEX{
47
+ /#.*\n/ { @line0 =~ /^#/ || raise }
48
+ '/*'
49
+ {
50
+ begin
51
+ break if @line =~ /\*\//
52
+ end while @line = getline
53
+ @line = $'
54
+ }
55
+ /\/\/[^\n]*/ { }
56
+
57
+ /[a-zA-Z_][a-zA-Z0-9_]*/ { yield _Token(@keywords[$&] || :IDENTIFIER) }
58
+ /0[xX][A-F]+/ { yield _Token(:CONSTANT) }
59
+ /0[0-9]+/ { yield _Token(:CONSTANT) }
60
+ /[0-9]+/ { yield _Token(:CONSTANT) }
61
+ /[0-9]+/ { yield _Token(:CONSTANT) }
62
+ /[0-9]*\.[0-9]+/ { yield _Token(:CONSTANT) }
63
+ /"(\\.|[^"\\])*"/ { yield _Token(:STRING_LITERAL) }
64
+
65
+ '...' { yield _Token(:ELLIPSIS) }
66
+ '>>=' { yield _Token(:RIGHT_ASSIGN) }
67
+ '<<=' { yield _Token(:LEFT_ASSIGN) }
68
+ '+=' { yield _Token(:ADD_ASSIGN) }
69
+ '-=' { yield _Token(:SUB_ASSIGN) }
70
+ '*=' { yield _Token(:MUL_ASSIGN) }
71
+ '/=' { yield _Token(:DIV_ASSIGN) }
72
+ '%=' { yield _Token(:MOD_ASSIGN) }
73
+ '&=' { yield _Token(:AND_ASSIGN) }
74
+ '^=' { yield _Token(:XOR_ASSIGN) }
75
+ '|=' { yield _Token(:OR_ASSIGN) }
76
+ '>>' { yield _Token(:RIGHT_OP) }
77
+ '<<' { yield _Token(:LEFT_OP) }
78
+ '++' { yield _Token(:INC_OP) }
79
+ '--' { yield _Token(:DEC_OP) }
80
+ '->' { yield _Token(:PTR_OP) }
81
+ '&&' { yield _Token(:AND_OP) }
82
+ '||' { yield _Token(:OR_OP) }
83
+ '<=' { yield _Token(:LE_OP) }
84
+ '>=' { yield _Token(:GE_OP) }
85
+ '==' { yield _Token(:EQ_OP) }
86
+ '!=' { yield _Token(:NE_OP) }
87
+
88
+ /[ \t\v\n\f]/ { }
89
+ /./ { yield _Token($&) }
90
+ %}
91
+
92
+ #begin-rule
93
+ translation_unit
94
+ : external_declaration
95
+ | translation_unit external_declaration
96
+ ;
97
+
98
+ external_declaration
99
+ : function_definition
100
+ | declaration
101
+ ;
102
+
103
+ function_definition
104
+ : declaration_specifiers declarator declaration_list compound_statement
105
+ | declaration_specifiers declarator compound_statement
106
+ | declarator declaration_list compound_statement
107
+ | declarator compound_statement
108
+ ;
109
+
110
+ primary_expression
111
+ : IDENTIFIER
112
+ | CONSTANT
113
+ | STRING_LITERAL
114
+ | '(' expression ')'
115
+ ;
116
+
117
+ postfix_expression
118
+ : primary_expression
119
+ | postfix_expression '[' expression ']'
120
+ | postfix_expression '(' ')'
121
+ | postfix_expression '(' argument_expression_list ')'
122
+ | postfix_expression '.' IDENTIFIER
123
+ | postfix_expression PTR_OP IDENTIFIER
124
+ | postfix_expression INC_OP
125
+ | postfix_expression DEC_OP
126
+ ;
127
+
128
+ argument_expression_list
129
+ : assignment_expression
130
+ | argument_expression_list ',' assignment_expression
131
+ ;
132
+
133
+ unary_expression
134
+ : postfix_expression
135
+ | INC_OP unary_expression
136
+ | DEC_OP unary_expression
137
+ | unary_operator cast_expression
138
+ | SIZEOF unary_expression
139
+ | SIZEOF '(' type_name ')'
140
+ ;
141
+
142
+ unary_operator
143
+ : '&'
144
+ | '*'
145
+ | '+'
146
+ | '-'
147
+ | '~'
148
+ | '!'
149
+ ;
150
+
151
+ cast_expression
152
+ : unary_expression
153
+ | '(' type_name ')' cast_expression
154
+ ;
155
+
156
+ multiplicative_expression
157
+ : cast_expression
158
+ | multiplicative_expression '*' cast_expression
159
+ | multiplicative_expression '/' cast_expression
160
+ | multiplicative_expression '%' cast_expression
161
+ ;
162
+
163
+ additive_expression
164
+ : multiplicative_expression
165
+ | additive_expression '+' multiplicative_expression
166
+ | additive_expression '-' multiplicative_expression
167
+ ;
168
+
169
+ shift_expression
170
+ : additive_expression
171
+ | shift_expression LEFT_OP additive_expression
172
+ | shift_expression RIGHT_OP additive_expression
173
+ ;
174
+
175
+ relational_expression
176
+ : shift_expression
177
+ | relational_expression '<' shift_expression
178
+ | relational_expression '>' shift_expression
179
+ | relational_expression LE_OP shift_expression
180
+ | relational_expression GE_OP shift_expression
181
+ ;
182
+
183
+ equality_expression
184
+ : relational_expression
185
+ | equality_expression EQ_OP relational_expression
186
+ | equality_expression NE_OP relational_expression
187
+ ;
188
+
189
+ and_expression
190
+ : equality_expression
191
+ | and_expression '&' equality_expression
192
+ ;
193
+
194
+ exclusive_or_expression
195
+ : and_expression
196
+ | exclusive_or_expression '^' and_expression
197
+ ;
198
+
199
+ inclusive_or_expression
200
+ : exclusive_or_expression
201
+ | inclusive_or_expression '|' exclusive_or_expression
202
+ ;
203
+
204
+ logical_and_expression
205
+ : inclusive_or_expression
206
+ | logical_and_expression AND_OP inclusive_or_expression
207
+ ;
208
+
209
+ logical_or_expression
210
+ : logical_and_expression
211
+ | logical_or_expression OR_OP logical_and_expression
212
+ ;
213
+
214
+ conditional_expression
215
+ : logical_or_expression
216
+ | logical_or_expression '?' expression ':' conditional_expression
217
+ ;
218
+
219
+ assignment_expression
220
+ : conditional_expression
221
+ | unary_expression assignment_operator assignment_expression
222
+ ;
223
+
224
+ assignment_operator
225
+ : '='
226
+ | MUL_ASSIGN
227
+ | DIV_ASSIGN
228
+ | MOD_ASSIGN
229
+ | ADD_ASSIGN
230
+ | SUB_ASSIGN
231
+ | LEFT_ASSIGN
232
+ | RIGHT_ASSIGN
233
+ | AND_ASSIGN
234
+ | XOR_ASSIGN
235
+ | OR_ASSIGN
236
+ ;
237
+
238
+ expression
239
+ : assignment_expression
240
+ | expression ',' assignment_expression
241
+ ;
242
+
243
+ constant_expression
244
+ : conditional_expression
245
+ ;
246
+
247
+ declaration
248
+ : declaration_specifiers ';'
249
+ | declaration_specifiers init_declarator_list ';'
250
+ ;
251
+
252
+ declaration_specifiers
253
+ : storage_class_specifier
254
+ | storage_class_specifier declaration_specifiers
255
+ | type_specifier
256
+ | type_specifier declaration_specifiers
257
+ | type_qualifier
258
+ | type_qualifier declaration_specifiers
259
+ ;
260
+
261
+ init_declarator_list
262
+ : init_declarator
263
+ | init_declarator_list ',' init_declarator
264
+ ;
265
+
266
+ init_declarator
267
+ : declarator
268
+ | declarator '=' initializer
269
+ ;
270
+
271
+ storage_class_specifier
272
+ : TYPEDEF
273
+ | EXTERN
274
+ | STATIC
275
+ | AUTO
276
+ | REGISTER
277
+ ;
278
+
279
+ type_specifier
280
+ : VOID
281
+ | CHAR
282
+ | SHORT
283
+ | INT
284
+ | LONG
285
+ | FLOAT
286
+ | DOUBLE
287
+ | SIGNED
288
+ | UNSIGNED
289
+ | struct_or_union_specifier
290
+ | enum_specifier
291
+ | TYPE_NAME
292
+ ;
293
+
294
+ struct_or_union_specifier
295
+ : struct_or_union IDENTIFIER '{' struct_declaration_list '}'
296
+ | struct_or_union '{' struct_declaration_list '}'
297
+ | struct_or_union IDENTIFIER
298
+ ;
299
+
300
+ struct_or_union
301
+ : STRUCT
302
+ | UNION
303
+ ;
304
+
305
+ struct_declaration_list
306
+ : struct_declaration
307
+ | struct_declaration_list struct_declaration
308
+ ;
309
+
310
+ struct_declaration
311
+ : specifier_qualifier_list struct_declarator_list ';'
312
+ ;
313
+
314
+ specifier_qualifier_list
315
+ : type_specifier specifier_qualifier_list
316
+ | type_specifier
317
+ | type_qualifier specifier_qualifier_list
318
+ | type_qualifier
319
+ ;
320
+
321
+ struct_declarator_list
322
+ : struct_declarator
323
+ | struct_declarator_list ',' struct_declarator
324
+ ;
325
+
326
+ struct_declarator
327
+ : declarator
328
+ | ':' constant_expression
329
+ | declarator ':' constant_expression
330
+ ;
331
+
332
+ enum_specifier
333
+ : ENUM '{' enumerator_list '}'
334
+ | ENUM IDENTIFIER '{' enumerator_list '}'
335
+ | ENUM IDENTIFIER
336
+ ;
337
+
338
+ enumerator_list
339
+ : enumerator
340
+ | enumerator_list ',' enumerator
341
+ ;
342
+
343
+ enumerator
344
+ : IDENTIFIER
345
+ | IDENTIFIER '=' constant_expression
346
+ ;
347
+
348
+ type_qualifier
349
+ : CONST
350
+ | VOLATILE
351
+ ;
352
+
353
+ declarator
354
+ : pointer direct_declarator
355
+ | direct_declarator
356
+ ;
357
+
358
+ direct_declarator
359
+ : IDENTIFIER
360
+ | '(' declarator ')'
361
+ | direct_declarator '[' constant_expression ']'
362
+ | direct_declarator '[' ']'
363
+ | direct_declarator '(' parameter_type_list ')'
364
+ | direct_declarator '(' identifier_list ')'
365
+ | direct_declarator '(' ')'
366
+ ;
367
+
368
+ pointer
369
+ : '*'
370
+ | '*' type_qualifier_list
371
+ | '*' pointer
372
+ | '*' type_qualifier_list pointer
373
+ ;
374
+
375
+ type_qualifier_list
376
+ : type_qualifier
377
+ | type_qualifier_list type_qualifier
378
+ ;
379
+
380
+
381
+ parameter_type_list
382
+ : parameter_list
383
+ | parameter_list ',' ELLIPSIS
384
+ ;
385
+
386
+ parameter_list
387
+ : parameter_declaration
388
+ | parameter_list ',' parameter_declaration
389
+ ;
390
+
391
+ parameter_declaration
392
+ : declaration_specifiers declarator
393
+ | declaration_specifiers abstract_declarator
394
+ | declaration_specifiers
395
+ ;
396
+
397
+ identifier_list
398
+ : IDENTIFIER
399
+ | identifier_list ',' IDENTIFIER
400
+ ;
401
+
402
+ type_name
403
+ : specifier_qualifier_list
404
+ | specifier_qualifier_list abstract_declarator
405
+ ;
406
+
407
+ abstract_declarator
408
+ : pointer
409
+ | direct_abstract_declarator
410
+ | pointer direct_abstract_declarator
411
+ ;
412
+
413
+ direct_abstract_declarator
414
+ : '(' abstract_declarator ')'
415
+ | '[' ']'
416
+ | '[' constant_expression ']'
417
+ | direct_abstract_declarator '[' ']'
418
+ | direct_abstract_declarator '[' constant_expression ']'
419
+ | '(' ')'
420
+ | '(' parameter_type_list ')'
421
+ | direct_abstract_declarator '(' ')'
422
+ | direct_abstract_declarator '(' parameter_type_list ')'
423
+ ;
424
+
425
+ initializer
426
+ : assignment_expression
427
+ | '{' initializer_list '}'
428
+ | '{' initializer_list ',' '}'
429
+ ;
430
+
431
+ initializer_list
432
+ : initializer
433
+ | initializer_list ',' initializer
434
+ ;
435
+
436
+ statement
437
+ : labeled_statement
438
+ | compound_statement
439
+ | expression_statement
440
+ | selection_statement
441
+ | iteration_statement
442
+ | jump_statement
443
+ ;
444
+
445
+ labeled_statement
446
+ : IDENTIFIER ':' statement
447
+ | CASE constant_expression ':' statement
448
+ | DEFAULT ':' statement
449
+ ;
450
+
451
+ compound_statement
452
+ : '{' '}'
453
+ | '{' statement_list '}'
454
+ | '{' declaration_list '}'
455
+ | '{' declaration_list statement_list '}'
456
+ ;
457
+
458
+ declaration_list
459
+ : declaration
460
+ | declaration_list declaration
461
+ ;
462
+
463
+ statement_list
464
+ : statement
465
+ | statement_list statement
466
+ ;
467
+
468
+ expression_statement
469
+ : ';'
470
+ | expression ';'
471
+ ;
472
+
473
+ selection_statement
474
+ : IF '(' expression ')' statement
475
+ | IF '(' expression ')' statement ELSE statement
476
+ | SWITCH '(' expression ')' statement
477
+ ;
478
+
479
+ iteration_statement
480
+ : WHILE '(' expression ')' statement
481
+ | DO statement WHILE '(' expression ')' ';'
482
+ | FOR '(' expression_statement expression_statement ')' statement
483
+ | FOR '(' expression_statement expression_statement expression ')' statement
484
+ ;
485
+
486
+ jump_statement
487
+ : GOTO IDENTIFIER ';'
488
+ | CONTINUE ';'
489
+ | BREAK ';'
490
+ | RETURN ';'
491
+ | RETURN expression ';'
492
+ ;
493
+ #end-rule
494
+ %%
495
+ p = CParser::createDecoratedParser
496
+ p.yyparse(STDIN)