A class to hold the current indentation information when compiling JavaScript (e.g. code in while {} statements is indented).
示例#1
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     textWriter.WriteLine();
     context.Indentation--;
     textWriter.Write(context.IndentationText);
     textWriter.Write("}");
 }
示例#2
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     context.Indentation++;
     textWriter.Write("while (");
     _condition.GenerateJavaScript(context, textWriter);
     textWriter.Write(") {");
 }
示例#3
0
        public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
        {
            textWriter.Write("if (");
            _condition.GenerateJavaScript(context, textWriter);
            textWriter.WriteLine(") {");
            context.Indentation++;
            textWriter.Write(context.IndentationText);
            _thenExpression.GenerateJavaScript(context, textWriter);
            textWriter.WriteLine();

            context.Indentation--;
            textWriter.Write(context.IndentationText);

            if (_elseExpression != null)
            {

                textWriter.WriteLine("} else {");
                context.Indentation++;
                textWriter.Write(context.IndentationText);

                _elseExpression.GenerateJavaScript(context, textWriter);
                context.Indentation--;

                textWriter.WriteLine();
                textWriter.Write(context.IndentationText);
            }

            textWriter.WriteLine("}");
        }
示例#4
0
        public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
        {
            if (LineTypes == LineTypes.None)
            {
                throw new ApplicationException("Line type not set for line " + LineNumber);
            }

            if ((LineTypes & LineTypes.FunctionStart) > 0)
            {
                textWriter.Write(context.IndentationText);
                textWriter.WriteLine("function line" + LineNumber + "() {");
                context.Indentation++;
            }

            textWriter.Write(context.IndentationText);
            StatementList.GenerateJavaScript(context, textWriter);
            textWriter.WriteLine();

            if ((LineTypes & LineTypes.FunctionEnd) > 0)
            {
                if (!string.IsNullOrEmpty(ReturnText))
                {
                    textWriter.Write(context.IndentationText);
                    textWriter.WriteLine(ReturnText);
                }
                context.Indentation--;
                textWriter.Write(context.IndentationText);
                textWriter.WriteLine("}");
            }
        }
示例#5
0
 public static void GenerateNodes(JSContext context, TextWriter textWriter, AstNodeList nodes)
 {
     foreach (AstNode node in nodes)
     {
         GenerateNode(context, textWriter, node);
     }
 }
示例#6
0
        public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
        {
            context.Indentation++;
            textWriter.Write("for (var ");
            _assignment.GenerateJavaScript(context, textWriter);
            textWriter.Write(" ");

            GeneratorHelper.GenerateNode(context, textWriter, _assignment.Variable);

            if (_step > 0)
            {
                textWriter.Write("<=");
            }
            else if (_step < 0)
            {
                textWriter.Write(">=");
            }
            else
            {
                throw new BasicSyntaxErrorException("A step amount of 0 is not allowed.");
            }

            _upperBound.GenerateJavaScript(context, textWriter);
            textWriter.Write("; ");
            GeneratorHelper.GenerateNode(context, textWriter, _assignment.Variable);
            textWriter.Write(" += " + _step);

            textWriter.Write(") {");
        }
示例#7
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     textWriter.WriteLine("/* Generated by the JSBasic compiler at " + DateTime.Now.ToString("HH:mm:ss dd/MMM/yy", CultureInfo.CurrentCulture) + " */");
     foreach (LineNode line in Lines)
     {
         line.GenerateJavaScript(context, textWriter);
     }
 }
示例#8
0
 public override void GenerateJavaScript(JSContext context, TextWriter textWriter)
 {
     textWriter.Write("console.setCursorPos(");
     GeneratorHelper.GenerateNode(context, textWriter, TargetRow);
     textWriter.Write(", ");
     GeneratorHelper.GenerateNode(context, textWriter, TargetColumn);
     textWriter.Write(");");
 }
示例#9
0
        public static void GenerateNode(JSContext context, TextWriter textWriter, AstNode node)
        {
            if (node == null)
            {
                throw new ArgumentNullException("node");
            }

            if (node is IJSBasicNode)
            {
                IJSBasicNode jsBasicNode = (IJSBasicNode)node;
                jsBasicNode.GenerateJavaScript(context, textWriter);
            }
            else if (node is Token)
            {
                Token t = (Token)node;
                switch (t.Terminal.Name)
                {
                    case "VARIABLE":
                        if (t.Text.EndsWith("$"))
                        {
                            textWriter.Write("s_" + t.Text.Substring(0, t.Text.Length - 1));
                        }
                        else
                        {
                            throw new BasicSyntaxErrorException("Invalid variable name: " + t.Text);
                        }
                        break;
                    case "BOOLEAN_OP":
                        {
                            switch (t.Text.ToLowerInvariant())
                            {
                                case "and":
                                    textWriter.Write("&&");
                                    break;
                                case "or":
                                    textWriter.Write("||");
                                    break;
                                default:
                                    textWriter.Write(t.Text);
                                    break;
                            }
                        }
                        break;
                    default:
                        textWriter.Write(ConvertToJavascript(t.Text));
                        break;
                }
                textWriter.Write(" ");
            }
            else
            {
                throw new ApplicationException("Unhandled statement type: " + node.GetType().FullName);
            }
        }
示例#10
0
        public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
        {
            GeneratorHelper.GenerateNode(context, textWriter, _variable);
            textWriter.Write("= console.input(");

            if (_toPrint != null)
            {
                _toPrint.GenerateJavaScript(context, textWriter);
            }

            textWriter.Write(");");
        }
示例#11
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     bool isFirst = true;
     foreach (var expr in Expressions)
     {
         if (!isFirst)
         {
             textWriter.Write("+ ");
         }
         expr.GenerateJavaScript(context, textWriter);
         isFirst = false;
     }
 }
示例#12
0
        public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
        {
            base.GenerateJavaScript(context, textWriter);

            // put semi-colons on the end of expression-statements.
            if (ChildNodes.Count == 1)
            {
                ExpressionNode expr = ChildNodes[0] as ExpressionNode;
                if (expr != null)
                {
                    textWriter.Write(";");
                }
            }
        }
示例#13
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     bool isFirst = true;
     foreach (var stmt in Statements)
     {
         if (!isFirst)
         {
             textWriter.WriteLine();
             textWriter.Write(context.IndentationText);
         }
         stmt.GenerateJavaScript(context, textWriter);
         isFirst = false;
     }
 }
示例#14
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     if (BranchType == BranchType.Gosub)
     {
         textWriter.Write("line" + DestinationLine + "();");
     }
     else if (BranchType == BranchType.Return)
     {
         textWriter.Write("return;");
     }
     else
     {
         textWriter.Write("return line" + DestinationLine + ";");
     }
 }
示例#15
0
 public override void GenerateJavaScript(JSContext context, TextWriter textWriter)
 {
     textWriter.Write("tempVar = ");
     GeneratorHelper.GenerateNode(context, textWriter, Variable1);
     textWriter.WriteLine(";");
     textWriter.Write(context.IndentationText);
     GeneratorHelper.GenerateNode(context, textWriter, Variable1);
     textWriter.Write(" = ");
     GeneratorHelper.GenerateNode(context, textWriter, Variable2);
     textWriter.WriteLine(";");
     textWriter.Write(context.IndentationText);
     GeneratorHelper.GenerateNode(context, textWriter, Variable2);
     textWriter.WriteLine(" = tempVar;");
     textWriter.Write(context.IndentationText);
     textWriter.Write("tempVar = null;");
 }
示例#16
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     string op;
     switch (_operator.Text)
     {
         case "=":
             op = "==";
             break;
         case "<>":
             op = "!=";
             break;
         case "and":
             op = "&&";
             break;
         case "or":
             op = "||";
             break;
         default:
             op = _operator.Text;
             break;
     }
     textWriter.Write(op);
 }
示例#17
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     switch (FunctionName.Text.ToLowerInvariant()) {
         case "len":
             Write(context, textWriter, InputParameter1, ".length");
             break;
         case "left$":
             Write(context, textWriter, InputParameter1, ".substring(0, ", InputParameter2, ")");
             break;
         case "right$":
             Write(context, textWriter, InputParameter1, ".substring(", InputParameter1, ".length - ", InputParameter2, ")");
             break;
         case "mid$":
             if (InputParameter3 == null)
             {
                 Write(context, textWriter, InputParameter1, ".substring(", InputParameter2, "-1)");
             }
             else
             {
                 Write(context, textWriter, InputParameter1, ".substring(", InputParameter2, "-1,", InputParameter2, "-1+",InputParameter3, ")");
             }
             break;
         case "abs":
             Write(context, textWriter, "Math.abs(", InputParameter1, ")");
             break;
         case "asc":
             Write(context, textWriter, InputParameter1, ".charCodeAt(0)");
             break;
         case "chr$":
             Write(context, textWriter, "String.fromCharCode(", InputParameter1, ")");
             break;
         case "cint":
             Write(context, textWriter, "Math.round(", InputParameter1, ")");
             break;
         case "cvi":
             Write(context, textWriter, "parseInt(", InputParameter1, ")");
             break;
         case "cvs":
         case "cvd":
             Write(context, textWriter, "parseFloat(", InputParameter1, ")");
             break;
         case "exp":
             Write(context, textWriter, "Math.exp(", InputParameter1, ")");
             break;
         case "fix":
             Write(context, textWriter, "Math.floor(", InputParameter1, ")");
             break;
         case "pos":
             Write(context, textWriter, "console.cursorPosition.column");
             break;
         case "sgn":
             Write(context, textWriter, "(", InputParameter1 + " == 0 ? 0 : (", InputParameter1 , " > 0 ? 1 : -1))");
             break;
         case "sin":
             Write(context, textWriter, "Math.sin(", InputParameter1, ")");
             break;
         case "cos":
             Write(context, textWriter, "Math.cos(", InputParameter1, ")");
             break;
         case "tan":
             Write(context, textWriter, "Math.tan(", InputParameter1, ")");
             break;
         case "spc":
         case "space$":
             Write(context, textWriter, "getSpaces(", InputParameter1, ")");
             break;
         case "instr":
             if (InputParameter3 == null)
             {
                 Write(context, textWriter, "(" + InputParameter1, ".indexOf(", InputParameter2, ")+1)");
             }
             else
             {
                 Write(context, textWriter, "(" + InputParameter2, ".indexOf(", InputParameter3, "," + InputParameter1 + ")+1)");
             }
             break;
         case "log":
             Write(context, textWriter, "Math.log(", InputParameter1, ")");
             break;
         case "sqr":
             Write(context, textWriter, "Math.sqrt(", InputParameter1, ")");
             break;
         case "str$":
             Write(context, textWriter, "('' + ", InputParameter1, ")");
             break;
         case "string$":
             Write(context, textWriter, "generateString(", InputParameter1, ",", InputParameter2, ")");
             break;
         case "val":
             Write(context, textWriter, "parseInt(", InputParameter1, ")");
             break;
         default:
             throw new BasicSyntaxErrorException("Unknown global function " + FunctionName.Text);
     }
 }
示例#18
0
 private static void Write(JSContext context, TextWriter textWriter, params object[] values)
 {
     foreach (object val in values)
     {
         if (val is AstNode)
         {
             textWriter.Write("(");
             GeneratorHelper.GenerateNode(context, textWriter, (AstNode)val);
             textWriter.Write(")");
         }
         else
         {
             textWriter.Write(val);
         }
     }
 }
示例#19
0
 public virtual void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     GeneratorHelper.GenerateNodes(context, textWriter, ChildNodes);
 }
示例#20
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     GeneratorHelper.GenerateNodes(context, textWriter, ChildNodes);
     textWriter.Write(";");
 }
示例#21
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     textWriter.Write("// " + _comment);
 }
示例#22
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     textWriter.Write("console.println(");
     _exprList.GenerateJavaScript(context, textWriter);
     textWriter.Write(");");
 }
示例#23
0
 public override void GenerateJavaScript(JSContext context, System.IO.TextWriter textWriter)
 {
     textWriter.Write("// " + _comment);
 }