Implement IF statement
authorNick Downing <nick@ndcode.org>
Sun, 15 May 2022 07:09:55 +0000 (17:09 +1000)
committerNick Downing <nick@ndcode.org>
Sun, 15 May 2022 07:09:55 +0000 (17:09 +1000)
applesoft_basic.t
applesoft_basic.y
test.bas

index ae3e9ab..2661a93 100644 (file)
@@ -53,6 +53,7 @@ class NodeStatementPrint: NodeStatement {
   bool semicolon;
 };
 class NodeStatementGoto: NodeStatement;
+class NodeStatementIf: NodeStatement;
 class NodeExpression: Node;
 class NodeExpressionOr: NodeExpression;
 class NodeExpressionAnd: NodeExpression;
@@ -173,7 +174,7 @@ def execute(self, context):
       if value < 0.:
         sign = '-'
         value = -value
-      if value >= .01 and value < 999999999.2:
+      if value == 0. or (value >= .01 and value < 999999999.2):
         if value >= 100000000.:
           value = f'{value:.0f}.'
         elif value >= 10000000.:
@@ -221,6 +222,12 @@ def execute(self, context):
       break
   else:
     raise Exception(f'?UNDEF\'D STATEMENT ERROR IN {context.line_number():d}')
+@method(NodeStatementIf)
+def execute(self, context):
+  value = self.children[0].evaluate(context)
+  if value == '' or value == 0.:
+    context.i += 1
+    context.j = 1
 del execute
 
 @method(NodeExpression)
index c2a5698..2285491 100644 (file)
@@ -158,6 +158,8 @@ statement_opt
   | %space (?E{t_def.NodeStatementPrint, semicolon = False}KEYWORD_PRINT print_expression_list0)
   | %space (?E{t_def.NodeStatementPrint, semicolon = True}KEYWORD_PRINT print_expression_list1)
   | %space (?E{t_def.NodeStatementGoto}KEYWORD_GOTO INT_LITERAL)
+  | %space (?E{t_def.NodeStatementIf}KEYWORD_IF expression KEYWORD_THEN)
+  | %space (?E{t_def.NodeStatementIf}KEYWORD_IF expression KEYWORD_THEN) %space (?E{t_def.NodeStatementGoto}INT_LITERAL)
   ;
 
 print_expression_list0
index 18ed223..179be32 100644 (file)
--- a/test.bas
+++ b/test.bas
@@ -1,4 +1,4 @@
 10 I$="PI":I%=-3.141:I=3.141
 20 PRINT I$" "I%" "I
 30 I%=I%+1
-40 GOTO 20
+40 IF I%<10 THEN 20