protected override void DoAction(int action) { #pragma warning disable 162, 1522 switch (action) { case 2: // program -> statementList { program = ValueStack[ValueStack.Depth - 1].statementList; } break; case 3: // statementList -> /* empty */ { if (CurrentSemanticValue.statementList == null) { CurrentSemanticValue.statementList = codegen.NewList(); } } break; case 4: // statementList -> statement { if (CurrentSemanticValue.statementList == null) { CurrentSemanticValue.statementList = codegen.NewList(); } if (ValueStack[ValueStack.Depth - 1].statement != null) { CurrentSemanticValue.statementList.InsertFront(ValueStack[ValueStack.Depth - 1].statement); } } break; case 5: // statementList -> statementList, statement { if (ValueStack[ValueStack.Depth - 1].statement != null) { ValueStack[ValueStack.Depth - 2].statementList.Add(ValueStack[ValueStack.Depth - 1].statement); } CurrentSemanticValue.statementList = ValueStack[ValueStack.Depth - 2].statementList; } break; case 6: // statement -> plainInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 7: // statement -> assignInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 8: // statement -> forInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 9: // statement -> ifInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 10: // statement -> caseInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 11: // statement -> rawInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 12: // statement -> unlessInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 13: // statement -> tableInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 14: // statement -> captureInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 15: // statement -> includeInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 16: // statement -> timeoutInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 17: // statement -> cycleInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 18: // statement -> commentInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 19: // statement -> outputInst { CurrentSemanticValue.statement = ValueStack[ValueStack.Depth - 1].statement; } break; case 20: // expr -> expr, AND, term { CurrentSemanticValue.expr = codegen.NewExpression(Operation.And, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].expr); } break; case 21: // expr -> expr, OR, term { CurrentSemanticValue.expr = codegen.NewExpression(Operation.Or, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].expr); } break; case 22: // expr -> term { CurrentSemanticValue.expr = ValueStack[ValueStack.Depth - 1].expr; } break; case 23: // term -> fact, OP_EQ, fact { CurrentSemanticValue.expr = codegen.NewExpression(Operation.Equ, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].expr); } break; case 24: // term -> fact, OP_NE, fact { CurrentSemanticValue.expr = codegen.NewExpression(Operation.NotEqu, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].expr); } break; case 25: // term -> fact, OP_LT, fact { CurrentSemanticValue.expr = codegen.NewExpression(Operation.Lt, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].expr); } break; case 26: // term -> fact, OP_GT, fact { CurrentSemanticValue.expr = codegen.NewExpression(Operation.Gt, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].expr); } break; case 27: // term -> fact, OP_GE, fact { CurrentSemanticValue.expr = codegen.NewExpression(Operation.GtEq, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].expr); } break; case 28: // term -> fact, OP_LE, fact { CurrentSemanticValue.expr = codegen.NewExpression(Operation.LtEq, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].expr); } break; case 29: // term -> fact { CurrentSemanticValue.expr = ValueStack[ValueStack.Depth - 1].expr; } break; case 30: // fact -> LEFT_PAR, expr, RIGHT_PAR { CurrentSemanticValue.expr = ValueStack[ValueStack.Depth - 2].expr; } break; case 31: // fact -> STRING_LITERAL { CurrentSemanticValue.expr = codegen.NewExpression(ValueStack[ValueStack.Depth - 1].String); } break; case 32: // fact -> BOOL_LITERAL { CurrentSemanticValue.expr = codegen.NewExpression(ValueStack[ValueStack.Depth - 1].Bool); } break; case 33: // fact -> NUM_LITERAL { CurrentSemanticValue.expr = codegen.NewExpression(ValueStack[ValueStack.Depth - 1].Double); } break; case 34: // fact -> NIL_LITERAL { CurrentSemanticValue.expr = codegen.NewExpression(); } break; case 35: // fact -> lookup { CurrentSemanticValue.expr = ValueStack[ValueStack.Depth - 1].expr; } break; case 36: // lookup -> lookup, DOT, IDENTIFIER { CurrentSemanticValue.expr = codegen.NewExpression(Operation.Lookup, ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].String); } break; case 37: // lookup -> IDENTIFIER { CurrentSemanticValue.expr = codegen.NewExpression(Operation.Lookup, ValueStack[ValueStack.Depth - 1].String); } break; case 38: // assignInst -> TAG_START, ASSIGN, IDENTIFIER, OP_ASSIGN, expr, TAG_END { CurrentSemanticValue.statement = codegen.NewAssignment(ValueStack[ValueStack.Depth - 4].String, ValueStack[ValueStack.Depth - 2].expr); } break; case 39: // commentInst -> TAG_START, COMMENT, TAG_END { CurrentSemanticValue.statement = null; } break; case 40: // plainInst -> PLAIN { CurrentSemanticValue.statement = codegen.Write(ValueStack[ValueStack.Depth - 1].String); } break; case 41: // rawInst -> TAG_START, RAW, stringList, END_RAW, TAG_END { CurrentSemanticValue.statement = codegen.Write(ValueStack[ValueStack.Depth - 3].StringBuilder.ToString()); } break; case 42: // stringList -> /* empty */ { CurrentSemanticValue.StringBuilder = new StringBuilder(); } break; case 43: // stringList -> stringList, PLAIN { ValueStack[ValueStack.Depth - 2].StringBuilder.Append(ValueStack[ValueStack.Depth - 1].String); CurrentSemanticValue.StringBuilder = ValueStack[ValueStack.Depth - 2].StringBuilder; } break; case 44: // forInst -> TAG_START, FOR, IDENTIFIER, IN, lookup, attributes, TAG_END, // statementList, TAG_START, END_FOR, TAG_END { CurrentSemanticValue.statement = codegen.NewForLoop(ValueStack[ValueStack.Depth - 9].String, ValueStack[ValueStack.Depth - 7].expr, ValueStack[ValueStack.Depth - 6].statementList, ValueStack[ValueStack.Depth - 4].statementList); } break; case 45: // forInst -> TAG_START, FOR, IDENTIFIER, IN, LEFT_PAR, expr, DOT_DOT, expr, // RIGHT_PAR, attributes, TAG_END, statementList, TAG_START, END_FOR, // TAG_END { CurrentSemanticValue.statement = codegen.NewForLoop(ValueStack[ValueStack.Depth - 13].String, codegen.NewExpression(Operation.Range, ValueStack[ValueStack.Depth - 10].expr, ValueStack[ValueStack.Depth - 8].expr), ValueStack[ValueStack.Depth - 6].statementList, ValueStack[ValueStack.Depth - 4].statementList); } break; case 46: // Anon@1 -> /* empty */ { currentStatement.Push(codegen.NewIf(ValueStack[ValueStack.Depth - 4].expr, ValueStack[ValueStack.Depth - 2].statementList)); } break; case 47: // ifInst -> TAG_START, IF, expr, TAG_END, statementList, TAG_START, Anon@1, // optionalElse, END_IF, TAG_END { CurrentSemanticValue.statement = currentStatement.Pop(); } break; case 49: // optionalElse -> ELSE, TAG_END, statementList, TAG_START { codegen.AddElseClause(currentStatement.Peek(), ValueStack[ValueStack.Depth - 2].statementList); } break; case 50: // Anon@2 -> /* empty */ { currentStatement.Push(codegen.NewCase(ValueStack[ValueStack.Depth - 2].expr)); } break; case 51: // caseInst -> TAG_START, CASE, expr, TAG_END, Anon@2, whenList, TAG_START, // optionalElse, END_CASE, TAG_END { CurrentSemanticValue.statement = currentStatement.Pop(); } break; case 52: // when -> TAG_START, WHEN, expr, TAG_END, statementList { codegen.AddWhenClause(currentStatement.Peek(), ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 1].statementList); } break; case 55: // Anon@3 -> /* empty */ { currentStatement.Push(codegen.NewUnless(ValueStack[ValueStack.Depth - 4].expr, ValueStack[ValueStack.Depth - 2].statementList)); } break; case 56: // unlessInst -> TAG_START, UNLESS, expr, TAG_END, statementList, TAG_START, // Anon@3, optionalElse, END_UNLESS, TAG_END { CurrentSemanticValue.statement = currentStatement.Pop(); } break; case 57: // tableInst -> TAG_START, TABLE, IDENTIFIER, IN, lookup, attributes, TAG_END, // statementList, TAG_START, END_TABLE, TAG_END { CurrentSemanticValue.statement = codegen.NewTableRow(ValueStack[ValueStack.Depth - 9].String, ValueStack[ValueStack.Depth - 7].expr, ValueStack[ValueStack.Depth - 6].statementList, ValueStack[ValueStack.Depth - 4].statementList); } break; case 58: // captureInst -> TAG_START, CAPTURE, IDENTIFIER, TAG_END, statementList, // TAG_START, END_CAPTURE, TAG_END { CurrentSemanticValue.statement = codegen.NewCapture(ValueStack[ValueStack.Depth - 6].String, ValueStack[ValueStack.Depth - 4].statementList); } break; case 59: // includeInst -> TAG_START, INCLUDE, STRING_LITERAL, optionalWith, TAG_END { CurrentSemanticValue.statement = codegen.Include(ValueStack[ValueStack.Depth - 3].String, ValueStack[ValueStack.Depth - 2].expr); } break; case 60: // optionalWith -> /* empty */ { CurrentSemanticValue.expr = null; } break; case 61: // optionalWith -> WITH, expr { CurrentSemanticValue.expr = ValueStack[ValueStack.Depth - 1].expr; } break; case 62: // timeoutInst -> TAG_START, TIMEOUT, NUM_LITERAL, TAG_END { CurrentSemanticValue.statement = codegen.NewTimeout(ValueStack[ValueStack.Depth - 2].Double); } break; case 63: // cycleInst -> TAG_START, CYCLE, cycleGroup, exprList, TAG_END { CurrentSemanticValue.statement = codegen.NewCycle(ValueStack[ValueStack.Depth - 3].String, ValueStack[ValueStack.Depth - 2].statementList); } break; case 64: // cycleGroup -> STRING_LITERAL, COL { CurrentSemanticValue.String = ValueStack[ValueStack.Depth - 2].String; } break; case 65: // cycleGroup -> /* empty */ { CurrentSemanticValue.String = ""; } break; case 66: // exprList -> exprList, COMMA, expr { CurrentSemanticValue.statementList = ValueStack[ValueStack.Depth - 3].statementList; CurrentSemanticValue.statementList.Add(ValueStack[ValueStack.Depth - 1].expr); } break; case 67: // exprList -> expr { CurrentSemanticValue.statementList = codegen.NewList(); CurrentSemanticValue.statementList.Add(ValueStack[ValueStack.Depth - 1].expr); } break; case 68: // attributes -> attributes, attribute { CurrentSemanticValue.statementList = ValueStack[ValueStack.Depth - 2].statementList; CurrentSemanticValue.statementList.Add(ValueStack[ValueStack.Depth - 1].statement); } break; case 69: // attributes -> /* empty */ { CurrentSemanticValue.statementList = codegen.NewList(); } break; case 70: // attribute -> IDENTIFIER, COL, expr { CurrentSemanticValue.statement = codegen.NewAttribute(ValueStack[ValueStack.Depth - 3].String, ValueStack[ValueStack.Depth - 1].expr); } break; case 71: // outputInst -> OUTPUT_START, expr, filterList, OUTPUT_END { CurrentSemanticValue.statement = codegen.Write(ValueStack[ValueStack.Depth - 3].expr, ValueStack[ValueStack.Depth - 2].statementList); } break; case 72: // filterList -> filterList, filter { CurrentSemanticValue.statementList = ValueStack[ValueStack.Depth - 2].statementList; CurrentSemanticValue.statementList.Add(ValueStack[ValueStack.Depth - 1].statement); } break; case 73: // filterList -> /* empty */ { CurrentSemanticValue.statementList = codegen.NewList(); } break; case 74: // filter -> PIPE, IDENTIFIER, OptionalParams { CurrentSemanticValue.statement = codegen.NewFilter(ValueStack[ValueStack.Depth - 2].String, ValueStack[ValueStack.Depth - 1].statementList); } break; case 75: // OptionalParams -> COL, exprList { CurrentSemanticValue.statementList = ValueStack[ValueStack.Depth - 1].statementList; } break; case 76: // OptionalParams -> /* empty */ { CurrentSemanticValue.statementList = null; } break; } #pragma warning restore 162, 1522 }