private Node parseStatement() { System.out.println("-----> parsing :"); Token token = lex.getNextToken(); // ---------------->>> print or print if ( token.isKind("print") ) { token = lex.getNextToken(); if ( token.isKind("string") ) {// print return new Node( "prtstr", token.getDetails(), null, null, null ); } else {// must be first token in // put back the token we looked ahead at lex.putBackToken( token ); Node first = parseExpr(); return new Node( "prtexp", first, null, null ); } // ---------------->>> newline } else if ( token.isKind("newline") ) { return new Node( "nl", null, null, null ); } // --------------->>> = else if ( token.isKind("var") ) { String varName = token.getDetails(); token = lex.getNextToken(); errorCheck( token, "single", "=" ); Node first = parseExpr(); return new Node( "sto", varName, first, null, null ); } else { System.out.println("Token " + token + " can't begin a statement"); System.exit(1); return null; } }// private Node parseExpr() { System.out.println("-----> parsing "); Node first = parseTerm(); // look ahead to see if there's an addop Token token = lex.getNextToken(); if ( token.matches("single", "+") || token.matches("single", "-") ) { Node second = parseExpr(); return new Node( token.getDetails(), first, second, null ); } else {// is just one term lex.putBackToken( token ); return first; } }// private Node parseTerm() { System.out.println("-----> parsing "); Node first = parseFactor(); // look ahead to see if there's a multop Token token = lex.getNextToken(); if ( token.matches("single", "*") || token.matches("single", "/") ) { Node second = parseTerm(); return new Node( token.getDetails(), first, second, null ); } else {// is just one factor lex.putBackToken( token ); return first; } }// private Node parseFactor() { System.out.println("-----> parsing "); Token token = lex.getNextToken(); if ( token.isKind("num") ) { return new Node("num", token.getDetails(), null, null, null ); } else if ( token.isKind("var") ) { return new Node("var", token.getDetails(), null, null, null ); } else if ( token.matches("single","(") ) { Node first = parseExpr(); token = lex.getNextToken(); errorCheck( token, "single", ")" ); return first; } else if ( token.isKind("bif0") ) { String bifName = token.getDetails(); token = lex.getNextToken(); errorCheck( token, "single", "(" ); token = lex.getNextToken(); errorCheck( token, "single", ")" ); return new Node( bifName, null, null, null ); } else if ( token.isKind("bif1") ) { String bifName = token.getDetails(); token = lex.getNextToken(); errorCheck( token, "single", "(" ); Node first = parseExpr(); token = lex.getNextToken(); errorCheck( token, "single", ")" ); return new Node( bifName, first, null, null ); } else if ( token.isKind("bif2") ) { String bifName = token.getDetails(); token = lex.getNextToken(); errorCheck( token, "single", "(" ); Node first = parseExpr(); token = lex.getNextToken(); errorCheck( token, "single", "," ); Node second = parseExpr(); token = lex.getNextToken(); errorCheck( token, "single", ")" ); return new Node( bifName, first, second, null ); } else if ( token.matches("single","-") ) { Node first = parseFactor(); return new Node("opp", first, null, null ); } else { System.out.println("Can't have a factor starting with " + token ); System.exit(1); return null; } }//