summaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index b563691..e4e8ae5 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -26,9 +26,8 @@ void Bu::Parser::parse()
26{ 26{
27 int iCurNt = iRootNonTerminal; 27 int iCurNt = iRootNonTerminal;
28 Lexer::Token *ptCur = sLexer.peek()->nextToken(); 28 Lexer::Token *ptCur = sLexer.peek()->nextToken();
29 //Lexer::Token *ptNext = sLexer.peek()->nextToken(); 29 sio << "Token: " << sLexer.peek()->tokenToString( *ptCur ) << sio.nl;
30 selectProduction( iCurNt, ptCur ); 30 selectProduction( iCurNt, ptCur );
31 sio << "Token: " << *ptCur << sio.nl;
32 31
33 while( !sState.isEmpty() ) 32 while( !sState.isEmpty() )
34 { 33 {
@@ -43,7 +42,7 @@ void Bu::Parser::parse()
43 advanceState(); 42 advanceState();
44 delete ptCur; 43 delete ptCur;
45 ptCur = sLexer.peek()->nextToken(); 44 ptCur = sLexer.peek()->nextToken();
46 sio << "Token: " << *ptCur << sio.nl; 45 sio << "Token: " << sLexer.peek()->tokenToString( *ptCur ) << sio.nl;
47 } 46 }
48 else 47 else
49 { 48 {
@@ -60,7 +59,7 @@ void Bu::Parser::parse()
60 sToken.push( ptCur ); 59 sToken.push( ptCur );
61 60
62 ptCur = sLexer.peek()->nextToken(); 61 ptCur = sLexer.peek()->nextToken();
63 sio << "Token: " << *ptCur << sio.nl; 62 sio << "Token: " << sLexer.peek()->tokenToString( *ptCur ) << sio.nl;
64 } 63 }
65 else 64 else
66 { 65 {
@@ -99,12 +98,15 @@ bool Bu::Parser::selectProduction( int iNt, Lexer::Token *ptCur )
99 { 98 {
100 if( (*i).isEmpty() ) 99 if( (*i).isEmpty() )
101 continue; 100 continue;
101 sio << "-->(Attempting production " << iNt << ":" << j << ": "
102 << (*i).first() << ")" << sio.nl;
102 if( (*i).first().eType == State::typeTerminal || 103 if( (*i).first().eType == State::typeTerminal ||
103 (*i).first().eType == State::typeTerminalPush ) 104 (*i).first().eType == State::typeTerminalPush )
104 { 105 {
105 if( (*i).first().iIndex == ptCur->iToken ) 106 if( (*i).first().iIndex == ptCur->iToken )
106 { 107 {
107 sState.push( (*i).begin() ); 108 sState.push( (*i).begin() );
109 sio.incIndent();
108 sio << "Pushing production " << j << " from nt " << iNt 110 sio << "Pushing production " << j << " from nt " << iNt
109 << sio.nl; 111 << sio.nl;
110 return true; 112 return true;
@@ -113,10 +115,12 @@ bool Bu::Parser::selectProduction( int iNt, Lexer::Token *ptCur )
113 else if( (*i).first().eType == State::typeNonTerminal ) 115 else if( (*i).first().eType == State::typeNonTerminal )
114 { 116 {
115 sState.push( (*i).begin() ); 117 sState.push( (*i).begin() );
118 sio.incIndent();
116 sio << "Pushing production " << j << " from nt " << iNt 119 sio << "Pushing production " << j << " from nt " << iNt
117 << " as test." << sio.nl; 120 << " as test." << sio.nl;
118 if( !selectProduction( (*i).first().iIndex, ptCur ) ) 121 if( !selectProduction( (*i).first().iIndex, ptCur ) )
119 { 122 {
123 sio.decIndent();
120 sState.pop(); 124 sState.pop();
121 sio << "Production " << j << " from nt " << iNt 125 sio << "Production " << j << " from nt " << iNt
122 << " didn't work out." << sio.nl; 126 << " didn't work out." << sio.nl;
@@ -129,6 +133,7 @@ bool Bu::Parser::selectProduction( int iNt, Lexer::Token *ptCur )
129 } 133 }
130 if( nt.bCanSkip ) 134 if( nt.bCanSkip )
131 return true; 135 return true;
136 sio << "-->(Found nothing)" << sio.nl;
132 return false; 137 return false;
133} 138}
134 139
@@ -140,6 +145,7 @@ void Bu::Parser::advanceState()
140 sState.peek()++; 145 sState.peek()++;
141 if( !sState.peek() ) 146 if( !sState.peek() )
142 { 147 {
148 sio.decIndent();
143 sState.pop(); 149 sState.pop();
144 sio << "State advanced, End of production." << sio.nl; 150 sio << "State advanced, End of production." << sio.nl;
145 return; 151 return;