Put + operator inbetween
This commit is contained in:
parent
fbbabe115f
commit
799c3fd89c
@ -14,7 +14,7 @@ struct Token
|
|||||||
enum Type
|
enum Type
|
||||||
{
|
{
|
||||||
number,
|
number,
|
||||||
subroutine, // Operator.
|
operator,
|
||||||
let,
|
let,
|
||||||
identifier,
|
identifier,
|
||||||
equals,
|
equals,
|
||||||
@ -236,7 +236,7 @@ Array!Token lex(char[] buffer) @nogc
|
|||||||
}
|
}
|
||||||
else if (source.front == '+') // Multi-character, random special characters.
|
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;
|
source.popFront;
|
||||||
}
|
}
|
||||||
else if (source.front == '\n')
|
else if (source.front == '\n')
|
||||||
|
@ -59,46 +59,22 @@ class Subroutine : Expression
|
|||||||
Expression lhs, rhs;
|
Expression lhs, rhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Result!Expression parseExpression(ref Array!(Token).Range tokens) @nogc
|
private Result!Expression parseFactor(ref Array!Token.Range tokens) @nogc
|
||||||
in (!tokens.empty, "Expected expression, got end of stream")
|
in (!tokens.empty, "Expected factor, got end of stream")
|
||||||
{
|
{
|
||||||
if (tokens.front.ofType(Token.Type.number))
|
if (tokens.front.ofType(Token.Type.identifier))
|
||||||
{
|
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
auto variable = MmapPool.instance.make!Variable;
|
auto variable = MmapPool.instance.make!Variable;
|
||||||
variable.identifier = tokens.front.value!(Token.Type.identifier);
|
variable.identifier = tokens.front.value!(Token.Type.identifier);
|
||||||
tokens.popFront;
|
tokens.popFront;
|
||||||
return Result!Expression(variable);
|
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;
|
tokens.popFront;
|
||||||
auto expression = parseExpression(tokens);
|
return Result!Expression(number);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
else if (tokens.front.ofType(Token.Type.leftParen))
|
else if (tokens.front.ofType(Token.Type.leftParen))
|
||||||
{
|
{
|
||||||
@ -109,7 +85,38 @@ in (!tokens.empty, "Expected expression, got end of stream")
|
|||||||
tokens.popFront;
|
tokens.popFront;
|
||||||
return expression;
|
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
|
private Result!Definition parseDefinition(ref Array!Token.Range tokens) @nogc
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
const a = 1, b = 2;
|
const a = 1, b = 2;
|
||||||
! + a b
|
! a + b
|
||||||
.
|
.
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
! + (+ 3 4) 1
|
! (3 + 4) + 1
|
||||||
.
|
.
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
! + 1 7
|
! 1 + 7
|
||||||
.
|
.
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
! + 1 (+ 3 4)
|
! 1 + (3 + 4)
|
||||||
.
|
.
|
||||||
|
Loading…
Reference in New Issue
Block a user