1 #ifndef AST_GEN_VISITOR1_H_
2 #define AST_GEN_VISITOR1_H_
3 
4 #include "visitor.h"
5 #include <fstream>
6 #include <string>
7 #include <vector>
8 #include <map>
9 
10 class astgenvisitor1 : public visitor
11 {
12 public:
13 	astgenvisitor1(const char* filename, const char* visitorFilename);
14 	virtual ~astgenvisitor1();
15 
16 	virtual void visit_lhs_IDENT_SEPARATOR(const lhs_IDENT_SEPARATOR *plhs_IDENT_SEPARATOR) ;
17 	virtual void visit_grammar_grammar_production(const grammar_grammar_production *pgrammar_grammar_production) ;
18 	virtual void visit_grammar_grammar_COMMENT(const grammar_grammar_COMMENT *pgrammar_grammar_COMMENT) ;
19 	virtual void visit_expression_base_OPT(const expression_base_OPT *pexpression_base_OPT) ;
20 	virtual void visit_production_lhs_expressionListList_TERMINATOR(const production_lhs_expressionListList_TERMINATOR *pproduction_lhs_expressionListList_TERMINATOR) ;
21 	virtual void visit_expression_base_PLUS(const expression_base_PLUS *pexpression_base_PLUS) ;
22 	virtual void visit_expression_base(const expression_base *pexpression_base) ;
23 	virtual void visit_base_LITERAL(const base_LITERAL *pbase_LITERAL) ;
24 	virtual void visit_expression_base_STAR(const expression_base_STAR *pexpression_base_STAR) ;
25 	virtual void visit_base_LPAREN_expressionList_RPAREN(const base_LPAREN_expressionList_RPAREN *pbase_LPAREN_expressionList_RPAREN) ;
26 	virtual void visit_expression_COMMENT(const expression_COMMENT *pexpression_COMMENT) ;
27 	virtual void visit_alternation_expression_OR_expression(const alternation_expression_OR_expression *palternation_expression_OR_expression) ;
28 	virtual void visit_base_IDENT(const base_IDENT *pbase_IDENT) ;
29 	virtual void visit_base_LPAREN_alternation_RPAREN(const base_LPAREN_alternation_RPAREN *pbase_LPAREN_alternation_RPAREN) ;
30 	virtual void visit_alternation_alternation_OR_expression(const alternation_alternation_OR_expression *palternation_alternation_OR_expression) ;
31 
32 private:
33 	bool m_doDestructors;
34 	std::ofstream m_out;
35 	std::string m_filename;
36 	std::string m_visitorFilename;
37 	std::string m_rulename;
38 	std::string m_literal;
39 	std::string m_ident;
40 	std::map<std::string, std::string> m_listTypes;
41 
getListType(const std::string & rule)42 	std::string getListType(const std::string& rule)
43 	{
44 		return m_listTypes[rule];
45 	}
46 
addListType(const std::string & rule,const std::string & type)47 	void addListType(const std::string& rule, const std::string& type)
48 	{
49 		m_listTypes[rule] = type;
50 	}
51 
52 	void write_class(const std::vector<std::vector<expression*>*>::const_iterator i, const std::string& baseclass);
53 	std::string create_class_name(const std::vector<std::vector<expression*>*>::const_iterator i, std::vector<std::string>& idents);
54 	void write_argument(const std::vector<std::string>::const_iterator& i, int arg_num);
55 };
56 
57 
58 #endif
59 
60