cast19 0.1.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.
@@ -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