parseExpression fixed for termination

Updated test cases to test this
This commit is contained in:
Tristan B. Kildaire 2021-03-15 10:46:00 +02:00
parent 0cc1b2e4ea
commit b7f77b8619
2 changed files with 50 additions and 38 deletions

View File

@ -281,58 +281,68 @@ public final class Parser
/* TODO: Implement expression parsing */
SymbolType symbol = getSymbolType(getCurrentToken());
/* If it is a number literal */
if (symbol == SymbolType.NUMBER_LITERAL)
/**
* We loop here until we hit something that closes
* an expression, in other words an expression
* appears in variable assignments which end with a
* `;`, they also appear in conditions which end in
* a `)`
*/
while (true)
{
/* Get the next token */
nextToken();
SymbolType symbol = getSymbolType(getCurrentToken());
/* Check if the token is a mathematical operator */
if (isMathOp(getCurrentToken()))
/* If it is a number literal */
if (symbol == SymbolType.NUMBER_LITERAL)
{
/* TODO:check math op */
/* Get the next token */
nextToken();
}
/* If it is a maths operator */
else if(isMathOp(getCurrentToken()))
{
/* TODO: Parse expression or pass arithemetic (I think latter) */
nextToken();
/* Parse an expression */
/* Parse expression */
parseExpression();
}
else
/* If it is a string literal */
else if (symbol == SymbolType.STRING_LITERAL)
{
/* Get the next token */
nextToken();
}
}
/* If it is a string literal */
else if (symbol == SymbolType.STRING_LITERAL)
{
/* Get the next token */
nextToken();
}
/* If it is an identifier */
else if (symbol == SymbolType.IDENTIFIER)
{
string identifier = getCurrentToken().getToken();
nextToken();
/* If the symbol is `(` then function call */
if (getSymbolType(getCurrentToken()) == SymbolType.LBRACE)
/* If it is an identifier */
else if (symbol == SymbolType.IDENTIFIER)
{
/* TODO: Implement function call parsing */
string identifier = getCurrentToken().getToken();
nextToken();
/* If the symbol is `(` then function call */
if (getSymbolType(getCurrentToken()) == SymbolType.LBRACE)
{
/* TODO: Implement function call parsing */
}
else
{
/* TODO: Leave the token here */
/* TODO: Just leave it, yeah */
}
}
/* TODO: Add the `)` and `;` detection here to terminate ourselves */
else if(symbol == SymbolType.SEMICOLON || symbol == SymbolType.RBRACE)
{
break;
}
else
{
/* TODO: Leave the token here */
/* TODO: Just leave it, yeah */
//gprintln("parseExpression(): NO MATCH", DebugType.ERROR);
/* TODO: Something isn't right here */
expect("Expected expression terminator ) or ;");
}
}
/* TODO: Add the `)` and `;` detection here to terminate ourselves */
else
{
gprintln("parseExpression(): NO MATCH", DebugType.ERROR);
/* TODO: Something isn't right here */
}
gprintln("parseExpression(): Leave", DebugType.WARNING);
}

View File

@ -40,7 +40,9 @@ void main(int hello, byte d)
print(1+1);
print(1+1);
if(1)
ubyte eish = 1+1;
if(1+1)
{
if(1)
{