Added full support for TAB function.
authorMichael Welch <michaelgwelch@gmail.com>
Wed, 27 Dec 2006 22:24:02 +0000 (22:24 +0000)
committerMichael Welch <michaelgwelch@gmail.com>
Wed, 27 Dec 2006 22:24:02 +0000 (22:24 +0000)
mbasic.csproj:
Added Tab.cs

Tab.cs:
Added. This node is used to represent a TAB(numeric expression).

Parser.cs:
Added support in parser for a TAB to specify any expression, not just a number constant.

print.mbas:
Added all of the print scenarios from User's Reference Guide.

Node.cs:
Removed some dead code.

BuiltIns.cs:
Fixed PrintTab. It was adding 1 too many spaces. Also removed some dead code.

TiBasicRuntime/BuiltIns.cs
mbasic/Parser.cs
mbasic/SyntaxTree/Node.cs
mbasic/SyntaxTree/Tab.cs [new file with mode: 0644]
mbasic/mbasic.csproj
mbasic/print.mbas

index fb7f28a..a04c361 100644 (file)
@@ -225,7 +225,8 @@ namespace TiBasicRuntime
         {\r
             int doubleLength = s.Length - 1;\r
             double d = double.Parse(s.Substring(1, doubleLength));\r
-            int n = (int) (Math.Round(d) % 28) + 1;\r
+            int n = (int) (Math.Round(d) % 28);\r
+            if (n < 1) n = 1;\r
             if (printCol > n) PrintNewLine();\r
             PrintItem(new String(' ', n - printCol));\r
         }\r
@@ -281,8 +282,5 @@ namespace TiBasicRuntime
         private static void ResetColumnPos() { printCol = 1; }\r
         private static int RemainingPrintColumns { get { return 28 - printCol + 1; } }\r
 \r
-\r
-        private static void PrintStuff(params object[] objects) { }\r
-        private static void PrintStuff2() { PrintStuff(3, 5, "hello"); }\r
     }\r
 }\r
index ef47692..0f557c0 100644 (file)
@@ -421,9 +421,7 @@ namespace mbasic
                 case Token.Tab:\r
                     Match(Token.Tab);\r
                     Match(Token.LeftParen);\r
-                    list.Add(new StringLiteral("\t" + lexer.NumericValue, lexer.LineId));\r
-                    \r
-                    Match(Token.Number);\r
+                    list.Add(new Tab(Expression(), lexer.LineId));\r
                     Match(Token.RightParen);\r
                     list.AddRange(MorePrintList());\r
                     break;\r
index 6b6ed1e..60dc48b 100644 (file)
@@ -46,17 +46,5 @@ using System.Reflection;
         public static bool debug;\r
         public static ISymbolDocumentWriter writer;\r
 \r
-\r
-\r
-\r
-\r
-\r
-\r
-        private static readonly MethodInfo writeMethod =\r
-            typeof(Console).GetMethod("Write", new Type[] { typeof(string) });\r
-        protected void EmitWrite(ILGenerator gen, String s)\r
-        {\r
-            gen.Emit(OpCodes.Call, writeMethod);\r
-        }\r
     }\r
 }\r
diff --git a/mbasic/SyntaxTree/Tab.cs b/mbasic/SyntaxTree/Tab.cs
new file mode 100644 (file)
index 0000000..780f5b0
--- /dev/null
@@ -0,0 +1,57 @@
+/*******************************************************************************\r
+    Copyright 2006 Michael Welch\r
+    \r
+    This file is part of MBasic99.\r
+\r
+    MBasic99 is free software; you can redistribute it and/or modify\r
+    it under the terms of the GNU General Public License as published by\r
+    the Free Software Foundation; either version 2 of the License, or\r
+    (at your option) any later version.\r
+\r
+    MBasic99 is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+    GNU General Public License for more details.\r
+\r
+    You should have received a copy of the GNU General Public License\r
+    along with MBasic99; if not, write to the Free Software\r
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
+*******************************************************************************/\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+using System.Reflection.Emit;\r
+using System.Reflection;\r
+using TiBasicRuntime;\r
+\r
+namespace mbasic.SyntaxTree\r
+{\r
+    class Tab : Expression\r
+    {\r
+        Expression expr;\r
+        public Tab(Expression expr, LineId line)\r
+            : base(line)\r
+        {\r
+            this.expr = expr;\r
+        }\r
+        public override BasicType GetBasicType()\r
+        {\r
+            if (expr.GetBasicType() == BasicType.Number) return BasicType.String;\r
+            return BasicType.Error;\r
+        }\r
+\r
+        private static readonly MethodInfo concatenateMethod =\r
+            typeof(String).GetMethod("Concat", new Type[] { typeof(string), typeof(string) });\r
+        private static readonly MethodInfo toStringMethod =\r
+            typeof(Radix100).GetMethod("ToString", new Type[] { typeof(double) });\r
+\r
+        public override void Emit(ILGenerator gen)\r
+        {\r
+            gen.Emit(OpCodes.Ldstr, "\t");\r
+            expr.Emit(gen); // will load a double on the stack\r
+            gen.Emit(OpCodes.Call, toStringMethod); // will convert number to string\r
+            gen.Emit(OpCodes.Call, concatenateMethod); // will concatenate them into one string\r
+        }\r
+    }\r
+}\r
index fe0246d..f5e1b7f 100644 (file)
@@ -66,6 +66,7 @@
     <Compile Include="SyntaxTree\Statement.cs" />\r
     <Compile Include="SyntaxTree\Subroutine.cs" />\r
     <Compile Include="SyntaxTree\Subtract.cs" />\r
+    <Compile Include="SyntaxTree\Tab.cs" />\r
     <Compile Include="SyntaxTree\VariableReference.cs" />\r
     <Compile Include="SyntaxTree\Print.cs" />\r
     <Compile Include="SyntaxTree\StringLiteral.cs" />\r
index 06e35f7..58334e2 100644 (file)
 900 A$="ZONE 1"\r
 910 B$="ZONE 2"\r
 920 PRINT A$,B$\r
-930 PRINT A$:,B$,A$
\ No newline at end of file
+930 PRINT A$:,B$,A$\r
+\r
+998 REM Scenarios involving TAB from II-68 (Modified to use\r
+999 REM floating point numbers and more complex expressions in some of the TAB commands)\r
+1000 A=23.5\r
+1010 B=48.6\r
+1020 MSG$="HELLO"\r
+1030 REM N > 28\r
+1040 PRINT TAB(4.9);MSG$;TAB(33.1);MSG$\r
+1050 REM Characters already printed <= N\r
+1060 PRINT A;TAB(10);B\r
+1070 REM Characters already print > N\r
+1080 PRINT TAB(3);A;TAB(1+2);B\r
+\r
+1100 A=326\r
+1110 B=79\r
+1111 C1 = 3\r
+1112 C2 = 5.1\r
+1120 PRINT A;TAB(C1*C2);B\r
+1130 PRINT A,B\r
+1140 PRINT A;TAB(15),B\r
+1150 PRINT TAB(C2);A;TAB(C2+1);B\r
+1160 PRINT A;TAB(3+2*20);B
\ No newline at end of file