Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- expr = expr + ident // r1
- | ident // r2
- | ident | + | $ | expr |
- 0 | s1 | | | 2 |
- 1 | r2 | r2 | r2| |
- 2 | | s3 |acc| |
- 3 | s4 | | | 2 |
- 4 | r1 | r1 | r1| |
- struct result {
- symbol nonterm;
- int tokens_to_reduce;
- }
- result state0(token* stream) {
- result res;
- switch(stream[0]) {
- case ident:
- res = state1(stream+1);
- break;
- default: throw error();
- }
- while(true) {
- if(res.tokens_to_reduce == 0) {
- switch(res.nonterm) {
- case expr:
- res = state2(stream);
- break;
- default: throw error();
- }
- }
- else return { res.non_term, res.tokens_to_reduce-1 };
- }
- }
- result state1(token* stream) {
- reduce2(); // needs arguments
- return { expr, 0 };
- }
- result state2(token* stream) {
- result res;
- switch(stream[0]) {
- case plus:
- res = state3(stream+1);
- break;
- case end:
- return accept(); // needs some work
- default: throw error();
- }
- }
- result state3(token* stream) {
- result res;
- switch(stream[0]) {
- case ident:
- res = state4(stream+1);
- break;
- default: throw error();
- }
- while(true) {
- if(res.tokens_to_reduce == 0) {
- switch(res.nonterm) {
- case expr:
- res = state2(stream);
- break;
- default: throw error();
- }
- }
- else return { res.non_term, res.tokens_to_reduce-1 };
- }
- }
- result state4(token* stream) {
- reduce1(); // needs arguments
- return { expr, 1 };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement