class NodeStatementVTab: NodeStatement;
class NodeStatementGet: NodeStatement;
class NodeStatementInput: NodeStatement;
-class NodeExpression: Node;
-class NodeExpressionOr: NodeExpression;
-class NodeExpressionAnd: NodeExpression;
-class NodeExpressionLT: NodeExpression;
-class NodeExpressionEqual: NodeExpression;
-class NodeExpressionGT: NodeExpression;
-class NodeExpressionGE: NodeExpression;
-class NodeExpressionLE: NodeExpression;
-class NodeExpressionNE: NodeExpression;
-class NodeExpressionAdd: NodeExpression;
-class NodeExpressionSubtract: NodeExpression;
-class NodeExpressionMultiply: NodeExpression;
-class NodeExpressionDivide: NodeExpression;
-class NodeExpressionPower: NodeExpression;
-class NodeExpressionSign: NodeExpression {
+class NodeRValue: Node;
+class NodeRValueOr: NodeRValue;
+class NodeRValueAnd: NodeRValue;
+class NodeRValueLT: NodeRValue;
+class NodeRValueEqual: NodeRValue;
+class NodeRValueGT: NodeRValue;
+class NodeRValueGE: NodeRValue;
+class NodeRValueLE: NodeRValue;
+class NodeRValueNE: NodeRValue;
+class NodeRValueAdd: NodeRValue;
+class NodeRValueSubtract: NodeRValue;
+class NodeRValueMultiply: NodeRValue;
+class NodeRValueDivide: NodeRValue;
+class NodeRValuePower: NodeRValue;
+class NodeRValueSign: NodeRValue {
int sign;
};
-class NodeExpressionNot: NodeExpression;
-class NodeExpressionIntLiteral: NodeExpression;
-class NodeExpressionFloatLiteral: NodeExpression;
-class NodeExpressionStrLiteral: NodeExpression;
-class NodeExpressionVariable: NodeExpression;
-class NodeExpressionStrDollar: NodeExpression;
-class NodeExpressionVal: NodeExpression;
+class NodeRValueNot: NodeRValue;
+class NodeRValueIntLiteral: NodeRValue;
+class NodeRValueFloatLiteral: NodeRValue;
+class NodeRValueStrLiteral: NodeRValue;
+class NodeRValueVariable: NodeRValue;
+class NodeRValueStrDollar: NodeRValue;
+class NodeRValueVal: NodeRValue;
%%
def execute(self, context):
name = self.children[0].str_value
if name[-1] == '$':
- value = self.children[1].evaluate_str(context)
+ value = self.children[1].get_str(context)
else:
- value = self.children[1].evaluate_float(context)
+ value = self.children[1].get_float(context)
if name[-1] == '$':
value = data_types.cint(value)
context.find_variable(name).value = value
@method(NodeStatementPrint)
def execute(self, context):
for i in self.children:
- value = i.evaluate(context)
+ value = i.get(context)
if isinstance(value, float):
value = data_types.str_dollar(value)
apple_io._print(value)
context.j = 1
@method(NodeStatementIf)
def execute(self, context):
- value = self.children[0].evaluate(context)
+ value = self.children[0].get(context)
if value == '' or value == 0.:
context.i += 1
context.j = 1
)
variable = context.find_variable(name)
- variable.value = self.children[1].evaluate_float(context)
- end = self.children[2].evaluate_float(context)
+ variable.value = self.children[1].get_float(context)
+ end = self.children[2].get_float(context)
step = (
- self.children[3].evaluate_float(context)
+ self.children[3].get_float(context)
if len(self.children) >= 4 else
1.
)
apple_io.flash()
@method(NodeStatementHTab)
def execute(self, context):
- value = self.children[0].evaluate_float(context)
+ value = self.children[0].get_float(context)
apple_io.htab(data_types.cint(value))
@method(NodeStatementVTab)
def execute(self, context):
- value = self.children[0].evaluate_float(context)
+ value = self.children[0].get_float(context)
apple_io.vtab(data_types.cint(value))
@method(NodeStatementGet)
def execute(self, context):
context.find_variable(name).value = value
del execute
-@method(NodeExpression)
-def evaluate(self, context):
+@method(NodeRValue)
+def get(self, context):
raise NotImplementedError()
-@method(NodeExpressionOr)
-def evaluate(self, context):
- value0 = self.children[0].evaluate_float(context)
- value1 = self.children[1].evaluate_float(context)
+@method(NodeRValueOr)
+def get(self, context):
+ value0 = self.children[0].get_float(context)
+ value1 = self.children[1].get_float(context)
return float(value0 != 0. or value1 != 0.)
-@method(NodeExpressionAnd)
-def evaluate(self, context):
- value0 = self.children[0].evaluate_float(context)
- value1 = self.children[1].evaluate_float(context)
+@method(NodeRValueAnd)
+def get(self, context):
+ value0 = self.children[0].get_float(context)
+ value1 = self.children[1].get_float(context)
return float(value0 != 0. and value1 != 0.)
-@method(NodeExpressionLT)
-def evaluate(self, context):
- value0 = self.children[0].evaluate(context)
+@method(NodeRValueLT)
+def get(self, context):
+ value0 = self.children[0].get(context)
value1 = (
- self.children[1].evaluate_float(context)
+ self.children[1].get_float(context)
if isinstance(value0, float) else
- self.children[1].evaluate_str(context)
+ self.children[1].get_str(context)
)
return float(value0 < value1)
-@method(NodeExpressionEqual)
-def evaluate(self, context):
- value0 = self.children[0].evaluate(context)
+@method(NodeRValueEqual)
+def get(self, context):
+ value0 = self.children[0].get(context)
value1 = (
- self.children[1].evaluate_float(context)
+ self.children[1].get_float(context)
if isinstance(value0, float) else
- self.children[1].evaluate_str(context)
+ self.children[1].get_str(context)
)
return float(value0 == value1)
-@method(NodeExpressionGT)
-def evaluate(self, context):
- value0 = self.children[0].evaluate(context)
+@method(NodeRValueGT)
+def get(self, context):
+ value0 = self.children[0].get(context)
value1 = (
- self.children[1].evaluate_float(context)
+ self.children[1].get_float(context)
if isinstance(value0, float) else
- self.children[1].evaluate_str(context)
+ self.children[1].get_str(context)
)
return float(value0 > value1)
-@method(NodeExpressionGE)
-def evaluate(self, context):
- value0 = self.children[0].evaluate(context)
+@method(NodeRValueGE)
+def get(self, context):
+ value0 = self.children[0].get(context)
value1 = (
- self.children[1].evaluate_float(context)
+ self.children[1].get_float(context)
if isinstance(value0, float) else
- self.children[1].evaluate_str(context)
+ self.children[1].get_str(context)
)
return float(value0 >= value1)
-@method(NodeExpressionLE)
-def evaluate(self, context):
- value0 = self.children[0].evaluate(context)
+@method(NodeRValueLE)
+def get(self, context):
+ value0 = self.children[0].get(context)
value1 = (
- self.children[1].evaluate_float(context)
+ self.children[1].get_float(context)
if isinstance(value0, float) else
- self.children[1].evaluate_str(context)
+ self.children[1].get_str(context)
)
return float(value0 <= value1)
-@method(NodeExpressionNE)
-def evaluate(self, context):
- value0 = self.children[0].evaluate(context)
+@method(NodeRValueNE)
+def get(self, context):
+ value0 = self.children[0].get(context)
value1 = (
- self.children[1].evaluate_float(context)
+ self.children[1].get_float(context)
if isinstance(value0, float) else
- self.children[1].evaluate_str(context)
+ self.children[1].get_str(context)
)
return float(value0 != value1)
-@method(NodeExpressionAdd)
-def evaluate(self, context):
- value0 = self.children[0].evaluate(context)
+@method(NodeRValueAdd)
+def get(self, context):
+ value0 = self.children[0].get(context)
value1 = (
- self.children[1].evaluate_float(context)
+ self.children[1].get_float(context)
if isinstance(value0, float) else
- self.children[1].evaluate_str(context)
+ self.children[1].get_str(context)
)
return value0 + value1
-@method(NodeExpressionSubtract)
-def evaluate(self, context):
- value0 = self.children[0].evaluate_float(context)
- value1 = self.children[1].evaluate_float(context)
+@method(NodeRValueSubtract)
+def get(self, context):
+ value0 = self.children[0].get_float(context)
+ value1 = self.children[1].get_float(context)
return value0 - value1
-@method(NodeExpressionMultiply)
-def evaluate(self, context):
- value0 = self.children[0].evaluate_float(context)
- value1 = self.children[1].evaluate_float(context)
+@method(NodeRValueMultiply)
+def get(self, context):
+ value0 = self.children[0].get_float(context)
+ value1 = self.children[1].get_float(context)
return value0 * value1
-@method(NodeExpressionDivide)
-def evaluate(self, context):
- value0 = self.children[0].evaluate_float(context)
- value1 = self.children[1].evaluate_float(context)
+@method(NodeRValueDivide)
+def get(self, context):
+ value0 = self.children[0].get_float(context)
+ value1 = self.children[1].get_float(context)
return value0 / value1
-@method(NodeExpressionPower)
-def evaluate(self, context):
- value0 = self.children[0].evaluate_float(context)
- value1 = self.children[1].evaluate_float(context)
+@method(NodeRValuePower)
+def get(self, context):
+ value0 = self.children[0].get_float(context)
+ value1 = self.children[1].get_float(context)
return value0 ** value1
-@method(NodeExpressionSign)
-def evaluate(self, context):
- value = self.children[0].evaluate_float(context)
+@method(NodeRValueSign)
+def get(self, context):
+ value = self.children[0].get_float(context)
return self.sign * value
-@method(NodeExpressionNot)
-def evaluate(self, context):
- value = self.children[0].evaluate_float(context)
+@method(NodeRValueNot)
+def get(self, context):
+ value = self.children[0].get_float(context)
return float(value == 0.)
-@method(NodeExpressionIntLiteral)
-def evaluate(self, context):
+@method(NodeRValueIntLiteral)
+def get(self, context):
return float(self.children[0].int_value)
-@method(NodeExpressionFloatLiteral)
-def evaluate(self, context):
+@method(NodeRValueFloatLiteral)
+def get(self, context):
return self.children[0].float_value
-@method(NodeExpressionStrLiteral)
-def evaluate(self, context):
+@method(NodeRValueStrLiteral)
+def get(self, context):
return self.children[0].text[0]
-@method(NodeExpressionVariable)
-def evaluate(self, context):
+@method(NodeRValueVariable)
+def get(self, context):
name = self.children[0].str_value
return context.find_variable(name).value
-@method(NodeExpressionStrDollar)
-def evaluate(self, context):
- value = self.children[0].evaluate_float(context)
+@method(NodeRValueStrDollar)
+def get(self, context):
+ value = self.children[0].get_float(context)
return data_types.str_dollar(value)
-@method(NodeExpressionVal)
-def evaluate(self, context):
- value = self.children[0].evaluate_str(context)
+@method(NodeRValueVal)
+def get(self, context):
+ value = self.children[0].get_str(context)
return data_types.val(value)
-del evaluate
+del get
-@method(NodeExpression)
-def evaluate_float(self, context):
- value = self.evaluate(context)
+@method(NodeRValue)
+def get_float(self, context):
+ value = self.get(context)
if not isinstance(value, float):
raise Exception(
f'?TYPE MISMATCH ERROR IN {context.line_number():d}'
)
return value
-del evaluate_float
+del get_float
-@method(NodeExpression)
-def evaluate_str(self, context):
- value = self.evaluate(context)
+@method(NodeRValue)
+def get_str(self, context):
+ value = self.get(context)
if not isinstance(value, str):
raise Exception(
f'?TYPE MISMATCH ERROR IN {context.line_number():d}'
)
return value
-del evaluate_str
+del get_str