//Print ::= "print" "(" Ignored Variable Ignored ")" Ignored static public (Print, string) parsePrint(ref lexer.Lexer Lexer) { Print print = new Print(); string error; print.LineNum = Lexer.GetLineNum(); Lexer.NextTokenIs(lexer.TOKEN_PRINT); Lexer.NextTokenIs(lexer.TOKEN_LEFT_PAREN); Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); (print.Variable, error) = parseVariable(ref Lexer); if (error != null) { return(print, error); } Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); Lexer.NextTokenIs(lexer.TOKEN_RIGHT_PAREN); Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); return(print, null); }
//Assignment ::= Variable Ignored "=" Ignored String Ignored static public (Assignment, string) parseAssignment(ref lexer.Lexer Lexer) { Assignment assignment = new Assignment(); string error; assignment.LineNum = Lexer.GetLineNum(); (assignment.Variable, error) = parseVariable(ref Lexer); if (error != null) { return(assignment, error); } Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); Lexer.NextTokenIs(lexer.TOKEN_EQUAL); Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); (assignment.String, error) = parseString(ref Lexer); if (error != null) { return(assignment, error); } Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); return(assignment, null); }
//String ::= '"' '"' Ignored | '"' StringCharacter '"' Ignored static public (string, string) parseString(ref lexer.Lexer Lexer) { string str = ""; switch (Lexer.LookAhead()) { case lexer.TOKEN_DUOQUOTE: Lexer.NextTokenIs(lexer.TOKEN_DUOQUOTE); Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); return(str, null); case lexer.TOKEN_QUOTE: Lexer.NextTokenIs(lexer.TOKEN_QUOTE); str = Lexer.scanBeforeToken(lexer.tokenNameMap[lexer.TOKEN_QUOTE]); Lexer.NextTokenIs(lexer.TOKEN_QUOTE); Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); return(str, null); default: return(null, "parseString(): not a string."); } }
//Variable ::= "$" Name Ignored static public (Variable, string) parseVariable(ref lexer.Lexer Lexer) { Variable variable = new Variable(); string error; variable.LineNum = Lexer.GetLineNum(); Lexer.NextTokenIs(lexer.TOKEN_VAR_PREFIX); (variable.Name, error) = parseName(ref Lexer); if (error != null) { return(variable, error); } Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); return(variable, null); }
static public (Statement, string) parseStatement(ref lexer.Lexer Lexer) { Lexer.LookAheadAndSkip(lexer.TOKEN_IGNORED); switch (Lexer.LookAhead()) { case lexer.TOKEN_PRINT: return(parsePrint(ref Lexer)); case lexer.TOKEN_VAR_PREFIX: return(parseAssignment(ref Lexer)); default: return(null, "parseStatement(): unknown Statement."); } }