Migrated symbol code from parser.d to symbols.d

This commit is contained in:
Tristan B. Velloza Kildaire 2021-03-03 16:52:35 +02:00
parent 89b52ec81e
commit f9b68b9658
2 changed files with 102 additions and 106 deletions

View File

@ -3,7 +3,7 @@ module compiler.parser;
import gogga;
import std.conv : to;
import std.string : isNumeric, cmp;
import compiler.symbols : SymbolType;
import compiler.symbols;
import compiler.lexer : Token;
import core.stdc.stdlib;
@ -16,110 +16,6 @@ public final class Parser
private Token currentToken;
private ulong tokenPtr;
public static bool isType(string tokenStr)
{
return cmp(tokenStr, "byte") == 0 || cmp(tokenStr, "ubyte") == 0
|| cmp(tokenStr, "short") == 0 || cmp(tokenStr, "ushort") == 0
|| cmp(tokenStr, "int") == 0 || cmp(tokenStr, "uint") == 0
|| cmp(tokenStr, "long") == 0 || cmp(tokenStr, "ulong") == 0
|| cmp(tokenStr, "void") == 0 ;
}
private static bool isAlpha(string token)
{
foreach (char character; token)
{
if ((character >= 65 && character <= 90) || (character >= 97 && character <= 122))
{
}
else
{
return false;
}
}
return true;
}
public static SymbolType getSymbolType(Token tokenIn)
{
string token = tokenIn.getToken();
/* TODO: Get symbol type of token */
/* Character literal check */
if (token[0] == '\'')
{
/* TODO: Add escape sequnece support */
if (token[2] == '\'')
{
return SymbolType.CHARACTER_LITERAL;
}
}
/* String literal check */
else if (token[0] == '\"' && token[token.length - 1] == '\"')
{
return SymbolType.STRING_LITERAL;
}
/* Number literal check */
else if (isNumeric(token))
{
return SymbolType.NUMBER_LITERAL;
}
/* Type name (TODO: Track user-defined types) */
else if (isType(token))
{
return SymbolType.TYPE;
}
/* Identifier check (TODO: Track vars) */
else if (isAlpha(token))
{
return SymbolType.IDENTIFIER;
}
/* Semi-colon `;` check */
else if (token[0] == ';')
{
return SymbolType.SEMICOLON;
}
/* Assign `=` check */
else if (token[0] == '=')
{
return SymbolType.ASSIGN;
}
/* Left-brace check */
else if (token[0] == '(')
{
return SymbolType.LBRACE;
}
/* Right-brace check */
else if (token[0] == ')')
{
return SymbolType.RBRACE;
}
/* Left-curly check */
else if (token[0] == '{')
{
return SymbolType.OCURLY;
}
/* Right-curly check */
else if (token[0] == '}')
{
return SymbolType.CCURLY;
}
/* Comma check */
else if (token[0] == ',')
{
return SymbolType.COMMA;
}
return SymbolType.UNKNOWN;
}
public static void expect(SymbolType symbol, Token token)
{
/* TODO: Do checking here to see if token is a type of given symbol */

View File

@ -1,6 +1,8 @@
module compiler.symbols;
import compiler.lexer : Token;
import std.conv : to;
import std.string : isNumeric, cmp;
/**
* All allowed symbols
@ -29,7 +31,7 @@ public class Symbol
/* Token */
private Token token;
private SymbolType symbolType;
this(SymbolType symbolType, Token token)
{
this.token = token;
@ -38,3 +40,101 @@ public class Symbol
}
/* TODO: Later build classes specific to symbol */
public static bool isType(string tokenStr)
{
return cmp(tokenStr, "byte") == 0 || cmp(tokenStr, "ubyte") == 0
|| cmp(tokenStr, "short") == 0 || cmp(tokenStr, "ushort") == 0
|| cmp(tokenStr, "int") == 0 || cmp(tokenStr, "uint") == 0 || cmp(tokenStr,
"long") == 0 || cmp(tokenStr, "ulong") == 0 || cmp(tokenStr, "void") == 0;
}
private static bool isAlpha(string token)
{
foreach (char character; token)
{
if ((character >= 65 && character <= 90) || (character >= 97 && character <= 122))
{
}
else
{
return false;
}
}
return true;
}
public static SymbolType getSymbolType(Token tokenIn)
{
string token = tokenIn.getToken();
/* TODO: Get symbol type of token */
/* Character literal check */
if (token[0] == '\'')
{
/* TODO: Add escape sequnece support */
if (token[2] == '\'')
{
return SymbolType.CHARACTER_LITERAL;
}
}
/* String literal check */
else if (token[0] == '\"' && token[token.length - 1] == '\"')
{
return SymbolType.STRING_LITERAL;
}
/* Number literal check */
else if (isNumeric(token))
{
return SymbolType.NUMBER_LITERAL;
}
/* Type name (TODO: Track user-defined types) */
else if (isType(token))
{
return SymbolType.TYPE;
}
/* Identifier check (TODO: Track vars) */
else if (isAlpha(token))
{
return SymbolType.IDENTIFIER;
}
/* Semi-colon `;` check */
else if (token[0] == ';')
{
return SymbolType.SEMICOLON;
}
/* Assign `=` check */
else if (token[0] == '=')
{
return SymbolType.ASSIGN;
}
/* Left-brace check */
else if (token[0] == '(')
{
return SymbolType.LBRACE;
}
/* Right-brace check */
else if (token[0] == ')')
{
return SymbolType.RBRACE;
}
/* Left-curly check */
else if (token[0] == '{')
{
return SymbolType.OCURLY;
}
/* Right-curly check */
else if (token[0] == '}')
{
return SymbolType.CCURLY;
}
/* Comma check */
else if (token[0] == ',')
{
return SymbolType.COMMA;
}
return SymbolType.UNKNOWN;
}