SE250:lab-9:hpan027: Difference between revisions
Jump to navigation
Jump to search
m 22 revision(s) |
(No difference)
|
Latest revision as of 05:20, 3 November 2008
Starting up
- Chose first task
- 10 minutes in, considering switching tasks.
- Chose second task
Reading the code
Parse by default calls the function for if-then-else statements - which has not been written. Hence code does not run.
Need to recode Parse into something like:
Given an input Work out what type of statement it is <- hard part Call appropriate method
Looking at the various inputs and attempting to translate them into code
"a=1", "a=1;b=2;k;k;k",
Self explanatory?
"ia>btwtda=a*2ek",
if (a > b)
then while (t)
do (a = a * 2)
else k
"ict{x=1;wtda=a*2}ek",
if ( c )
then {
x = 1;
while (t)
do (a = a*2);
}
else k;
"junk that won't parse",
Lols.
- Getting "a=2" to parse is pretty easy.
- Call Exp(tokens,2)
- Output
Parse("a=1"):
=(a 1)
a 1 =2
Onto the actual task
S ::= "if" E "then" S [ "else" S ]
| "while" E "do" S
| "{" Ss "}"
| Ide "=" E
| "skip"
Code will need a series of if statements to check for the keywords
//if ("if")
//parse for if statements
//else if ("while")
//parse for while statements
etc
Very basic if-then-else
Tree* Stmt( TokenStream* tokens ) { //if then else statements
if( current( tokens ) == TOK_IF )
printf("True\n");
advance( tokens );
Tree* t1 = Exp( tokens, 1 );
expect( tokens, TOK_THEN );
Tree* t2 = Exp( tokens, 1 );
expect( tokens, TOK_ELSE );
Tree* t3 = Exp( tokens, 1 );
Tree* t = mkNode3('?',t1,t2,t3);
return t;
}
- Doesn't work for anything except the most basic form of if-then-else.
- Need to change the Exp calls into Stmt calls - but can't do that until the rest of the function is finished
Revised if-then-else code
Tree* Stmt( TokenStream* tokens ) { //if then else statements
if( current( tokens ) == TOK_IF ) {
advance( tokens );
Tree* t1 = Exp( tokens, 1 );
expect( tokens, TOK_THEN );
Tree* t2 = Stmt( tokens );
if (!end_of_tokens(tokens)) {
expect( tokens, TOK_ELSE );
Tree* t3 = Stmt( tokens );
return mkNode3('?',t1,t2,t3);
}
return mkNode2('?',t1,t2);
}
if( isVariable( current( tokens ) ) )
return Exp( tokens, 0 );
return mkNode('0',0);
}
- Seems to work for the input "ia=1ta=2ea=3"
- Need to write the if blocks for other things defined under S
Other S grammar added
Tree* Stmt( TokenStream* tokens ) { //if then else statements
/* IF */
if( current( tokens ) == TOK_IF ) {
advance( tokens );
Tree* t1 = Exp( tokens, 0 );
expect( tokens, TOK_THEN );
Tree* t2 = Stmt( tokens );
if (!end_of_tokens(tokens)) {
expect( tokens, TOK_ELSE );
Tree* t3 = Stmt( tokens );
return mkNode3('?',t1,t2,t3);
}
return mkNode2('?',t1,t2);
}
/* Variable assignment (e.g. a = 1) */
if( isVariable( current( tokens ) ) )
return Exp( tokens, 0 );
/* While loops */
if( current( tokens ) == TOK_WHILE ) {
advance( tokens );
Tree* t1 = Exp( tokens, 0 );
expect( tokens, TOK_DO );
Tree* t2 = Stmt( tokens );
return mkNode2(TOK_WHILE,t1,t2);
}
/* { Curly brackets } */
if( current( tokens ) == TOK_OPENBRACE ) {
advance( tokens );
Tree* t = StmtSeq(tokens);
expect( tokens, TOK_CLOSEBRACE);
return t;
}
/* SKIP */
if( current( tokens ) == TOK_SKIP) {
return mkNode(0,0);
}
/* Print */
if( current( tokens ) == TOK_PRINT) {
return mkNode1(TOK_PRINT, Exp(tokens,0));
}
/* Base fail case */
return mkNode(0,0);
}
- Trying to get this code to run with "ia=btwa=1da=a*2ek"
- Having some problems at the moment
- The default test cases do not work at all
- Variable assignment needed to be rewritten
if( isVariable( current( tokens ) ) ) {
Tree* t1 = P(tokens);
expect(tokens, TOK_EQ);
return mkNode2(TOK_EQ, t1, Exp(tokens,0));
}
- Still problems
- Order matters...variable assignment should be right at bottom as i, p, e, etc are all considered variables
- /facepalm
- However getting there
- Output currently ?(=(a b) w(=(a 1) =(a *(a 2)))
- If statement seems to have been broken by the while
- Actually caused by the skip
- No idea how to produce an external node
- Changing test case to "ia=btwa=1da=a*2ea=2"
Parse("ia=btwa=1da=a*2ea=2"):
?(=(a b) w(=(a 1) =(a *(a 2))) =(a 2))
- Seems to work
Conclusion
Very long lab for 2 hours. Might finish later.