From 799c3fd89c8801d91b1f33e5eea0f632393eb67e Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Tue, 14 Jun 2022 23:06:02 +0200 Subject: [PATCH] Put + operator inbetween --- source/elna/lexer.d | 4 +-- source/elna/parser.d | 71 +++++++++++++++++++++------------------ tests/const_list.eln | 2 +- tests/left_nested_sum.eln | 2 +- tests/sum.eln | 2 +- tests/sums.eln | 2 +- 6 files changed, 45 insertions(+), 38 deletions(-) diff --git a/source/elna/lexer.d b/source/elna/lexer.d index c47aae0..69ae141 100644 --- a/source/elna/lexer.d +++ b/source/elna/lexer.d @@ -14,7 +14,7 @@ struct Token enum Type { number, - subroutine, // Operator. + operator, let, identifier, equals, @@ -236,7 +236,7 @@ Array!Token lex(char[] buffer) @nogc } else if (source.front == '+') // Multi-character, random special characters. { - tokens.insertBack(Token(Token.Type.subroutine, source.position)); + tokens.insertBack(Token(Token.Type.operator, source.position)); source.popFront; } else if (source.front == '\n') diff --git a/source/elna/parser.d b/source/elna/parser.d index 28a090b..f1f1299 100644 --- a/source/elna/parser.d +++ b/source/elna/parser.d @@ -59,46 +59,22 @@ class Subroutine : Expression Expression lhs, rhs; } -private Result!Expression parseExpression(ref Array!(Token).Range tokens) @nogc -in (!tokens.empty, "Expected expression, got end of stream") +private Result!Expression parseFactor(ref Array!Token.Range tokens) @nogc +in (!tokens.empty, "Expected factor, got end of stream") { - if (tokens.front.ofType(Token.Type.number)) - { - auto number = MmapPool.instance.make!Number; - number.value = tokens.front.value!(Token.Type.number); - tokens.popFront; - return Result!Expression(number); - } - else if (tokens.front.ofType(Token.Type.identifier)) + if (tokens.front.ofType(Token.Type.identifier)) { auto variable = MmapPool.instance.make!Variable; variable.identifier = tokens.front.value!(Token.Type.identifier); tokens.popFront; return Result!Expression(variable); } - else if (tokens.front.ofType(Token.Type.subroutine)) + else if (tokens.front.ofType(Token.Type.number)) { - auto subroutine = MmapPool.instance.make!Subroutine; + auto number = MmapPool.instance.make!Number; + number.value = tokens.front.value!(Token.Type.number); tokens.popFront; - auto expression = parseExpression(tokens); - if (expression.valid) - { - subroutine.lhs = expression.result; - } - else - { - return Result!Expression("Expected left-hand side to be an expression", tokens.front.position); - } - expression = parseExpression(tokens); - if (expression.valid) - { - subroutine.rhs = expression.result; - } - else - { - return Result!Expression("Expected left-hand side to be an expression", tokens.front.position); - } - return Result!Expression(subroutine); + return Result!Expression(number); } else if (tokens.front.ofType(Token.Type.leftParen)) { @@ -109,7 +85,38 @@ in (!tokens.empty, "Expected expression, got end of stream") tokens.popFront; return expression; } - return Result!Expression("Expected an expression", tokens.front.position); + return Result!Expression("Expected a factor", tokens.front.position); +} + +private Result!Expression parseTerm(ref Array!(Token).Range tokens) @nogc +{ + return parseFactor(tokens); +} + +private Result!Expression parseExpression(ref Array!(Token).Range tokens) @nogc +in (!tokens.empty, "Expected expression, got end of stream") +{ + auto term = parseTerm(tokens); + if (!term.valid || tokens.empty || !tokens.front.ofType(Token.Type.operator)) + { + return term; + } + tokens.popFront; + + auto operator = MmapPool.instance.make!Subroutine; + auto expression = parseExpression(tokens); + + if (expression.valid) + { + operator.lhs = term.result; + operator.rhs = expression.result; + + return Result!Expression(operator); + } + else + { + return Result!Expression("Expected right-hand side to be an expression", tokens.front.position); + } } private Result!Definition parseDefinition(ref Array!Token.Range tokens) @nogc diff --git a/tests/const_list.eln b/tests/const_list.eln index 18a6711..375627f 100644 --- a/tests/const_list.eln +++ b/tests/const_list.eln @@ -1,3 +1,3 @@ const a = 1, b = 2; -! + a b +! a + b . diff --git a/tests/left_nested_sum.eln b/tests/left_nested_sum.eln index 93fb29b..aae2a77 100644 --- a/tests/left_nested_sum.eln +++ b/tests/left_nested_sum.eln @@ -1,2 +1,2 @@ -! + (+ 3 4) 1 +! (3 + 4) + 1 . diff --git a/tests/sum.eln b/tests/sum.eln index 12343f0..6b4e720 100644 --- a/tests/sum.eln +++ b/tests/sum.eln @@ -1,2 +1,2 @@ -! + 1 7 +! 1 + 7 . diff --git a/tests/sums.eln b/tests/sums.eln index bf80ecc..59586e9 100644 --- a/tests/sums.eln +++ b/tests/sums.eln @@ -1,2 +1,2 @@ -! + 1 (+ 3 4) +! 1 + (3 + 4) .