// Add code to this case clause. public void AddCode(ast.Statement statement) { // First time? if (Code == null) { Code = new ast.CodeBlock(statement.Bookmark, TriState.No); } Code.AddStatement(statement); }
static void addMacro(ast.Statement stmt, Object.Environment env) { ast.LetStatement letStatement = (ast.LetStatement)stmt; ast.MacroLiteral macroLiteral = (ast.MacroLiteral)letStatement.Value; Object.Macro macro = new Object.Macro { Parameters = macroLiteral.Parameters, Env = env, Body = macroLiteral.Body }; env.Set(letStatement.Name.Value, macro); }
static bool isMacroDefenition(ast.Statement node) { if (!(node is ast.LetStatement)) { return(false); } ast.LetStatement letStatement = (ast.LetStatement)node; if (!(letStatement.Value is ast.MacroLiteral)) { return(false); } return(true); }
public ast.Program ParseProgram() { ast.Program program = new ast.Program { }; program.Statements = new List <ast.Statement>(); while (!curTokenIs(token.EOF)) { ast.Statement stmt = parseStatement(); if (stmt != null) { program.Statements.Add(stmt); } nextToken(); } return(program); }
public static void DefineMacros(ast.Program program, Object.Environment env) { List <int> defenitions = new List <int>(); for (int i = 0; i < program.Statements.Count; i++) { ast.Statement statement = program.Statements[i]; if (isMacroDefenition(statement)) { addMacro(statement, env); defenitions.Add(i++); } } for (int i = defenitions.Count - 1; i >= 0; i--) { int defenitionIndex = defenitions[i]; program.Statements.RemoveAt(defenitionIndex); } }
static ast.BlockStatement parseBlockStatement() { ast.BlockStatement block = new ast.BlockStatement { Token = curToken }; block.Statements = new List <ast.Statement>(); nextToken(); while (!curTokenIs(token.RBRACE) && !curTokenIs(token.EOF)) { ast.Statement stmt = parseStatement(); if (stmt != null) { block.Statements.Add(stmt); } nextToken(); } return(block); }