Migrated symbol code from parser.d to symbols.d
This commit is contained in:
parent
89b52ec81e
commit
f9b68b9658
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue