xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3treeparser.inl (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE()
2*16467b97STreehugger Robot
3*16467b97STreehugger Robottemplate< class ImplTraits >
4*16467b97STreehugger RobotTreeParser<ImplTraits>::TreeParser( ANTLR_UINT32 sizeHint, TreeNodeStreamType* ctnstream,
5*16467b97STreehugger Robot											RecognizerSharedStateType* state)
6*16467b97STreehugger Robot											:RecognizerType( sizeHint, state )
7*16467b97STreehugger Robot{
8*16467b97STreehugger Robot	/* Install the tree node stream
9*16467b97STreehugger Robot	*/
10*16467b97STreehugger Robot	this->setTreeNodeStream(ctnstream);
11*16467b97STreehugger Robot
12*16467b97STreehugger Robot}
13*16467b97STreehugger Robot
14*16467b97STreehugger Robottemplate< class ImplTraits >
15*16467b97STreehugger RobotTreeParser<ImplTraits>::~TreeParser()
16*16467b97STreehugger Robot{
17*16467b97STreehugger Robot	this->get_rec()->get_state()->get_following().clear();
18*16467b97STreehugger Robot}
19*16467b97STreehugger Robot
20*16467b97STreehugger Robottemplate< class ImplTraits >
21*16467b97STreehugger Robottypename TreeParser<ImplTraits>::TreeNodeStreamType* TreeParser<ImplTraits>::get_ctnstream() const
22*16467b97STreehugger Robot{
23*16467b97STreehugger Robot	return m_ctnstream;
24*16467b97STreehugger Robot}
25*16467b97STreehugger Robot
26*16467b97STreehugger Robottemplate< class ImplTraits >
27*16467b97STreehugger Robottypename TreeParser<ImplTraits>::IntStreamType* TreeParser<ImplTraits>::get_istream() const
28*16467b97STreehugger Robot{
29*16467b97STreehugger Robot	return m_ctnstream;
30*16467b97STreehugger Robot}
31*16467b97STreehugger Robot
32*16467b97STreehugger Robottemplate< class ImplTraits >
33*16467b97STreehugger Robottypename TreeParser<ImplTraits>::IntStreamType* TreeParser<ImplTraits>::get_parser_istream() const
34*16467b97STreehugger Robot{
35*16467b97STreehugger Robot	return m_ctnstream;
36*16467b97STreehugger Robot}
37*16467b97STreehugger Robot
38*16467b97STreehugger Robottemplate< class ImplTraits >
39*16467b97STreehugger Robottypename TreeParser<ImplTraits>::RecognizerType* TreeParser<ImplTraits>::get_rec()
40*16467b97STreehugger Robot{
41*16467b97STreehugger Robot	return this;
42*16467b97STreehugger Robot}
43*16467b97STreehugger Robot
44*16467b97STreehugger Robottemplate< class ImplTraits >
45*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::fillExceptionData( ExceptionBaseType* ex )
46*16467b97STreehugger Robot{
47*16467b97STreehugger Robot	ex->set_token( m_ctnstream->_LT(1) );	    /* Current input tree node */
48*16467b97STreehugger Robot	ex->set_line( ex->get_token()->getLine() );
49*16467b97STreehugger Robot	ex->set_charPositionInLine( ex->get_token()->getCharPositionInLine() );
50*16467b97STreehugger Robot	ex->set_index( m_ctnstream->index() );
51*16467b97STreehugger Robot
52*16467b97STreehugger Robot	// Are you ready for this? Deep breath now...
53*16467b97STreehugger Robot	//
54*16467b97STreehugger Robot	{
55*16467b97STreehugger Robot		TreeType* tnode;
56*16467b97STreehugger Robot
57*16467b97STreehugger Robot		tnode		= ex->get_token();
58*16467b97STreehugger Robot
59*16467b97STreehugger Robot		if	(tnode->get_token()    == NULL)
60*16467b97STreehugger Robot		{
61*16467b97STreehugger Robot			ex->set_streamName("-unknown source-" );
62*16467b97STreehugger Robot		}
63*16467b97STreehugger Robot		else
64*16467b97STreehugger Robot		{
65*16467b97STreehugger Robot			if	( tnode->get_token()->get_input() == NULL)
66*16467b97STreehugger Robot			{
67*16467b97STreehugger Robot				ex->set_streamName("");
68*16467b97STreehugger Robot			}
69*16467b97STreehugger Robot			else
70*16467b97STreehugger Robot			{
71*16467b97STreehugger Robot				ex->set_streamName(	tnode->get_token()->get_input()->get_fileName() );
72*16467b97STreehugger Robot			}
73*16467b97STreehugger Robot		}
74*16467b97STreehugger Robot		ex->set_message("Unexpected node");
75*16467b97STreehugger Robot	}
76*16467b97STreehugger Robot}
77*16467b97STreehugger Robot
78*16467b97STreehugger Robottemplate< class ImplTraits >
79*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex )
80*16467b97STreehugger Robot{
81*16467b97STreehugger Robot	typename ImplTraits::StringStreamType errtext;
82*16467b97STreehugger Robot	// See if there is a 'filename' we can use
83*16467b97STreehugger Robot	//
84*16467b97STreehugger Robot	if( ex->get_streamName().empty() )
85*16467b97STreehugger Robot	{
86*16467b97STreehugger Robot		if(ex->get_token()->get_type() == ImplTraits::CommonTokenType::TOKEN_EOF)
87*16467b97STreehugger Robot		{
88*16467b97STreehugger Robot			errtext << "-end of input-(";
89*16467b97STreehugger Robot		}
90*16467b97STreehugger Robot		else
91*16467b97STreehugger Robot		{
92*16467b97STreehugger Robot			errtext << "-unknown source-(";
93*16467b97STreehugger Robot		}
94*16467b97STreehugger Robot	}
95*16467b97STreehugger Robot	else
96*16467b97STreehugger Robot	{
97*16467b97STreehugger Robot		errtext << ex->get_streamName() << "(";
98*16467b97STreehugger Robot	}
99*16467b97STreehugger Robot
100*16467b97STreehugger Robot	// Next comes the line number
101*16467b97STreehugger Robot	//
102*16467b97STreehugger Robot	errtext << this->get_rec()->get_state()->get_exception()->get_line() << ") ";
103*16467b97STreehugger Robot	errtext << " : error " << this->get_rec()->get_state()->get_exception()->getType()
104*16467b97STreehugger Robot							<< " : "
105*16467b97STreehugger Robot							<< this->get_rec()->get_state()->get_exception()->get_message();
106*16467b97STreehugger Robot
107*16467b97STreehugger Robot	IntStreamType* is			= this->get_istream();
108*16467b97STreehugger Robot	TreeType* theBaseTree	= this->get_rec()->get_state()->get_exception()->get_token();
109*16467b97STreehugger Robot	StringType ttext		= theBaseTree->toStringTree();
110*16467b97STreehugger Robot
111*16467b97STreehugger Robot	if  (theBaseTree != NULL)
112*16467b97STreehugger Robot	{
113*16467b97STreehugger Robot		TreeType*  theCommonTree	=  static_cast<TreeType*>(theBaseTree);
114*16467b97STreehugger Robot		if	(theCommonTree != NULL)
115*16467b97STreehugger Robot		{
116*16467b97STreehugger Robot			CommonTokenType* theToken	= theBaseTree->getToken();
117*16467b97STreehugger Robot		}
118*16467b97STreehugger Robot		errtext << ", at offset "
119*16467b97STreehugger Robot			    << theBaseTree->getCharPositionInLine();
120*16467b97STreehugger Robot		errtext << ", near " << ttext;
121*16467b97STreehugger Robot	}
122*16467b97STreehugger Robot	ex->displayRecognitionError( errtext );
123*16467b97STreehugger Robot	ImplTraits::displayRecognitionError( errtext.str() );
124*16467b97STreehugger Robot}
125*16467b97STreehugger Robot
126*16467b97STreehugger Robottemplate< class ImplTraits >
127*16467b97STreehugger Robotvoid	TreeParser<ImplTraits>::setTreeNodeStream(TreeNodeStreamType* input)
128*16467b97STreehugger Robot{
129*16467b97STreehugger Robot	m_ctnstream = input;
130*16467b97STreehugger Robot    this->get_rec()->reset();
131*16467b97STreehugger Robot    m_ctnstream->reset();
132*16467b97STreehugger Robot}
133*16467b97STreehugger Robot
134*16467b97STreehugger Robottemplate< class ImplTraits >
135*16467b97STreehugger Robottypename TreeParser<ImplTraits>::TreeNodeStreamType* TreeParser<ImplTraits>::getTreeNodeStream()
136*16467b97STreehugger Robot{
137*16467b97STreehugger Robot	return m_ctnstream;
138*16467b97STreehugger Robot}
139*16467b97STreehugger Robot
140*16467b97STreehugger Robottemplate< class ImplTraits >
141*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::exConstruct()
142*16467b97STreehugger Robot{
143*16467b97STreehugger Robot	new ANTLR_Exception<ImplTraits, MISMATCHED_TREE_NODE_EXCEPTION, TreeNodeStreamType>( this->get_rec(), "" );
144*16467b97STreehugger Robot}
145*16467b97STreehugger Robot
146*16467b97STreehugger Robottemplate< class ImplTraits >
147*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::mismatch(ANTLR_UINT32 ttype, BitsetListType* follow)
148*16467b97STreehugger Robot{
149*16467b97STreehugger Robot	this->exConstruct();
150*16467b97STreehugger Robot    this->recoverFromMismatchedToken(ttype, follow);
151*16467b97STreehugger Robot}
152*16467b97STreehugger Robot
153*16467b97STreehugger Robottemplate< class ImplTraits >
154*16467b97STreehugger Robottypename TreeParser<ImplTraits>::TokenType*
155*16467b97STreehugger RobotTreeParser<ImplTraits>::getMissingSymbol( IntStreamType* istream, ExceptionBaseType*		e,
156*16467b97STreehugger Robot					  ANTLR_UINT32	 expectedTokenType, BitsetListType*	follow)
157*16467b97STreehugger Robot{
158*16467b97STreehugger Robot	TreeNodeStreamType*		tns;
159*16467b97STreehugger Robot	TreeType*				node;
160*16467b97STreehugger Robot	TreeType*				current;
161*16467b97STreehugger Robot	CommonTokenType*		token;
162*16467b97STreehugger Robot	StringType				text;
163*16467b97STreehugger Robot        ANTLR_INT32             i;
164*16467b97STreehugger Robot
165*16467b97STreehugger Robot	// Dereference the standard pointers
166*16467b97STreehugger Robot	//
167*16467b97STreehugger Robot    tns	    = static_cast<TreeNodeStreamType*>(istream);
168*16467b97STreehugger Robot
169*16467b97STreehugger Robot	// Create a new empty node, by stealing the current one, or the previous one if the current one is EOF
170*16467b97STreehugger Robot	//
171*16467b97STreehugger Robot	current	= tns->_LT(1);
172*16467b97STreehugger Robot    i       = -1;
173*16467b97STreehugger Robot
174*16467b97STreehugger Robot	if	(current == tns->get_EOF_NODE_p())
175*16467b97STreehugger Robot	{
176*16467b97STreehugger Robot		current = tns->_LT(-1);
177*16467b97STreehugger Robot        i--;
178*16467b97STreehugger Robot	}
179*16467b97STreehugger Robot	node	= current->dupNode();
180*16467b97STreehugger Robot
181*16467b97STreehugger Robot	// Find the newly dupicated token
182*16467b97STreehugger Robot	//
183*16467b97STreehugger Robot	token	= node->getToken();
184*16467b97STreehugger Robot
185*16467b97STreehugger Robot	// Create the token text that shows it has been inserted
186*16467b97STreehugger Robot	//
187*16467b97STreehugger Robot	token->setText("<missing ");
188*16467b97STreehugger Robot	text = token->getText();
189*16467b97STreehugger Robot	text.append((const char *)this->get_rec()->get_state()->get_tokenName(expectedTokenType));
190*16467b97STreehugger Robot	text.append((const char *)">");
191*16467b97STreehugger Robot
192*16467b97STreehugger Robot	// Finally return the pointer to our new node
193*16467b97STreehugger Robot	//
194*16467b97STreehugger Robot	return	node;
195*16467b97STreehugger Robot}
196*16467b97STreehugger Robot
197*16467b97STreehugger Robot
198*16467b97STreehugger RobotANTLR_END_NAMESPACE()
199