Add equal ('==') operator to both identifiers and bools

This commit is contained in:
Bartłomiej Pluta
2019-07-10 15:52:56 +02:00
parent e008be7952
commit d6fb101337
6 changed files with 35 additions and 11 deletions

View File

@@ -17,8 +17,8 @@ class BoolLiteralNode(LiteralNode, AccessNode, RelationOperatorNode):
@classmethod @classmethod
def _parse(cls, input): def _parse(cls, input):
x = Parser.oneOf( x = Parser.oneOf(
cls.relationParser(),
cls.accessParser(), cls.accessParser(),
cls.relationParser(),
cls.literalParser() cls.literalParser()
)(input) )(input)
return x return x

View File

@@ -52,12 +52,13 @@ class ExpressionNode(Node):
def _expressionParser(cls): def _expressionParser(cls):
from smnp.ast.node.bool import BoolLiteralNode from smnp.ast.node.bool import BoolLiteralNode
from smnp.ast.node.identifier import IdentifierNode
return Parser.oneOf( return Parser.oneOf(
#IntegerLiteralNode.parse, #IntegerLiteralNode.parse,
#StringLiteralNode.parse, #StringLiteralNode.parse,
#NoteLiteralNode.parse, #NoteLiteralNode.parse,
BoolLiteralNode.parse, BoolLiteralNode.parse,
#IdentifierNode.parse, IdentifierNode.parse,
#MapNode.parse, #MapNode.parse,
#ListNode.parse, #ListNode.parse,
#TypeNode.parse, #TypeNode.parse,

View File

@@ -2,17 +2,34 @@ from smnp.ast.node.access import AccessNode
from smnp.ast.node.assignment import AssignmentNode from smnp.ast.node.assignment import AssignmentNode
from smnp.ast.node.expression import ExpressionNode from smnp.ast.node.expression import ExpressionNode
from smnp.ast.node.invocation import FunctionCallNode, ArgumentsListNode from smnp.ast.node.invocation import FunctionCallNode, ArgumentsListNode
from smnp.ast.node.relation import RelationOperatorNode
from smnp.ast.parser import Parser from smnp.ast.parser import Parser
from smnp.token.type import TokenType from smnp.token.type import TokenType
class IdentifierNode(AccessNode): class IdentifierNode(AccessNode, RelationOperatorNode):
def __init__(self, pos): def __init__(self, pos):
super().__init__(pos) super().__init__(pos)
del self.children[1] del self.children[1]
@classmethod @classmethod
def _literalParser(cls): def _parse(cls, input):
return Parser.oneOf(
cls.accessParser(),
cls.relationParser(),
cls.literalParser()
)(input)
@classmethod
def _accessLhs(cls):
return cls.literalParser()
@classmethod
def _relationLhs(cls):
return cls.literalParser()
@classmethod
def literalParser(cls):
return Parser.oneOf( return Parser.oneOf(
IdentifierNode.functionCallParser(), IdentifierNode.functionCallParser(),
IdentifierNode._assignmentParser(), IdentifierNode._assignmentParser(),

View File

@@ -56,4 +56,11 @@ class RelationOperatorNode(ExpressionNode):
@staticmethod @staticmethod
def _relationRhs(): def _relationRhs():
# TODO doAssert # TODO doAssert
return ExpressionNode.parse from smnp.ast.node.bool import BoolLiteralNode
from smnp.ast.node.identifier import IdentifierNode
return Parser.oneOf(
BoolLiteralNode.accessParser(),
BoolLiteralNode.literalParser(),
IdentifierNode.literalParser()
)

View File

@@ -105,7 +105,7 @@ class Parser:
oneAtLeast = True oneAtLeast = True
right = rightParser(input) right = rightParser(input)
left = ParseResult.OK(createNode(left.node, operator.node, right.node)) left = ParseResult.OK(createNode(left.node, operator.node, right.node))
operator = Parser.terminalParser(operatorTokenType)(input) operator = Parser.terminalParser(operatorTokenType, lambda val, pos: OperatorNode.withChildren([val], pos))(input)
if oneAtLeast: if oneAtLeast:
return left return left

View File

@@ -1,14 +1,13 @@
from smnp.ast.node.bool import BoolLiteralNode import sys
from smnp.error.base import SmnpException from smnp.error.base import SmnpException
from smnp.token.tokenizer import tokenize from smnp.program.interpreter import Interpreter
def main(): def main():
try: try:
tokens = tokenize([ "true == true == false.not.not" ])
BoolLiteralNode.parse(tokens).node.print()
#stdLibraryEnv = loadStandardLibrary() #stdLibraryEnv = loadStandardLibrary()
#Interpreter.interpretFile(sys.argv[1], printTokens=False, printAst=True, baseEnvironment=None) Interpreter.interpretFile(sys.argv[1], printTokens=False, printAst=True, baseEnvironment=None)
except SmnpException as e: except SmnpException as e:
print(e.message()) print(e.message())