cast19 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1306 @@
1
+ ###
2
+ ### ##################################################################
3
+ ###
4
+ ### All those Node classes.
5
+ ###
6
+ ### ##################################################################
7
+ ###
8
+
9
+ module C
10
+ ###
11
+ ### ==================================================================
12
+ ###
13
+ ### Class declarations
14
+ ###
15
+ ### ==================================================================
16
+ ###
17
+ class Statement < Node ; abstract; end
18
+ class Label < Node ; abstract; end
19
+ class Expression < Node ; abstract; end
20
+ class UnaryExpression < Expression ; abstract; end
21
+ class PostfixExpression < UnaryExpression; abstract; end
22
+ class PrefixExpression < UnaryExpression; abstract; end
23
+ class BinaryExpression < Expression ; abstract; end
24
+ class AssignmentExpression < Expression ; abstract; end
25
+ class Literal < Expression ; abstract; end
26
+ class Type < Node ; abstract; end
27
+ class IndirectType < Type ; abstract; end
28
+ class DirectType < Type ; abstract; end
29
+ class PrimitiveType < DirectType ; abstract; end
30
+
31
+ class TranslationUnit < Node ; end
32
+ class Declaration < Node ; end
33
+ class Declarator < Node ; end
34
+ class FunctionDef < Node ; end
35
+ class Parameter < Node ; end
36
+ class Enumerator < Node ; end
37
+ class MemberInit < Node ; end
38
+ class Member < Node ; end
39
+
40
+ class Block < Statement ; end
41
+ class If < Statement ; end
42
+ class Switch < Statement ; end
43
+ class While < Statement ; end
44
+ class For < Statement ; end
45
+ class Goto < Statement ; end
46
+ class Continue < Statement ; end
47
+ class Break < Statement ; end
48
+ class Return < Statement ; end
49
+ class ExpressionStatement < Statement ; end
50
+
51
+ class PlainLabel < Label ; end
52
+ class Default < Label ; end
53
+ class Case < Label ; end
54
+
55
+ class Comma < Expression ; end
56
+ class Conditional < Expression ; end
57
+ class Variable < Expression ; end
58
+
59
+ class Index < PostfixExpression ; end
60
+ class Call < PostfixExpression ; end
61
+ class Dot < PostfixExpression ; end
62
+ class Arrow < PostfixExpression ; end
63
+ class PostInc < PostfixExpression ; end
64
+ class PostDec < PostfixExpression ; end
65
+
66
+ class Cast < PrefixExpression ; end
67
+ class Address < PrefixExpression ; end
68
+ class Dereference < PrefixExpression ; end
69
+ class Sizeof < PrefixExpression ; end
70
+ class Positive < PrefixExpression ; end
71
+ class Negative < PrefixExpression ; end
72
+ class PreInc < PrefixExpression ; end
73
+ class PreDec < PrefixExpression ; end
74
+ class BitNot < PrefixExpression ; end
75
+ class Not < PrefixExpression ; end
76
+
77
+ class Add < BinaryExpression ; end
78
+ class Subtract < BinaryExpression ; end
79
+ class Multiply < BinaryExpression ; end
80
+ class Divide < BinaryExpression ; end
81
+ class Mod < BinaryExpression ; end
82
+ class Equal < BinaryExpression ; end
83
+ class NotEqual < BinaryExpression ; end
84
+ class Less < BinaryExpression ; end
85
+ class More < BinaryExpression ; end
86
+ class LessOrEqual < BinaryExpression ; end
87
+ class MoreOrEqual < BinaryExpression ; end
88
+ class BitAnd < BinaryExpression ; end
89
+ class BitOr < BinaryExpression ; end
90
+ class BitXor < BinaryExpression ; end
91
+ class ShiftLeft < BinaryExpression ; end
92
+ class ShiftRight < BinaryExpression ; end
93
+ class And < BinaryExpression ; end
94
+ class Or < BinaryExpression ; end
95
+
96
+ class Assign < AssignmentExpression; end
97
+ class MultiplyAssign < AssignmentExpression; end
98
+ class DivideAssign < AssignmentExpression; end
99
+ class ModAssign < AssignmentExpression; end
100
+ class AddAssign < AssignmentExpression; end
101
+ class SubtractAssign < AssignmentExpression; end
102
+ class ShiftLeftAssign < AssignmentExpression; end
103
+ class ShiftRightAssign < AssignmentExpression; end
104
+ class BitAndAssign < AssignmentExpression; end
105
+ class BitXorAssign < AssignmentExpression; end
106
+ class BitOrAssign < AssignmentExpression; end
107
+
108
+ class StringLiteral < Literal ; end
109
+ class CharLiteral < Literal ; end
110
+ class CompoundLiteral < Literal ; end
111
+ class IntLiteral < Literal ; end
112
+ class FloatLiteral < Literal ; end
113
+
114
+ class Pointer < IndirectType ; end
115
+ class Array < IndirectType ; end
116
+ class Function < IndirectType ; end
117
+
118
+ class Struct < DirectType ; end
119
+ class Union < DirectType ; end
120
+ class Enum < DirectType ; end
121
+ class CustomType < DirectType ; end
122
+
123
+ class Void < PrimitiveType ; end
124
+ class Int < PrimitiveType ; end
125
+ class Float < PrimitiveType ; end
126
+ class Char < PrimitiveType ; end
127
+ class Bool < PrimitiveType ; end
128
+ class Complex < PrimitiveType ; end
129
+ class Imaginary < PrimitiveType ; end
130
+
131
+ ###
132
+ ### ==================================================================
133
+ ###
134
+ ### Class implementations
135
+ ###
136
+ ### ==================================================================
137
+ ###
138
+
139
+ ###
140
+ ### Node
141
+ ###
142
+ class Node
143
+ initializer
144
+ end
145
+ ###
146
+ ### TranslationUnit
147
+ ###
148
+ class TranslationUnit
149
+ child :entities, lambda{NodeChain.new}
150
+ initializer :entities
151
+ end
152
+ ###
153
+ ### Declaration
154
+ ###
155
+ class Declaration
156
+ field :storage
157
+ child :type
158
+ child :declarators, lambda{NodeArray.new}
159
+ field :inline?
160
+ initializer :type, :declarators
161
+ def typedef?
162
+ storage.equal? :typedef
163
+ end
164
+ def extern?
165
+ storage.equal? :extern
166
+ end
167
+ def static?
168
+ storage.equal? :static
169
+ end
170
+ def auto?
171
+ storage.equal? :auto
172
+ end
173
+ def register?
174
+ storage.equal? :register
175
+ end
176
+ end
177
+ ###
178
+ ### Declarator
179
+ ###
180
+ class Declarator
181
+ child :indirect_type
182
+ field :name
183
+ child :init
184
+ child :num_bits
185
+ initializer :indirect_type, :name, :init, :num_bits
186
+ def declaration
187
+ parent and parent.parent
188
+ end
189
+ ###
190
+ ### Return (a copy of) the type of the variable this Declarator
191
+ ### declares.
192
+ ###
193
+ def type
194
+ if indirect_type
195
+ ret = indirect_type.clone
196
+ ret.direct_type = declaration.type.clone
197
+ return ret
198
+ else
199
+ declaration.type.clone
200
+ end
201
+ end
202
+ end
203
+ ###
204
+ ### FunctionDef
205
+ ###
206
+ class FunctionDef
207
+ field :storage
208
+ field :inline?
209
+ child :type
210
+ field :name
211
+ child :def, lambda{Block.new}
212
+ field :no_prototype?
213
+ initializer :type, :name, :def
214
+ def extern?
215
+ storage.equal? :extern
216
+ end
217
+ def static?
218
+ storage.equal? :static
219
+ end
220
+ def prototype= val
221
+ self.no_prototype = !val
222
+ end
223
+ def prototype?
224
+ !no_prototype?
225
+ end
226
+ end
227
+ ###
228
+ ### Parameter
229
+ ###
230
+ class Parameter
231
+ field :register?
232
+ child :type
233
+ field :name
234
+ initializer :type, :name
235
+ end
236
+ ###
237
+ ### Enumerator
238
+ ###
239
+ class Enumerator
240
+ field :name
241
+ child :val
242
+ initializer :name, :val
243
+ end
244
+ ###
245
+ ### MemberInit
246
+ ###
247
+ class MemberInit
248
+ ## member is a _NodeList_ of:
249
+ ## -- Member (for struct/union members)
250
+ ## -- Expression (for array members)
251
+ child :member
252
+ child :init
253
+ initializer :member, :init
254
+ end
255
+ ###
256
+ ### Member
257
+ ###
258
+ class Member
259
+ field :name
260
+ initializer :name
261
+ end
262
+
263
+ ###
264
+ ### ----------------------------------------------------------------
265
+ ### Statements
266
+ ### ----------------------------------------------------------------
267
+
268
+ ###
269
+ ### Block
270
+ ###
271
+ class Block
272
+ child :labels, lambda{NodeArray.new}
273
+ child :stmts, lambda{NodeChain.new}
274
+ initializer :stmts
275
+ end
276
+ ###
277
+ ### If
278
+ ###
279
+ class If
280
+ child :labels, lambda{NodeArray.new}
281
+ child :cond
282
+ child :then
283
+ child :else
284
+ initializer :cond, :then, :else
285
+ end
286
+ ###
287
+ ### Switch
288
+ ###
289
+ class Switch
290
+ child :labels, lambda{NodeArray.new}
291
+ child :cond
292
+ child :stmt
293
+ initializer :cond, :stmt
294
+ end
295
+ ###
296
+ ### While
297
+ ###
298
+ class While
299
+ child :labels, lambda{NodeArray.new}
300
+ field :do?
301
+ child :cond
302
+ child :stmt
303
+ initializer :cond, :stmt, :do?
304
+ end
305
+ ###
306
+ ### For
307
+ ###
308
+ class For
309
+ child :labels, lambda{NodeArray.new}
310
+ child :init
311
+ child :cond
312
+ child :iter
313
+ child :stmt
314
+ initializer :init, :cond, :iter, :stmt
315
+ end
316
+ ###
317
+ ### Goto
318
+ ###
319
+ class Goto
320
+ child :labels, lambda{NodeArray.new}
321
+ field :target
322
+ initializer :target
323
+ end
324
+ ###
325
+ ### Continue
326
+ ###
327
+ class Continue
328
+ child :labels, lambda{NodeArray.new}
329
+ end
330
+ ###
331
+ ### Break
332
+ ###
333
+ class Break
334
+ child :labels, lambda{NodeArray.new}
335
+ end
336
+ ###
337
+ ### Return
338
+ ###
339
+ class Return
340
+ child :labels, lambda{NodeArray.new}
341
+ child :expr
342
+ initializer :expr
343
+ end
344
+ ###
345
+ ### ExpressionStatement
346
+ ###
347
+ class ExpressionStatement
348
+ child :labels, lambda{NodeArray.new}
349
+ child :expr
350
+ initializer :expr
351
+ end
352
+
353
+ ###
354
+ ### ----------------------------------------------------------------
355
+ ### Labels
356
+ ### ----------------------------------------------------------------
357
+ ###
358
+
359
+ ###
360
+ ### PlainLabel
361
+ ###
362
+ class PlainLabel
363
+ field :name
364
+ initializer :name
365
+ end
366
+
367
+ ###
368
+ ### Default
369
+ ###
370
+ class Default
371
+ end
372
+
373
+ ###
374
+ ### Case
375
+ ###
376
+ class Case
377
+ child :expr
378
+ initializer :expr
379
+ end
380
+
381
+ ###
382
+ ### ----------------------------------------------------------------
383
+ ### Expressions
384
+ ### ----------------------------------------------------------------
385
+ ###
386
+
387
+ ###
388
+ ### Comma
389
+ ###
390
+ class Comma
391
+ child :exprs, lambda{NodeArray.new}
392
+ initializer :exprs
393
+ end
394
+ ###
395
+ ### Conditional
396
+ ###
397
+ class Conditional
398
+ child :cond
399
+ child :then
400
+ child :else
401
+ initializer :cond, :then, :else
402
+ end
403
+ ###
404
+ ### Variable
405
+ ###
406
+ class Variable
407
+ field :name
408
+ initializer :name
409
+ end
410
+
411
+ ###
412
+ ### ----------------------------------------------------------------
413
+ ### PrefixExpressions
414
+ ### ----------------------------------------------------------------
415
+ ###
416
+
417
+ ###
418
+ ### Cast
419
+ ###
420
+ class Cast
421
+ child :type
422
+ child :expr
423
+ initializer :type, :expr
424
+ end
425
+ ###
426
+ ### Address
427
+ ###
428
+ class Address
429
+ child :expr
430
+ initializer :expr
431
+ end
432
+ ###
433
+ ### Dereference
434
+ ###
435
+ class Dereference
436
+ child :expr
437
+ initializer :expr
438
+ end
439
+ ###
440
+ ### Sizeof
441
+ ###
442
+ class Sizeof
443
+ child :expr
444
+ initializer :expr
445
+ end
446
+ ###
447
+ ### Positive
448
+ ###
449
+ class Positive
450
+ child :expr
451
+ initializer :expr
452
+ end
453
+ ###
454
+ ### Negative
455
+ ###
456
+ class Negative
457
+ child :expr
458
+ initializer :expr
459
+ end
460
+ ###
461
+ ### PreInc
462
+ ###
463
+ class PreInc
464
+ child :expr
465
+ initializer :expr
466
+ end
467
+ ###
468
+ ### PreDec
469
+ ###
470
+ class PreDec
471
+ child :expr
472
+ initializer :expr
473
+ end
474
+ ###
475
+ ### BitNot
476
+ ###
477
+ class BitNot
478
+ child :expr
479
+ initializer :expr
480
+ end
481
+ ###
482
+ ### Not
483
+ ###
484
+ class Not
485
+ child :expr
486
+ initializer :expr
487
+ end
488
+
489
+ ###
490
+ ### ----------------------------------------------------------------
491
+ ### PostfixExpressions
492
+ ### ----------------------------------------------------------------
493
+ ###
494
+
495
+ ###
496
+ ### Index
497
+ ###
498
+ class Index
499
+ child :expr
500
+ child :index
501
+ initializer :expr, :index
502
+ end
503
+ ###
504
+ ### Call
505
+ ###
506
+ class Call
507
+ child :expr
508
+ child :args, lambda{NodeArray.new}
509
+ initializer :expr, :args
510
+ end
511
+ ###
512
+ ### Dot
513
+ ###
514
+ class Dot
515
+ child :expr
516
+ child :member
517
+ initializer :expr, :member
518
+ end
519
+ ###
520
+ ### Arrow
521
+ ###
522
+ class Arrow
523
+ child :expr
524
+ child :member
525
+ initializer :expr, :member
526
+ end
527
+ ###
528
+ ### PostInc
529
+ ###
530
+ class PostInc
531
+ child :expr
532
+ initializer :expr
533
+ end
534
+ ###
535
+ ### PostDec
536
+ ###
537
+ class PostDec
538
+ child :expr
539
+ initializer :expr
540
+ end
541
+
542
+ ###
543
+ ### ----------------------------------------------------------------
544
+ ### BinaryExpressions
545
+ ### ----------------------------------------------------------------
546
+ ###
547
+
548
+ ###
549
+ ### BinaryExpression (abstract)
550
+ ###
551
+ class BinaryExpression
552
+ class << self
553
+ ###
554
+ ### The operator (a String) pertaining to the class (e.g.,
555
+ ### Add.operator is '+').
556
+ ###
557
+ attr_accessor :operator
558
+ end
559
+ end
560
+ ###
561
+ ### Add
562
+ ###
563
+ class Add
564
+ child :expr1
565
+ child :expr2
566
+ initializer :expr1, :expr2
567
+ self.operator = '+'
568
+ end
569
+ ###
570
+ ### Subtract
571
+ ###
572
+ class Subtract
573
+ child :expr1
574
+ child :expr2
575
+ initializer :expr1, :expr2
576
+ self.operator = '-'
577
+ end
578
+ ###
579
+ ### Multiply
580
+ ###
581
+ class Multiply
582
+ child :expr1
583
+ child :expr2
584
+ initializer :expr1, :expr2
585
+ self.operator = '*'
586
+ end
587
+ ###
588
+ ### Divide
589
+ ###
590
+ class Divide
591
+ child :expr1
592
+ child :expr2
593
+ initializer :expr1, :expr2
594
+ self.operator = '/'
595
+ end
596
+ ###
597
+ ### Mod
598
+ ###
599
+ class Mod
600
+ child :expr1
601
+ child :expr2
602
+ initializer :expr1, :expr2
603
+ self.operator = '%'
604
+ end
605
+ ###
606
+ ### Equal
607
+ ###
608
+ class Equal
609
+ child :expr1
610
+ child :expr2
611
+ initializer :expr1, :expr2
612
+ self.operator = '=='
613
+ end
614
+ ###
615
+ ### NotEqual
616
+ ###
617
+ class NotEqual
618
+ child :expr1
619
+ child :expr2
620
+ initializer :expr1, :expr2
621
+ self.operator = '!='
622
+ end
623
+ ###
624
+ ### Less
625
+ ###
626
+ class Less
627
+ child :expr1
628
+ child :expr2
629
+ initializer :expr1, :expr2
630
+ self.operator = '<'
631
+ end
632
+ ###
633
+ ### More
634
+ ###
635
+ class More
636
+ child :expr1
637
+ child :expr2
638
+ initializer :expr1, :expr2
639
+ self.operator = '>'
640
+ end
641
+ ###
642
+ ### LessOrEqual
643
+ ###
644
+ class LessOrEqual
645
+ child :expr1
646
+ child :expr2
647
+ initializer :expr1, :expr2
648
+ self.operator = '<='
649
+ end
650
+ ###
651
+ ### MoreOrEqual
652
+ ###
653
+ class MoreOrEqual
654
+ child :expr1
655
+ child :expr2
656
+ initializer :expr1, :expr2
657
+ self.operator = '>='
658
+ end
659
+ ###
660
+ ### BitAnd
661
+ ###
662
+ class BitAnd
663
+ child :expr1
664
+ child :expr2
665
+ initializer :expr1, :expr2
666
+ self.operator = '&'
667
+ end
668
+ ###
669
+ ### BitOr
670
+ ###
671
+ class BitOr
672
+ child :expr1
673
+ child :expr2
674
+ initializer :expr1, :expr2
675
+ self.operator = '|'
676
+ end
677
+ ###
678
+ ### BitXor
679
+ ###
680
+ class BitXor
681
+ child :expr1
682
+ child :expr2
683
+ initializer :expr1, :expr2
684
+ self.operator = '^'
685
+ end
686
+ ###
687
+ ### ShiftLeft
688
+ ###
689
+ class ShiftLeft
690
+ child :expr1
691
+ child :expr2
692
+ initializer :expr1, :expr2
693
+ self.operator = '<<'
694
+ end
695
+ ###
696
+ ### ShiftRight
697
+ ###
698
+ class ShiftRight
699
+ child :expr1
700
+ child :expr2
701
+ initializer :expr1, :expr2
702
+ self.operator = '>>'
703
+ end
704
+ ###
705
+ ### And
706
+ ###
707
+ class And
708
+ child :expr1
709
+ child :expr2
710
+ initializer :expr1, :expr2
711
+ self.operator = '&&'
712
+ end
713
+ ###
714
+ ### Or
715
+ ###
716
+ class Or
717
+ child :expr1
718
+ child :expr2
719
+ initializer :expr1, :expr2
720
+ self.operator = '||'
721
+ end
722
+
723
+ ###
724
+ ### ----------------------------------------------------------------
725
+ ### AssignmentExpressions
726
+ ### ----------------------------------------------------------------
727
+ ###
728
+
729
+ ###
730
+ ### AssignmentExpression (abstract)
731
+ ###
732
+ class AssignmentExpression
733
+ class << self
734
+ ###
735
+ ### The operator (a String) pertaining to the class (e.g.,
736
+ ### Assign.operator is '=').
737
+ ###
738
+ attr_accessor :operator
739
+ end
740
+ end
741
+ ###
742
+ ### Assign
743
+ ###
744
+ class Assign
745
+ child :lval
746
+ child :rval
747
+ initializer :lval, :rval
748
+ self.operator = '='
749
+ end
750
+ ###
751
+ ### MultiplyAssign
752
+ ###
753
+ class MultiplyAssign
754
+ child :lval
755
+ child :rval
756
+ initializer :lval, :rval
757
+ self.operator = '*='
758
+ end
759
+ ###
760
+ ### DivideAssign
761
+ ###
762
+ class DivideAssign
763
+ child :lval
764
+ child :rval
765
+ initializer :lval, :rval
766
+ self.operator = '/='
767
+ end
768
+ ###
769
+ ### ModAssign
770
+ ###
771
+ class ModAssign
772
+ child :lval
773
+ child :rval
774
+ initializer :lval, :rval
775
+ self.operator = '%='
776
+ end
777
+ ###
778
+ ### AddAssign
779
+ ###
780
+ class AddAssign
781
+ child :lval
782
+ child :rval
783
+ initializer :lval, :rval
784
+ self.operator = '+='
785
+ end
786
+ ###
787
+ ### SubtractAssign
788
+ ###
789
+ class SubtractAssign
790
+ child :lval
791
+ child :rval
792
+ initializer :lval, :rval
793
+ self.operator = '-='
794
+ end
795
+ ###
796
+ ### ShiftLeftAssign
797
+ ###
798
+ class ShiftLeftAssign
799
+ child :lval
800
+ child :rval
801
+ initializer :lval, :rval
802
+ self.operator = '<<='
803
+ end
804
+ ###
805
+ ### ShiftRightAssign
806
+ ###
807
+ class ShiftRightAssign
808
+ child :lval
809
+ child :rval
810
+ initializer :lval, :rval
811
+ self.operator = '>>='
812
+ end
813
+ ###
814
+ ### BitAndAssign
815
+ ###
816
+ class BitAndAssign
817
+ child :lval
818
+ child :rval
819
+ initializer :lval, :rval
820
+ self.operator = '&='
821
+ end
822
+ ###
823
+ ### BitXorAssign
824
+ ###
825
+ class BitXorAssign
826
+ child :lval
827
+ child :rval
828
+ initializer :lval, :rval
829
+ self.operator = '^='
830
+ end
831
+ ###
832
+ ### BitOrAssign
833
+ ###
834
+ class BitOrAssign
835
+ child :lval
836
+ child :rval
837
+ initializer :lval, :rval
838
+ self.operator = '|='
839
+ end
840
+
841
+ ###
842
+ ### ----------------------------------------------------------------
843
+ ### Literals
844
+ ### ----------------------------------------------------------------
845
+ ###
846
+
847
+ ###
848
+ ### StringLiteral
849
+ ###
850
+ class StringLiteral
851
+ field :val
852
+ field :wide?
853
+ initializer :val
854
+ end
855
+ ###
856
+ ### CharLiteral
857
+ ###
858
+ class CharLiteral
859
+ field :val
860
+ field :wide?
861
+ initializer :val
862
+ end
863
+ ###
864
+ ### CompoundLiteral
865
+ ###
866
+ class CompoundLiteral
867
+ child :type
868
+ child :member_inits, lambda{NodeArray.new}
869
+ initializer :type, :member_inits
870
+ end
871
+ ###
872
+ ### IntLiteral
873
+ ###
874
+ class IntLiteral
875
+ field :val
876
+ field :format, :dec
877
+ field :suffix
878
+ initializer :val
879
+ def dec?
880
+ format.equal? :dec
881
+ end
882
+ def hex?
883
+ format.equal? :hex
884
+ end
885
+ def oct?
886
+ format.equal? :oct
887
+ end
888
+ end
889
+ ###
890
+ ### FloatLiteral
891
+ ###
892
+ class FloatLiteral
893
+ field :val
894
+ field :format, :dec
895
+ field :suffix
896
+ initializer :val
897
+ end
898
+
899
+ ###
900
+ ### ----------------------------------------------------------------
901
+ ### Types
902
+ ### ----------------------------------------------------------------
903
+ ###
904
+
905
+ ###
906
+ ### DirectType (abstract)
907
+ ###
908
+ class DirectType
909
+ def direct_type
910
+ self
911
+ end
912
+ def indirect_type
913
+ nil
914
+ end
915
+ end
916
+ ###
917
+ ### IndirectType (abstract)
918
+ ###
919
+ class IndirectType
920
+ def direct_type
921
+ if type.is_a? IndirectType
922
+ type.direct_type
923
+ else
924
+ type
925
+ end
926
+ end
927
+ def direct_type= val
928
+ if type.is_a? IndirectType
929
+ type.direct_type = val
930
+ else
931
+ self.type = val
932
+ end
933
+ end
934
+ def indirect_type
935
+ ret = self.clone
936
+ t = ret
937
+ while t.type.is_a? IndirectType
938
+ t = t.type
939
+ end
940
+ t.type = nil
941
+ return ret
942
+ end
943
+ end
944
+ ###
945
+ ### Pointer
946
+ ###
947
+ class Pointer
948
+ field :const?
949
+ field :restrict?
950
+ field :volatile?
951
+ child :type
952
+ initializer :type
953
+ end
954
+ ###
955
+ ### Array
956
+ ###
957
+ class Array
958
+ field :const?
959
+ field :restrict?
960
+ field :volatile?
961
+ child :type
962
+ child :length
963
+ initializer :type, :length
964
+ end
965
+ ###
966
+ ### Function
967
+ ###
968
+ class Function
969
+ field :const?
970
+ field :restrict?
971
+ field :volatile?
972
+ child :type
973
+ child :params
974
+ field :var_args?
975
+ initializer :type, :params
976
+ end
977
+ ###
978
+ ### Struct
979
+ ###
980
+ class Struct
981
+ field :const?
982
+ field :restrict?
983
+ field :volatile?
984
+ field :name
985
+ child :members
986
+ initializer :name, :members
987
+ end
988
+ ###
989
+ ### Union
990
+ ###
991
+ class Union
992
+ field :const?
993
+ field :restrict?
994
+ field :volatile?
995
+ field :name
996
+ child :members
997
+ initializer :name, :members
998
+ end
999
+ ###
1000
+ ### Enum
1001
+ ###
1002
+ class Enum
1003
+ field :const?
1004
+ field :restrict?
1005
+ field :volatile?
1006
+ field :name
1007
+ child :members
1008
+ initializer :name, :members
1009
+ end
1010
+ ###
1011
+ ### CustomType
1012
+ ###
1013
+ class CustomType
1014
+ field :const?
1015
+ field :restrict?
1016
+ field :volatile?
1017
+ field :name
1018
+ initializer :name
1019
+ end
1020
+ ###
1021
+ ### Void
1022
+ ###
1023
+ class Void
1024
+ field :const?
1025
+ field :restrict?
1026
+ field :volatile?
1027
+ end
1028
+ ###
1029
+ ### Int
1030
+ ###
1031
+ class Int
1032
+ field :const?
1033
+ field :restrict?
1034
+ field :volatile?
1035
+ field :longness, 0
1036
+ field :unsigned?, false
1037
+ initializer :longness
1038
+ def signed?
1039
+ !unsigned?
1040
+ end
1041
+ def signed= val
1042
+ self.unsigned = !val
1043
+ end
1044
+ def short?
1045
+ longness.equal? -1
1046
+ end
1047
+ def plain?
1048
+ longness.equal? 0
1049
+ end
1050
+ def long?
1051
+ longness.equal? 1
1052
+ end
1053
+ def long_long?
1054
+ longness.equal? 2
1055
+ end
1056
+ end
1057
+ ###
1058
+ ### Float
1059
+ ###
1060
+ class Float
1061
+ field :const?
1062
+ field :restrict?
1063
+ field :volatile?
1064
+ field :longness, 0
1065
+ initializer :longness
1066
+ def plain?
1067
+ longness.equal? 0
1068
+ end
1069
+ def double?
1070
+ longness.equal? 1
1071
+ end
1072
+ def long_double?
1073
+ longness.equal? 2
1074
+ end
1075
+ end
1076
+ ###
1077
+ ### Char
1078
+ ###
1079
+ class Char
1080
+ field :const?
1081
+ field :restrict?
1082
+ field :volatile?
1083
+ ## 6.2.5p15: `char', `signed char', and `unsigned char' are
1084
+ ## distinct types
1085
+ field :signed
1086
+ def signed?
1087
+ signed.equal? true
1088
+ end
1089
+ def unsigned?
1090
+ signed.equal? false
1091
+ end
1092
+ def plain?
1093
+ signed.nil?
1094
+ end
1095
+ end
1096
+ ###
1097
+ ### Bool
1098
+ ###
1099
+ class Bool
1100
+ field :const?
1101
+ field :restrict?
1102
+ field :volatile?
1103
+ end
1104
+ ###
1105
+ ### Complex
1106
+ ###
1107
+ class Complex
1108
+ field :const?
1109
+ field :restrict?
1110
+ field :volatile?
1111
+ field :longness, 0
1112
+ initializer :longness
1113
+ def plain?
1114
+ longness.equal? 0
1115
+ end
1116
+ def double?
1117
+ longness.equal? 1
1118
+ end
1119
+ def long_double?
1120
+ longness.equal? 2
1121
+ end
1122
+ end
1123
+ ###
1124
+ ### Imaginary
1125
+ ###
1126
+ class Imaginary
1127
+ field :const?
1128
+ field :restrict?
1129
+ field :volatile?
1130
+ field :longness, 0
1131
+ initializer :longness
1132
+ def plain?
1133
+ longness.equal? 0
1134
+ end
1135
+ def double?
1136
+ longness.equal? 1
1137
+ end
1138
+ def long_double?
1139
+ longness.equal? 2
1140
+ end
1141
+ end
1142
+
1143
+ ###
1144
+ ### ================================================================
1145
+ ###
1146
+ ### Tag classes
1147
+ ###
1148
+ ### ================================================================
1149
+ ###
1150
+
1151
+ ## classify the node classes by including modules
1152
+ tagger = lambda do |included, *includers|
1153
+ includers.each{|mod| mod.send(:include, included)}
1154
+ end
1155
+
1156
+ ## expression classes
1157
+ module ArithmeticExpression; end
1158
+ module BitwiseExpression ; end
1159
+ module LogicalExpression ; end
1160
+ module RelationalExpression; end
1161
+ module ShiftExpression ; end
1162
+ ##
1163
+ tagger.call(ArithmeticExpression,
1164
+ PostInc, PostDec, Positive, Negative, PreInc, PreDec, Add,
1165
+ Subtract, Multiply, Divide, Mod)
1166
+ tagger.call(BitwiseExpression,
1167
+ BitNot, BitAnd, BitOr, BitXor)
1168
+ tagger.call(LogicalExpression,
1169
+ Not, And, Or)
1170
+ tagger.call(RelationalExpression,
1171
+ Equal, NotEqual, Less, More, LessOrEqual, MoreOrEqual)
1172
+ tagger.call(ShiftExpression,
1173
+ ShiftLeft, ShiftRight)
1174
+
1175
+ ###
1176
+ ### ================================================================
1177
+ ###
1178
+ ### CORE_C_NODE_CLASSES
1179
+ ###
1180
+ ### ================================================================
1181
+ ###
1182
+
1183
+ CORE_C_NODE_CLASSES = [
1184
+ TranslationUnit,
1185
+ Declaration,
1186
+ Declarator,
1187
+ FunctionDef,
1188
+ Parameter,
1189
+ Enumerator,
1190
+ MemberInit,
1191
+ Member,
1192
+
1193
+ Block,
1194
+ If,
1195
+ Switch,
1196
+ While,
1197
+ For,
1198
+ Goto,
1199
+ Continue,
1200
+ Break,
1201
+ Return,
1202
+ ExpressionStatement,
1203
+
1204
+ PlainLabel,
1205
+ Default,
1206
+ Case,
1207
+
1208
+ Comma,
1209
+ Conditional,
1210
+ Variable,
1211
+
1212
+ Index,
1213
+ Call,
1214
+ Dot,
1215
+ Arrow,
1216
+ PostInc,
1217
+ PostDec,
1218
+
1219
+ Cast,
1220
+ Address,
1221
+ Dereference,
1222
+ Sizeof,
1223
+ Positive,
1224
+ Negative,
1225
+ PreInc,
1226
+ PreDec,
1227
+ BitNot,
1228
+ Not,
1229
+
1230
+ Add,
1231
+ Subtract,
1232
+ Multiply,
1233
+ Divide,
1234
+ Mod,
1235
+ Equal,
1236
+ NotEqual,
1237
+ Less,
1238
+ More,
1239
+ LessOrEqual,
1240
+ MoreOrEqual,
1241
+ BitAnd,
1242
+ BitOr,
1243
+ BitXor,
1244
+ ShiftLeft,
1245
+ ShiftRight,
1246
+ And,
1247
+ Or,
1248
+
1249
+ Assign,
1250
+ MultiplyAssign,
1251
+ DivideAssign,
1252
+ ModAssign,
1253
+ AddAssign,
1254
+ SubtractAssign,
1255
+ ShiftLeftAssign,
1256
+ ShiftRightAssign,
1257
+ BitAndAssign,
1258
+ BitXorAssign,
1259
+ BitOrAssign,
1260
+
1261
+ StringLiteral,
1262
+ CharLiteral,
1263
+ CompoundLiteral,
1264
+ IntLiteral,
1265
+ FloatLiteral,
1266
+
1267
+ Pointer,
1268
+ Array,
1269
+ Function,
1270
+
1271
+ Struct,
1272
+ Union,
1273
+ Enum,
1274
+ CustomType,
1275
+
1276
+ Void,
1277
+ Int,
1278
+ Float,
1279
+ Char,
1280
+ Bool,
1281
+ Complex,
1282
+ Imaginary
1283
+ ]
1284
+
1285
+ ## check we didn't miss any
1286
+ expected_classes = Node.subclasses_recursive.sort_by{|c| c.name}
1287
+ expected_classes -= NodeList.subclasses_recursive
1288
+ expected_classes -= [NodeList]
1289
+ expected_classes -= [
1290
+ Statement,
1291
+ Label,
1292
+ Expression,
1293
+ UnaryExpression,
1294
+ PostfixExpression,
1295
+ PrefixExpression,
1296
+ BinaryExpression,
1297
+ AssignmentExpression,
1298
+ Literal,
1299
+ Type,
1300
+ IndirectType,
1301
+ DirectType,
1302
+ PrimitiveType
1303
+ ]
1304
+ ##
1305
+ CORE_C_NODE_CLASSES.sort_by{|c| c.name} == expected_classes or raise
1306
+ end