2 // Copyright (C) 2005-2009 Red Hat Inc.
3 // Copyright (C) 2006 Intel Corporation.
5 // This file is part of systemtap, and is free software. You can
6 // redistribute it and/or modify it under the terms of the GNU General
7 // Public License (GPL); either version 2, or (at your option) any
25 struct token
; // parse.h
26 struct systemtap_session
; // session.h
28 struct semantic_error
: public std::runtime_error
33 semantic_error
*chain
;
35 ~semantic_error () throw () {}
36 semantic_error (const std::string
& msg
):
37 runtime_error (msg
), tok1 (0), tok2 (0), chain (0) {}
38 semantic_error (const std::string
& msg
, const token
* t1
):
39 runtime_error (msg
), tok1 (t1
), tok2 (0), chain (0) {}
40 semantic_error (const std::string
& msg
, const token
* t1
,
41 const std::string
& m2
, const token
* t2
):
42 runtime_error (msg
), tok1 (t1
), msg2 (m2
), tok2 (t2
), chain (0) {}
45 // ------------------------------------------------------------------------
47 /* struct statistic_decl moved to session.h */
49 // ------------------------------------------------------------------------
55 pe_string
, // std::string
59 std::ostream
& operator << (std::ostream
& o
, const exp_type
& e
);
63 struct update_visitor
;
70 virtual ~expression ();
71 virtual void print (std::ostream
& o
) const = 0;
72 virtual void visit (visitor
* u
) = 0;
75 std::ostream
& operator << (std::ostream
& o
, const expression
& k
);
78 struct literal
: public expression
83 struct literal_string
: public literal
86 literal_string (const std::string
& v
);
87 void print (std::ostream
& o
) const;
88 void visit (visitor
* u
);
92 struct literal_number
: public literal
95 literal_number (int64_t v
);
96 void print (std::ostream
& o
) const;
97 void visit (visitor
* u
);
101 struct binary_expression
: public expression
106 void print (std::ostream
& o
) const;
107 void visit (visitor
* u
);
111 struct unary_expression
: public expression
115 void print (std::ostream
& o
) const;
116 void visit (visitor
* u
);
120 struct pre_crement
: public unary_expression
122 void visit (visitor
* u
);
126 struct post_crement
: public unary_expression
128 void print (std::ostream
& o
) const;
129 void visit (visitor
* u
);
133 struct logical_or_expr
: public binary_expression
135 void visit (visitor
* u
);
139 struct logical_and_expr
: public binary_expression
141 void visit (visitor
* u
);
146 struct array_in
: public expression
149 void print (std::ostream
& o
) const;
150 void visit (visitor
* u
);
154 struct comparison
: public binary_expression
156 void visit (visitor
* u
);
160 struct concatenation
: public binary_expression
162 void visit (visitor
* u
);
166 struct ternary_expression
: public expression
169 expression
* truevalue
;
170 expression
* falsevalue
;
171 void print (std::ostream
& o
) const;
172 void visit (visitor
* u
);
176 struct assignment
: public binary_expression
178 void visit (visitor
* u
);
185 // This is a helper class which, type-wise, acts as a disjoint union
186 // of symbols and histograms. You can ask it whether it's a
187 // histogram or a symbol, and downcast accordingly.
188 void print_indexable (std::ostream
& o
) const;
189 void visit_indexable (visitor
* u
);
190 virtual bool is_symbol(symbol
*& sym_out
);
191 virtual bool is_hist_op(hist_op
*& hist_out
);
192 virtual bool is_const_symbol(const symbol
*& sym_out
) const;
193 virtual bool is_const_hist_op(const hist_op
*& hist_out
) const;
194 virtual const token
*get_tok() const = 0;
195 virtual ~indexable() {}
198 // Perform a downcast to one out-value and NULL the other, throwing an
199 // exception if neither downcast succeeds. This is (sadly) about the
200 // best we can accomplish in C++.
202 classify_indexable(indexable
* ix
,
204 hist_op
*& hist_out
);
207 classify_const_indexable(const indexable
* ix
,
208 symbol
const *& array_out
,
209 hist_op
const *& hist_out
);
219 void print (std::ostream
& o
) const;
220 void visit (visitor
* u
);
221 // overrides of type 'indexable'
222 const token
*get_tok() const;
223 bool is_const_symbol(const symbol
*& sym_out
) const;
224 bool is_symbol(symbol
*& sym_out
);
228 struct target_symbol
: public symbol
233 comp_literal_array_index
,
234 comp_expression_array_index
,
241 std::string member
; // comp_struct_member
242 int64_t num_index
; // comp_literal_array_index
243 expression
* expr_index
; // comp_expression_array_index
245 component(const token
* t
, const std::string
& m
):
246 tok(t
), type(comp_struct_member
), member(m
) {}
247 component(const token
* t
, int64_t n
):
248 tok(t
), type(comp_literal_array_index
), num_index(n
) {}
249 component(const token
* t
, expression
* e
):
250 tok(t
), type(comp_expression_array_index
), expr_index(e
) {}
251 void print (std::ostream
& o
) const;
255 std::string base_name
;
256 std::vector
<component
> components
;
257 std::string probe_context_var
;
258 semantic_error
* saved_conversion_error
;
259 target_symbol(): addressof(false), saved_conversion_error (0) {}
260 void print (std::ostream
& o
) const;
261 void visit (visitor
* u
);
262 void visit_components (visitor
* u
);
263 void visit_components (update_visitor
* u
);
264 void assert_no_components(const std::string
& tapset
);
267 std::ostream
& operator << (std::ostream
& o
, const target_symbol::component
& c
);
270 struct cast_op
: public target_symbol
273 std::string type
, module
;
274 void print (std::ostream
& o
) const;
275 void visit (visitor
* u
);
279 struct arrayindex
: public expression
281 std::vector
<expression
*> indexes
;
284 void print (std::ostream
& o
) const;
285 void visit (visitor
* u
);
290 struct functioncall
: public expression
292 std::string function
;
293 std::vector
<expression
*> args
;
294 functiondecl
*referent
;
296 void print (std::ostream
& o
) const;
297 void visit (visitor
* u
);
301 struct print_format
: public expression
303 bool print_to_stream
;
304 bool print_with_format
;
305 bool print_with_delim
;
306 bool print_with_newline
;
311 fmt_flag_zeropad
= 1,
315 fmt_flag_special
= 16
322 conv_unsigned_decimal
,
325 conv_unsigned_uppercase_hex
,
326 conv_unsigned_lowercase_hex
,
349 struct format_component
354 width_type widthtype
;
355 precision_type prectype
;
356 conversion_type type
;
357 std::string literal_string
;
358 bool is_empty() const
361 && widthtype
== width_unspecified
362 && prectype
== prec_unspecified
363 && type
== conv_unspecified
364 && literal_string
.empty();
369 widthtype
= width_unspecified
;
370 prectype
= prec_unspecified
;
371 type
= conv_unspecified
;
372 literal_string
.clear();
376 std::string raw_components
;
377 std::vector
<format_component
> components
;
378 format_component delimiter
;
379 std::vector
<expression
*> args
;
382 static std::string
components_to_string(std::vector
<format_component
> const & components
);
383 static std::vector
<format_component
> string_to_components(std::string
const & str
);
384 static print_format
* create(const token
*t
);
386 void print (std::ostream
& o
) const;
387 void visit (visitor
* u
);
390 print_format(bool stream
, bool format
, bool delim
, bool newline
, bool _char
):
391 print_to_stream(stream
), print_with_format(format
),
392 print_with_delim(delim
), print_with_newline(newline
),
393 print_char(_char
), hist(NULL
)
398 enum stat_component_type
407 struct stat_op
: public expression
409 stat_component_type ctype
;
411 void print (std::ostream
& o
) const;
412 void visit (visitor
* u
);
421 struct hist_op
: public indexable
424 histogram_type htype
;
426 std::vector
<int64_t> params
;
427 void print (std::ostream
& o
) const;
428 void visit (visitor
* u
);
429 // overrides of type 'indexable'
430 const token
*get_tok() const;
431 bool is_const_hist_op(const hist_op
*& hist_out
) const;
432 bool is_hist_op(hist_op
*& hist_out
);
435 // ------------------------------------------------------------------------
438 struct symboldecl
// unique object per (possibly implicit)
439 // symbol declaration
445 virtual ~symboldecl ();
446 virtual void print (std::ostream
&o
) const = 0;
447 virtual void printsig (std::ostream
&o
) const = 0;
451 std::ostream
& operator << (std::ostream
& o
, const symboldecl
& k
);
454 struct vardecl
: public symboldecl
456 void print (std::ostream
& o
) const;
457 void printsig (std::ostream
& o
) const;
459 void set_arity (int arity
);
460 bool compatible_arity (int a
);
461 int arity
; // -1: unknown; 0: scalar; >0: array
462 int maxsize
; // upperbound on size for arrays
463 std::vector
<exp_type
> index_types
; // for arrays only
464 literal
*init
; // for global scalars only
468 struct vardecl_builtin
: public vardecl
474 struct functiondecl
: public symboldecl
476 std::vector
<vardecl
*> formal_args
;
477 std::vector
<vardecl
*> locals
;
478 std::vector
<vardecl
*> unused_locals
;
481 void print (std::ostream
& o
) const;
482 void printsig (std::ostream
& o
) const;
486 // ------------------------------------------------------------------------
491 virtual void print (std::ostream
& o
) const = 0;
492 virtual void visit (visitor
* u
) = 0;
495 virtual ~statement ();
498 std::ostream
& operator << (std::ostream
& o
, const statement
& k
);
501 struct embeddedcode
: public statement
504 void print (std::ostream
& o
) const;
505 void visit (visitor
* u
);
509 struct block
: public statement
511 std::vector
<statement
*> statements
;
512 void print (std::ostream
& o
) const;
513 void visit (visitor
* u
);
515 block (statement
* car
, statement
* cdr
);
519 struct expr_statement
;
520 struct for_loop
: public statement
522 expr_statement
* init
; // may be 0
524 expr_statement
* incr
; // may be 0
526 void print (std::ostream
& o
) const;
527 void visit (visitor
* u
);
531 struct foreach_loop
: public statement
533 // this part is a specialization of arrayindex
534 std::vector
<symbol
*> indexes
;
536 int sort_direction
; // -1: decreasing, 0: none, 1: increasing
537 unsigned sort_column
; // 0: value, 1..N: index
538 expression
* limit
; // optional iteration limit
541 void print (std::ostream
& o
) const;
542 void visit (visitor
* u
);
546 struct null_statement
: public statement
548 void print (std::ostream
& o
) const;
549 void visit (visitor
* u
);
553 struct expr_statement
: public statement
555 expression
* value
; // executed for side-effects
556 void print (std::ostream
& o
) const;
557 void visit (visitor
* u
);
561 struct if_statement
: public statement
563 expression
* condition
;
564 statement
* thenblock
;
565 statement
* elseblock
; // may be 0
566 void print (std::ostream
& o
) const;
567 void visit (visitor
* u
);
571 struct return_statement
: public expr_statement
573 void print (std::ostream
& o
) const;
574 void visit (visitor
* u
);
578 struct delete_statement
: public expr_statement
580 void print (std::ostream
& o
) const;
581 void visit (visitor
* u
);
585 struct break_statement
: public statement
587 void print (std::ostream
& o
) const;
588 void visit (visitor
* u
);
592 struct continue_statement
: public statement
594 void print (std::ostream
& o
) const;
595 void visit (visitor
* u
);
599 struct next_statement
: public statement
601 void print (std::ostream
& o
) const;
602 void visit (visitor
* u
);
607 struct derived_probe
;
613 std::vector
<probe
*> probes
;
614 std::vector
<probe_alias
*> aliases
;
615 std::vector
<functiondecl
*> functions
;
616 std::vector
<vardecl
*> globals
;
617 std::vector
<embeddedcode
*> embeds
;
618 std::string file_contents
;
620 stapfile (): file_contents (""),
621 privileged (false) {}
622 void print (std::ostream
& o
) const;
628 struct component
// XXX: sort of a restricted functioncall
631 literal
* arg
; // optional
633 component(std::string
const & f
, literal
* a
= NULL
);
635 std::vector
<component
*> components
;
636 const token
* tok
; // points to first component's functor
639 expression
* condition
;
640 void print (std::ostream
& o
) const;
642 probe_point(const probe_point
& pp
);
643 probe_point(std::vector
<component
*> const & comps
,const token
* t
);
647 std::ostream
& operator << (std::ostream
& o
, const probe_point
& k
);
652 std::vector
<probe_point
*> locations
;
655 std::vector
<vardecl
*> locals
;
656 std::vector
<vardecl
*> unused_locals
;
658 void print (std::ostream
& o
) const;
659 virtual void printsig (std::ostream
&o
) const;
660 virtual void collect_derivation_chain (std::vector
<probe
*> &probes_list
);
661 virtual const probe_alias
*get_alias () const { return 0; }
662 virtual probe
* basest () { return this; }
668 struct probe_alias
: public probe
670 probe_alias(std::vector
<probe_point
*> const & aliases
);
671 std::vector
<probe_point
*> alias_names
;
672 virtual void printsig (std::ostream
&o
) const;
677 // A derived visitor instance is used to visit the entire
678 // statement/expression tree.
681 // Machinery for differentiating lvalue visits from non-lvalue.
682 std::vector
<expression
*> active_lvalues
;
683 bool is_active_lvalue(expression
*e
);
684 void push_active_lvalue(expression
*e
);
685 void pop_active_lvalue();
687 virtual ~visitor () {}
688 virtual void visit_block (block
*s
) = 0;
689 virtual void visit_embeddedcode (embeddedcode
*s
) = 0;
690 virtual void visit_null_statement (null_statement
*s
) = 0;
691 virtual void visit_expr_statement (expr_statement
*s
) = 0;
692 virtual void visit_if_statement (if_statement
* s
) = 0;
693 virtual void visit_for_loop (for_loop
* s
) = 0;
694 virtual void visit_foreach_loop (foreach_loop
* s
) = 0;
695 virtual void visit_return_statement (return_statement
* s
) = 0;
696 virtual void visit_delete_statement (delete_statement
* s
) = 0;
697 virtual void visit_next_statement (next_statement
* s
) = 0;
698 virtual void visit_break_statement (break_statement
* s
) = 0;
699 virtual void visit_continue_statement (continue_statement
* s
) = 0;
700 virtual void visit_literal_string (literal_string
* e
) = 0;
701 virtual void visit_literal_number (literal_number
* e
) = 0;
702 virtual void visit_binary_expression (binary_expression
* e
) = 0;
703 virtual void visit_unary_expression (unary_expression
* e
) = 0;
704 virtual void visit_pre_crement (pre_crement
* e
) = 0;
705 virtual void visit_post_crement (post_crement
* e
) = 0;
706 virtual void visit_logical_or_expr (logical_or_expr
* e
) = 0;
707 virtual void visit_logical_and_expr (logical_and_expr
* e
) = 0;
708 virtual void visit_array_in (array_in
* e
) = 0;
709 virtual void visit_comparison (comparison
* e
) = 0;
710 virtual void visit_concatenation (concatenation
* e
) = 0;
711 virtual void visit_ternary_expression (ternary_expression
* e
) = 0;
712 virtual void visit_assignment (assignment
* e
) = 0;
713 virtual void visit_symbol (symbol
* e
) = 0;
714 virtual void visit_target_symbol (target_symbol
* e
) = 0;
715 virtual void visit_arrayindex (arrayindex
* e
) = 0;
716 virtual void visit_functioncall (functioncall
* e
) = 0;
717 virtual void visit_print_format (print_format
* e
) = 0;
718 virtual void visit_stat_op (stat_op
* e
) = 0;
719 virtual void visit_hist_op (hist_op
* e
) = 0;
720 virtual void visit_cast_op (cast_op
* e
) = 0;
724 // A simple kind of visitor, which travels down to the leaves of the
725 // statement/expression tree, up to but excluding following vardecls
726 // and functioncalls.
727 struct traversing_visitor
: public visitor
729 void visit_block (block
*s
);
730 void visit_embeddedcode (embeddedcode
*s
);
731 void visit_null_statement (null_statement
*s
);
732 void visit_expr_statement (expr_statement
*s
);
733 void visit_if_statement (if_statement
* s
);
734 void visit_for_loop (for_loop
* s
);
735 void visit_foreach_loop (foreach_loop
* s
);
736 void visit_return_statement (return_statement
* s
);
737 void visit_delete_statement (delete_statement
* s
);
738 void visit_next_statement (next_statement
* s
);
739 void visit_break_statement (break_statement
* s
);
740 void visit_continue_statement (continue_statement
* s
);
741 void visit_literal_string (literal_string
* e
);
742 void visit_literal_number (literal_number
* e
);
743 void visit_binary_expression (binary_expression
* e
);
744 void visit_unary_expression (unary_expression
* e
);
745 void visit_pre_crement (pre_crement
* e
);
746 void visit_post_crement (post_crement
* e
);
747 void visit_logical_or_expr (logical_or_expr
* e
);
748 void visit_logical_and_expr (logical_and_expr
* e
);
749 void visit_array_in (array_in
* e
);
750 void visit_comparison (comparison
* e
);
751 void visit_concatenation (concatenation
* e
);
752 void visit_ternary_expression (ternary_expression
* e
);
753 void visit_assignment (assignment
* e
);
754 void visit_symbol (symbol
* e
);
755 void visit_target_symbol (target_symbol
* e
);
756 void visit_arrayindex (arrayindex
* e
);
757 void visit_functioncall (functioncall
* e
);
758 void visit_print_format (print_format
* e
);
759 void visit_stat_op (stat_op
* e
);
760 void visit_hist_op (hist_op
* e
);
761 void visit_cast_op (cast_op
* e
);
765 // A kind of traversing visitor, which also follows function calls.
766 // It uses an internal set object to prevent infinite recursion.
767 struct functioncall_traversing_visitor
: public traversing_visitor
769 std::set
<functiondecl
*> traversed
;
770 functiondecl
* current_function
;
771 functioncall_traversing_visitor(): current_function(0) {}
772 void visit_functioncall (functioncall
* e
);
776 // A kind of traversing visitor, which also follows function calls,
777 // and stores the vardecl* referent of each variable read and/or
778 // written and other such sundry side-effect data. It's used by
779 // the elaboration-time optimizer pass.
780 struct varuse_collecting_visitor
: public functioncall_traversing_visitor
782 systemtap_session
& session
;
783 std::set
<vardecl
*> read
;
784 std::set
<vardecl
*> written
;
786 expression
* current_lvalue
;
787 expression
* current_lrvalue
;
788 varuse_collecting_visitor(systemtap_session
& s
):
790 embedded_seen (false),
792 current_lrvalue(0) {}
793 void visit_embeddedcode (embeddedcode
*s
);
794 void visit_delete_statement (delete_statement
*s
);
795 void visit_print_format (print_format
*e
);
796 void visit_assignment (assignment
*e
);
797 void visit_arrayindex (arrayindex
*e
);
798 void visit_target_symbol (target_symbol
*e
);
799 void visit_symbol (symbol
*e
);
800 void visit_pre_crement (pre_crement
*e
);
801 void visit_post_crement (post_crement
*e
);
802 void visit_foreach_loop (foreach_loop
*s
);
803 void visit_cast_op (cast_op
* e
);
805 bool side_effect_free ();
806 bool side_effect_free_wrt (const std::set
<vardecl
*>& vars
);
811 // A kind of visitor that throws an semantic_error exception
812 // whenever a non-overridden method is called.
813 struct throwing_visitor
: public visitor
816 throwing_visitor (const std::string
& m
);
819 virtual void throwone (const token
* t
);
821 void visit_block (block
*s
);
822 void visit_embeddedcode (embeddedcode
*s
);
823 void visit_null_statement (null_statement
*s
);
824 void visit_expr_statement (expr_statement
*s
);
825 void visit_if_statement (if_statement
* s
);
826 void visit_for_loop (for_loop
* s
);
827 void visit_foreach_loop (foreach_loop
* s
);
828 void visit_return_statement (return_statement
* s
);
829 void visit_delete_statement (delete_statement
* s
);
830 void visit_next_statement (next_statement
* s
);
831 void visit_break_statement (break_statement
* s
);
832 void visit_continue_statement (continue_statement
* s
);
833 void visit_literal_string (literal_string
* e
);
834 void visit_literal_number (literal_number
* e
);
835 void visit_binary_expression (binary_expression
* e
);
836 void visit_unary_expression (unary_expression
* e
);
837 void visit_pre_crement (pre_crement
* e
);
838 void visit_post_crement (post_crement
* e
);
839 void visit_logical_or_expr (logical_or_expr
* e
);
840 void visit_logical_and_expr (logical_and_expr
* e
);
841 void visit_array_in (array_in
* e
);
842 void visit_comparison (comparison
* e
);
843 void visit_concatenation (concatenation
* e
);
844 void visit_ternary_expression (ternary_expression
* e
);
845 void visit_assignment (assignment
* e
);
846 void visit_symbol (symbol
* e
);
847 void visit_target_symbol (target_symbol
* e
);
848 void visit_arrayindex (arrayindex
* e
);
849 void visit_functioncall (functioncall
* e
);
850 void visit_print_format (print_format
* e
);
851 void visit_stat_op (stat_op
* e
);
852 void visit_hist_op (hist_op
* e
);
853 void visit_cast_op (cast_op
* e
);
856 // A visitor similar to a traversing_visitor, but with the ability to rewrite
857 // parts of the tree through require/provide.
859 struct update_visitor
: public visitor
861 template <typename T
> T
* require (T
* src
, bool clearok
=false)
867 assert(!targets
.empty());
868 dst
= static_cast<T
*>(targets
.top());
870 assert(clearok
|| dst
);
875 template <typename T
> void provide (T
* src
)
877 targets
.push(static_cast<void*>(src
));
880 template <typename T
> void replace (T
*& src
, bool clearok
=false)
882 src
= require(src
, clearok
);
885 virtual ~update_visitor() { assert(targets
.empty()); }
887 virtual void visit_block (block
*s
);
888 virtual void visit_embeddedcode (embeddedcode
*s
);
889 virtual void visit_null_statement (null_statement
*s
);
890 virtual void visit_expr_statement (expr_statement
*s
);
891 virtual void visit_if_statement (if_statement
* s
);
892 virtual void visit_for_loop (for_loop
* s
);
893 virtual void visit_foreach_loop (foreach_loop
* s
);
894 virtual void visit_return_statement (return_statement
* s
);
895 virtual void visit_delete_statement (delete_statement
* s
);
896 virtual void visit_next_statement (next_statement
* s
);
897 virtual void visit_break_statement (break_statement
* s
);
898 virtual void visit_continue_statement (continue_statement
* s
);
899 virtual void visit_literal_string (literal_string
* e
);
900 virtual void visit_literal_number (literal_number
* e
);
901 virtual void visit_binary_expression (binary_expression
* e
);
902 virtual void visit_unary_expression (unary_expression
* e
);
903 virtual void visit_pre_crement (pre_crement
* e
);
904 virtual void visit_post_crement (post_crement
* e
);
905 virtual void visit_logical_or_expr (logical_or_expr
* e
);
906 virtual void visit_logical_and_expr (logical_and_expr
* e
);
907 virtual void visit_array_in (array_in
* e
);
908 virtual void visit_comparison (comparison
* e
);
909 virtual void visit_concatenation (concatenation
* e
);
910 virtual void visit_ternary_expression (ternary_expression
* e
);
911 virtual void visit_assignment (assignment
* e
);
912 virtual void visit_symbol (symbol
* e
);
913 virtual void visit_target_symbol (target_symbol
* e
);
914 virtual void visit_arrayindex (arrayindex
* e
);
915 virtual void visit_functioncall (functioncall
* e
);
916 virtual void visit_print_format (print_format
* e
);
917 virtual void visit_stat_op (stat_op
* e
);
918 virtual void visit_hist_op (hist_op
* e
);
919 virtual void visit_cast_op (cast_op
* e
);
922 std::stack
<void *> targets
;
925 template <> indexable
*
926 update_visitor::require
<indexable
> (indexable
* src
, bool clearok
);
928 // A visitor which performs a deep copy of the root node it's applied
929 // to. NB: It does not copy any of the variable or function
930 // declarations; those fields are set to NULL, assuming you want to
931 // re-infer the declarations in a new context (the one you're copying
934 struct deep_copy_visitor
: public update_visitor
936 template <typename T
> static T
* deep_copy (T
* e
)
939 return v
.require (e
);
942 virtual void visit_block (block
*s
);
943 virtual void visit_embeddedcode (embeddedcode
*s
);
944 virtual void visit_null_statement (null_statement
*s
);
945 virtual void visit_expr_statement (expr_statement
*s
);
946 virtual void visit_if_statement (if_statement
* s
);
947 virtual void visit_for_loop (for_loop
* s
);
948 virtual void visit_foreach_loop (foreach_loop
* s
);
949 virtual void visit_return_statement (return_statement
* s
);
950 virtual void visit_delete_statement (delete_statement
* s
);
951 virtual void visit_next_statement (next_statement
* s
);
952 virtual void visit_break_statement (break_statement
* s
);
953 virtual void visit_continue_statement (continue_statement
* s
);
954 virtual void visit_literal_string (literal_string
* e
);
955 virtual void visit_literal_number (literal_number
* e
);
956 virtual void visit_binary_expression (binary_expression
* e
);
957 virtual void visit_unary_expression (unary_expression
* e
);
958 virtual void visit_pre_crement (pre_crement
* e
);
959 virtual void visit_post_crement (post_crement
* e
);
960 virtual void visit_logical_or_expr (logical_or_expr
* e
);
961 virtual void visit_logical_and_expr (logical_and_expr
* e
);
962 virtual void visit_array_in (array_in
* e
);
963 virtual void visit_comparison (comparison
* e
);
964 virtual void visit_concatenation (concatenation
* e
);
965 virtual void visit_ternary_expression (ternary_expression
* e
);
966 virtual void visit_assignment (assignment
* e
);
967 virtual void visit_symbol (symbol
* e
);
968 virtual void visit_target_symbol (target_symbol
* e
);
969 virtual void visit_arrayindex (arrayindex
* e
);
970 virtual void visit_functioncall (functioncall
* e
);
971 virtual void visit_print_format (print_format
* e
);
972 virtual void visit_stat_op (stat_op
* e
);
973 virtual void visit_hist_op (hist_op
* e
);
974 virtual void visit_cast_op (cast_op
* e
);
979 /* vim: set sw=2 ts=8 cino=>4,n-2,{2,^-2,t0,(0,u0,w1,M1 : */