New visitor classes missing from previous commit.
authorMario de Sousa <msousa@fe.up.pt>
Tue, 16 Oct 2012 18:56:03 +0100
changeset 680 df783da3ebe2
parent 679 2f5618c0039a
child 681 e837adad2437
New visitor classes missing from previous commit.
absyntax/visitor.cc
absyntax/visitor.hh
--- a/absyntax/visitor.cc	Tue Oct 16 18:23:16 2012 +0100
+++ b/absyntax/visitor.cc	Tue Oct 16 18:56:03 2012 +0100
@@ -118,86 +118,31 @@
 
 
 
-/**********************/
-/* iterator_visitor_c */
-/**********************/
-
-iterator_visitor_c::~iterator_visitor_c(void) {return;}
-
-
-void *iterator_visitor_c::visit_list(list_c *list) {
-  for(int i = 0; i < list->n; i++) {
-    list->elements[i]->accept(*this);
-  }
-  return NULL;
-}
-
-
-#define SYM_LIST(class_name_c)	\
-  void *iterator_visitor_c::visit(class_name_c *symbol) {return visit_list(symbol);}
-
-#define SYM_TOKEN(class_name_c, ...)	\
-  void *iterator_visitor_c::visit(class_name_c *symbol) {return NULL;}
-
-#define SYM_REF0(class_name_c, ...)	\
-  void *iterator_visitor_c::visit(class_name_c *symbol) {return NULL;}
-
-#define SYM_REF1(class_name_c, ref1, ...)			\
-void *iterator_visitor_c::visit(class_name_c *symbol) {	\
-  if (symbol->ref1!=NULL) symbol->ref1->accept(*this);	\
-  return NULL;						\
-}
-
-#define SYM_REF2(class_name_c, ref1, ref2, ...)		\
-void *iterator_visitor_c::visit(class_name_c *symbol) {	\
-  if (symbol->ref1!=NULL) symbol->ref1->accept(*this);	\
-  if (symbol->ref2!=NULL) symbol->ref2->accept(*this);	\
-  return NULL;						\
-}
-
-#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)			\
-void *iterator_visitor_c::visit(class_name_c *symbol) {			\
-  if (symbol->ref1) symbol->ref1->accept(*this);			\
-  if (symbol->ref2) symbol->ref2->accept(*this);			\
-  if (symbol->ref3) symbol->ref3->accept(*this);			\
-  return NULL;								\
-}
-
-#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)		\
-void *iterator_visitor_c::visit(class_name_c *symbol) {			\
-  if (symbol->ref1) symbol->ref1->accept(*this);			\
-  if (symbol->ref2) symbol->ref2->accept(*this);			\
-  if (symbol->ref3) symbol->ref3->accept(*this);			\
-  if (symbol->ref4) symbol->ref4->accept(*this);			\
-  return NULL;								\
-}
-
-#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)	\
-void *iterator_visitor_c::visit(class_name_c *symbol) {			\
-  if (symbol->ref1) symbol->ref1->accept(*this);			\
-  if (symbol->ref2) symbol->ref2->accept(*this);			\
-  if (symbol->ref3) symbol->ref3->accept(*this);			\
-  if (symbol->ref4) symbol->ref4->accept(*this);			\
-  if (symbol->ref5) symbol->ref5->accept(*this);			\
-  return NULL;								\
-}
-
-#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)	\
-void *iterator_visitor_c::visit(class_name_c *symbol) {			\
-  if (symbol->ref1) symbol->ref1->accept(*this);			\
-  if (symbol->ref2) symbol->ref2->accept(*this);			\
-  if (symbol->ref3) symbol->ref3->accept(*this);			\
-  if (symbol->ref4) symbol->ref4->accept(*this);			\
-  if (symbol->ref5) symbol->ref5->accept(*this);			\
-  if (symbol->ref6) symbol->ref6->accept(*this);			\
-  return NULL;								\
-}
-
-
-
-#include "absyntax.def"
-
-
+
+/*******************/
+/* fcall_visitor_c */
+/*******************/
+
+//fcall_visitor_c::~fcall_visitor_c(void) {return;};
+
+
+// void fcall_visitor_c::fcall(symbol_c *symbol) {return;};
+
+#define VISIT_METHOD {fcall(symbol); return NULL;}
+
+#define SYM_LIST(class_name_c, ...)                                             void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_TOKEN(class_name_c, ...)                                            void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF0(class_name_c, ...)                                             void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF1(class_name_c, ref1, ...)                                       void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF2(class_name_c, ref1, ref2, ...)                                 void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)                           void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)                     void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)               void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)         void *fcall_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+
+#include "../absyntax/absyntax.def"
+
+#undef VISIT_METHOD
 
 #undef SYM_LIST
 #undef SYM_TOKEN
@@ -214,104 +159,78 @@
 
 
 
-
-
-
-
-/********************/
-/* search_visitor_c */
-/********************/
-
-search_visitor_c::~search_visitor_c(void) {return;}
-
-
-void *search_visitor_c::visit_list(list_c *list) {
+/**********************/
+/* iterator_visitor_c */
+/**********************/
+
+iterator_visitor_c::~iterator_visitor_c(void) {return;}
+
+
+void *iterator_visitor_c::visit_list(list_c *list) {
   for(int i = 0; i < list->n; i++) {
-    void *res = list->elements[i]->accept(*this);
-    if (res != NULL)
-      return res;
+    list->elements[i]->accept(*this);
   }
   return NULL;
 }
 
 
 #define SYM_LIST(class_name_c)	\
-  void *search_visitor_c::visit(class_name_c *symbol) {return visit_list(symbol);}
+  void *iterator_visitor_c::visit(class_name_c *symbol) {return visit_list(symbol);}
 
 #define SYM_TOKEN(class_name_c, ...)	\
-  void *search_visitor_c::visit(class_name_c *symbol) {return NULL;}
+  void *iterator_visitor_c::visit(class_name_c *symbol) {return NULL;}
 
 #define SYM_REF0(class_name_c, ...)	\
-  void *search_visitor_c::visit(class_name_c *symbol) {return NULL;}
-
-#define SYM_REF1(class_name_c, ref1, ...)				\
-void *search_visitor_c::visit(class_name_c *symbol) {		\
-  if (symbol->ref1) return symbol->ref1->accept(*this);		\
-  return NULL;							\
-}
-
-#define SYM_REF2(class_name_c, ref1, ref2, ...)			\
-void *search_visitor_c::visit(class_name_c *symbol) {		\
-  void *res = NULL;						\
-  if (symbol->ref1) res =  symbol->ref1->accept(*this);		\
-  if (res != NULL)  return res;					\
-  if (symbol->ref2) return symbol->ref2->accept(*this);		\
-  return NULL;							\
-}
-
-#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)		\
-void *search_visitor_c::visit(class_name_c *symbol) {		\
-  void *res = NULL;						\
-  if (symbol->ref1) res =  symbol->ref1->accept(*this);		\
-  if (res != NULL)  return res;					\
-  if (symbol->ref2) res =  symbol->ref2->accept(*this);		\
-  if (res != NULL)  return res;					\
-  if (symbol->ref3) return symbol->ref3->accept(*this);		\
-  return NULL;							\
+  void *iterator_visitor_c::visit(class_name_c *symbol) {return NULL;}
+
+#define SYM_REF1(class_name_c, ref1, ...)			\
+void *iterator_visitor_c::visit(class_name_c *symbol) {	\
+  if (symbol->ref1!=NULL) symbol->ref1->accept(*this);	\
+  return NULL;						\
+}
+
+#define SYM_REF2(class_name_c, ref1, ref2, ...)		\
+void *iterator_visitor_c::visit(class_name_c *symbol) {	\
+  if (symbol->ref1!=NULL) symbol->ref1->accept(*this);	\
+  if (symbol->ref2!=NULL) symbol->ref2->accept(*this);	\
+  return NULL;						\
+}
+
+#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)			\
+void *iterator_visitor_c::visit(class_name_c *symbol) {			\
+  if (symbol->ref1) symbol->ref1->accept(*this);			\
+  if (symbol->ref2) symbol->ref2->accept(*this);			\
+  if (symbol->ref3) symbol->ref3->accept(*this);			\
+  return NULL;								\
 }
 
 #define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)		\
-void *search_visitor_c::visit(class_name_c *symbol) {		\
-  void *res = NULL;						\
-  if (symbol->ref1) res =  symbol->ref1->accept(*this);		\
-  if (res != NULL)  return res;					\
-  if (symbol->ref2) res =  symbol->ref2->accept(*this);		\
-  if (res != NULL)  return res;					\
-  if (symbol->ref3) res =  symbol->ref3->accept(*this);		\
-  if (res != NULL)  return res;					\
-  if (symbol->ref4) return symbol->ref4->accept(*this);		\
-  return NULL;							\
-}
-
-#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)		\
-void *search_visitor_c::visit(class_name_c *symbol) {			\
-  void *res = NULL;							\
-  if (symbol->ref1) res =  symbol->ref1->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref2) res =  symbol->ref2->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref3) res =  symbol->ref3->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref4) res =  symbol->ref4->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref5) return symbol->ref5->accept(*this);			\
+void *iterator_visitor_c::visit(class_name_c *symbol) {			\
+  if (symbol->ref1) symbol->ref1->accept(*this);			\
+  if (symbol->ref2) symbol->ref2->accept(*this);			\
+  if (symbol->ref3) symbol->ref3->accept(*this);			\
+  if (symbol->ref4) symbol->ref4->accept(*this);			\
+  return NULL;								\
+}
+
+#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)	\
+void *iterator_visitor_c::visit(class_name_c *symbol) {			\
+  if (symbol->ref1) symbol->ref1->accept(*this);			\
+  if (symbol->ref2) symbol->ref2->accept(*this);			\
+  if (symbol->ref3) symbol->ref3->accept(*this);			\
+  if (symbol->ref4) symbol->ref4->accept(*this);			\
+  if (symbol->ref5) symbol->ref5->accept(*this);			\
   return NULL;								\
 }
 
 #define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)	\
-void *search_visitor_c::visit(class_name_c *symbol) {			\
-  void *res = NULL;							\
-  if (symbol->ref1) res =  symbol->ref1->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref2) res =  symbol->ref2->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref3) res =  symbol->ref3->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref4) res =  symbol->ref4->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref5) res =  symbol->ref5->accept(*this);			\
-  if (res != NULL)  return res;						\
-  if (symbol->ref6) return symbol->ref6->accept(*this);			\
+void *iterator_visitor_c::visit(class_name_c *symbol) {			\
+  if (symbol->ref1) symbol->ref1->accept(*this);			\
+  if (symbol->ref2) symbol->ref2->accept(*this);			\
+  if (symbol->ref3) symbol->ref3->accept(*this);			\
+  if (symbol->ref4) symbol->ref4->accept(*this);			\
+  if (symbol->ref5) symbol->ref5->accept(*this);			\
+  if (symbol->ref6) symbol->ref6->accept(*this);			\
   return NULL;								\
 }
 
@@ -335,10 +254,174 @@
 
 
 
-
-
-
-
-
-
-
+/****************************/
+/* fcall_iterator_visitor_c */
+/****************************/
+
+fcall_iterator_visitor_c::~fcall_iterator_visitor_c(void) {return;};
+
+void fcall_iterator_visitor_c::prefix_fcall(symbol_c *symbol) {return;};
+void fcall_iterator_visitor_c::suffix_fcall(symbol_c *symbol) {return;};
+
+#define VISIT_METHOD {\
+  prefix_fcall(symbol);                \
+  iterator_visitor_c::visit(symbol);   \
+  suffix_fcall(symbol);                \
+  return NULL;                         \
+}
+
+#define SYM_LIST(class_name_c, ...)                                             void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_TOKEN(class_name_c, ...)                                            void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF0(class_name_c, ...)                                             void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF1(class_name_c, ref1, ...)                                       void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF2(class_name_c, ref1, ref2, ...)                                 void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)                           void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)                     void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)               void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)         void *fcall_iterator_visitor_c::visit(class_name_c *symbol) VISIT_METHOD;
+
+#include "../absyntax/absyntax.def"
+
+#undef VISIT_METHOD
+
+#undef SYM_LIST
+#undef SYM_TOKEN
+#undef SYM_REF0
+#undef SYM_REF1
+#undef SYM_REF2
+#undef SYM_REF3
+#undef SYM_REF4
+#undef SYM_REF5
+#undef SYM_REF6
+
+
+
+
+
+
+
+
+/********************/
+/* search_visitor_c */
+/********************/
+
+search_visitor_c::~search_visitor_c(void) {return;}
+
+
+void *search_visitor_c::visit_list(list_c *list) {
+  for(int i = 0; i < list->n; i++) {
+    void *res = list->elements[i]->accept(*this);
+    if (res != NULL)
+      return res;
+  }
+  return NULL;
+}
+
+
+#define SYM_LIST(class_name_c)	\
+  void *search_visitor_c::visit(class_name_c *symbol) {return visit_list(symbol);}
+
+#define SYM_TOKEN(class_name_c, ...)	\
+  void *search_visitor_c::visit(class_name_c *symbol) {return NULL;}
+
+#define SYM_REF0(class_name_c, ...)	\
+  void *search_visitor_c::visit(class_name_c *symbol) {return NULL;}
+
+#define SYM_REF1(class_name_c, ref1, ...)				\
+void *search_visitor_c::visit(class_name_c *symbol) {		\
+  if (symbol->ref1) return symbol->ref1->accept(*this);		\
+  return NULL;							\
+}
+
+#define SYM_REF2(class_name_c, ref1, ref2, ...)			\
+void *search_visitor_c::visit(class_name_c *symbol) {		\
+  void *res = NULL;						\
+  if (symbol->ref1) res =  symbol->ref1->accept(*this);		\
+  if (res != NULL)  return res;					\
+  if (symbol->ref2) return symbol->ref2->accept(*this);		\
+  return NULL;							\
+}
+
+#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)		\
+void *search_visitor_c::visit(class_name_c *symbol) {		\
+  void *res = NULL;						\
+  if (symbol->ref1) res =  symbol->ref1->accept(*this);		\
+  if (res != NULL)  return res;					\
+  if (symbol->ref2) res =  symbol->ref2->accept(*this);		\
+  if (res != NULL)  return res;					\
+  if (symbol->ref3) return symbol->ref3->accept(*this);		\
+  return NULL;							\
+}
+
+#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)		\
+void *search_visitor_c::visit(class_name_c *symbol) {		\
+  void *res = NULL;						\
+  if (symbol->ref1) res =  symbol->ref1->accept(*this);		\
+  if (res != NULL)  return res;					\
+  if (symbol->ref2) res =  symbol->ref2->accept(*this);		\
+  if (res != NULL)  return res;					\
+  if (symbol->ref3) res =  symbol->ref3->accept(*this);		\
+  if (res != NULL)  return res;					\
+  if (symbol->ref4) return symbol->ref4->accept(*this);		\
+  return NULL;							\
+}
+
+#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)		\
+void *search_visitor_c::visit(class_name_c *symbol) {			\
+  void *res = NULL;							\
+  if (symbol->ref1) res =  symbol->ref1->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref2) res =  symbol->ref2->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref3) res =  symbol->ref3->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref4) res =  symbol->ref4->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref5) return symbol->ref5->accept(*this);			\
+  return NULL;								\
+}
+
+#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)	\
+void *search_visitor_c::visit(class_name_c *symbol) {			\
+  void *res = NULL;							\
+  if (symbol->ref1) res =  symbol->ref1->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref2) res =  symbol->ref2->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref3) res =  symbol->ref3->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref4) res =  symbol->ref4->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref5) res =  symbol->ref5->accept(*this);			\
+  if (res != NULL)  return res;						\
+  if (symbol->ref6) return symbol->ref6->accept(*this);			\
+  return NULL;								\
+}
+
+
+
+#include "absyntax.def"
+
+
+
+#undef SYM_LIST
+#undef SYM_TOKEN
+#undef SYM_REF0
+#undef SYM_REF1
+#undef SYM_REF2
+#undef SYM_REF3
+#undef SYM_REF4
+#undef SYM_REF5
+#undef SYM_REF6
+
+
+
+
+
+
+
+
+
+
+
+
--- a/absyntax/visitor.hh	Tue Oct 16 18:23:16 2012 +0100
+++ b/absyntax/visitor.hh	Tue Oct 16 18:56:03 2012 +0100
@@ -78,32 +78,15 @@
 
 
 
-#define SYM_LIST(class_name_c, ...)	\
-  virtual void *visit(class_name_c *symbol) = 0;
-
-#define SYM_TOKEN(class_name_c, ...)	\
-  virtual void *visit(class_name_c *symbol) = 0;
-
-#define SYM_REF0(class_name_c, ...)	\
-  virtual void *visit(class_name_c *symbol) = 0;
-
-#define SYM_REF1(class_name_c, ref1, ...)		\
-  virtual void *visit(class_name_c *symbol) = 0;
-
-#define SYM_REF2(class_name_c, ref1, ref2, ...)	\
-  virtual void *visit(class_name_c *symbol) = 0;
-
-#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)	\
-  virtual void *visit(class_name_c *symbol) = 0;
-
-#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)	\
-  virtual void *visit(class_name_c *symbol) = 0;
-
-#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)		\
-  virtual void *visit(class_name_c *symbol) = 0;
-
-#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)	\
-  virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_LIST(class_name_c, ...)                                             virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_TOKEN(class_name_c, ...)                                            virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_REF0(class_name_c, ...)                                             virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_REF1(class_name_c, ref1, ...)                                       virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_REF2(class_name_c, ref1, ref2, ...)                                 virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)                           virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)                     virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)               virtual void *visit(class_name_c *symbol) = 0;
+#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)         virtual void *visit(class_name_c *symbol) = 0;
 
 class visitor_c {
   public:
@@ -127,32 +110,15 @@
 
 
 
-#define SYM_LIST(class_name_c, ...)	\
-  virtual void *visit(class_name_c *symbol);
-
-#define SYM_TOKEN(class_name_c, ...)	\
-  virtual void *visit(class_name_c *symbol);
-
-#define SYM_REF0(class_name_c, ...)	\
-  virtual void *visit(class_name_c *symbol);
-
-#define SYM_REF1(class_name_c, ref1, ...)		\
-  virtual void *visit(class_name_c *symbol);
-
-#define SYM_REF2(class_name_c, ref1, ref2, ...)	\
-  virtual void *visit(class_name_c *symbol);
-
-#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)	\
-  virtual void *visit(class_name_c *symbol);
-
-#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)	\
-  virtual void *visit(class_name_c *symbol);
-
-#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)		\
-  virtual void *visit(class_name_c *symbol);
-
-#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)	\
-  virtual void *visit(class_name_c *symbol);
+#define SYM_LIST(class_name_c, ...)                                             virtual void *visit(class_name_c *symbol);
+#define SYM_TOKEN(class_name_c, ...)                                            virtual void *visit(class_name_c *symbol);
+#define SYM_REF0(class_name_c, ...)                                             virtual void *visit(class_name_c *symbol);
+#define SYM_REF1(class_name_c, ref1, ...)                                       virtual void *visit(class_name_c *symbol);
+#define SYM_REF2(class_name_c, ref1, ref2, ...)                                 virtual void *visit(class_name_c *symbol);
+#define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)                           virtual void *visit(class_name_c *symbol);
+#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)                     virtual void *visit(class_name_c *symbol);
+#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)               virtual void *visit(class_name_c *symbol);
+#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)         virtual void *visit(class_name_c *symbol);
 
 
 
@@ -167,6 +133,21 @@
 
 
 
+
+
+class fcall_visitor_c: public visitor_c {
+  public:
+  virtual void fcall(symbol_c *symbol) = 0;
+
+  public:
+  #include "absyntax.def"
+
+//   virtual ~fcall_visitor_c(void);
+};
+
+
+
+
 class iterator_visitor_c: public visitor_c {
   protected:
   void *visit_list(list_c *list);
@@ -178,6 +159,24 @@
 };
 
 
+
+
+
+class fcall_iterator_visitor_c: public iterator_visitor_c {
+  public:
+  virtual void prefix_fcall(symbol_c *symbol);
+  virtual void suffix_fcall(symbol_c *symbol);
+
+  public:
+  #include "absyntax.def"
+
+  virtual ~fcall_iterator_visitor_c(void);
+};
+
+
+
+
+
 class search_visitor_c: public visitor_c {
   protected:
   void *visit_list(list_c *list);
@@ -199,4 +198,11 @@
 #undef SYM_REF5
 #undef SYM_REF6
 
+
+
+
+
+
+
+
 #endif /*  _VISITOR_HH */