add: SemanticToken
This commit is contained in:
parent
01cbcac8ef
commit
f6a4ad4a44
42
Canon.Core/Enums/SemanticEnums.cs
Normal file
42
Canon.Core/Enums/SemanticEnums.cs
Normal file
|
@ -0,0 +1,42 @@
|
|||
namespace Canon.Core.Enums;
|
||||
|
||||
public enum SemanticTokenType
|
||||
{
|
||||
Keyword,
|
||||
Number,
|
||||
Operator,
|
||||
Delimiter,
|
||||
Identifier,
|
||||
Character,
|
||||
}
|
||||
|
||||
public enum DelimiterType
|
||||
{
|
||||
Comma,
|
||||
Period,
|
||||
Colon,
|
||||
Semicolon,
|
||||
LeftParenthesis,
|
||||
RightParenthesis,
|
||||
LeftSquareBracket,
|
||||
RightBracket
|
||||
}
|
||||
|
||||
public enum KeywordType
|
||||
{
|
||||
Program,
|
||||
Const,
|
||||
Var,
|
||||
Procedure,
|
||||
Function,
|
||||
Begin,
|
||||
End,
|
||||
Array,
|
||||
Of,
|
||||
If,
|
||||
Then,
|
||||
Else,
|
||||
For,
|
||||
To,
|
||||
Do,
|
||||
}
|
143
Canon.Core/LexicalParser/SemanticToken.cs
Normal file
143
Canon.Core/LexicalParser/SemanticToken.cs
Normal file
|
@ -0,0 +1,143 @@
|
|||
namespace Canon.Core.LexicalParser;
|
||||
|
||||
using Enums;
|
||||
|
||||
public abstract class SemanticToken
|
||||
{
|
||||
public abstract SemanticTokenType TokenType { get; }
|
||||
|
||||
public required uint LinePos { get; init; }
|
||||
|
||||
public required uint CharacterPos { get; init; }
|
||||
|
||||
public required string LiteralValue { get; init; }
|
||||
}
|
||||
|
||||
public class CharacterSemanticToken : SemanticToken
|
||||
{
|
||||
public override SemanticTokenType TokenType => SemanticTokenType.Character;
|
||||
|
||||
public static bool TryParse(uint linePos, uint characterPos, LinkedListNode<char> now, out CharacterSemanticToken? token)
|
||||
{
|
||||
token = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public class DelimiterSemanticToken : SemanticToken
|
||||
{
|
||||
public override SemanticTokenType TokenType => SemanticTokenType.Delimiter;
|
||||
|
||||
public required DelimiterType DelimiterType { get; init; }
|
||||
|
||||
public static bool TryParse(uint linePos, uint characterPos, LinkedListNode<char> now,
|
||||
out DelimiterSemanticToken? token)
|
||||
{
|
||||
switch (now.Value)
|
||||
{
|
||||
case ',':
|
||||
token = new DelimiterSemanticToken
|
||||
{
|
||||
LinePos = linePos, CharacterPos = characterPos,
|
||||
LiteralValue = ",", DelimiterType = DelimiterType.Comma
|
||||
};
|
||||
return true;
|
||||
default:
|
||||
token = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class KeywordSemanticToken : SemanticToken
|
||||
{
|
||||
public override SemanticTokenType TokenType => SemanticTokenType.Keyword;
|
||||
|
||||
public required KeywordType KeywordType { get; init; }
|
||||
|
||||
public static bool TryParse(uint linePos, uint characterPos, LinkedListNode<char> now,
|
||||
out KeywordSemanticToken? token)
|
||||
{
|
||||
string buffer = new([now.Value]);
|
||||
|
||||
if (now.Next is null)
|
||||
{
|
||||
// As there is now keyword shorter than 2 characters.
|
||||
token = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
now = now.Next;
|
||||
buffer += now.Value;
|
||||
|
||||
switch (buffer)
|
||||
{
|
||||
case "do":
|
||||
token = new KeywordSemanticToken
|
||||
{
|
||||
LinePos = linePos,
|
||||
CharacterPos = characterPos,
|
||||
LiteralValue = "do",
|
||||
KeywordType = KeywordType.Do
|
||||
};
|
||||
return true;
|
||||
case "Of":
|
||||
token = new KeywordSemanticToken
|
||||
{
|
||||
LinePos = linePos,
|
||||
CharacterPos = characterPos,
|
||||
LiteralValue = "of",
|
||||
KeywordType = KeywordType.Of
|
||||
};
|
||||
return true;
|
||||
case "If":
|
||||
token = new KeywordSemanticToken
|
||||
{
|
||||
LinePos = linePos,
|
||||
CharacterPos = characterPos,
|
||||
LiteralValue = "if",
|
||||
KeywordType = KeywordType.If
|
||||
};
|
||||
return true;
|
||||
}
|
||||
|
||||
token = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public class OperatorSemanticToken : SemanticToken
|
||||
{
|
||||
public override SemanticTokenType TokenType => SemanticTokenType.Operator;
|
||||
|
||||
public static bool TryParse(uint linePos, uint characterPos, LinkedListNode<char> now,
|
||||
out OperatorSemanticToken? token)
|
||||
{
|
||||
token = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public class NumberSemanticToken : SemanticToken
|
||||
{
|
||||
public override SemanticTokenType TokenType => SemanticTokenType.Number;
|
||||
|
||||
public static bool TryParse(uint linePos, uint characterPos, LinkedListNode<char> now,
|
||||
out NumberSemanticToken? token)
|
||||
{
|
||||
token = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public class IdentifierSemanticToken : SemanticToken
|
||||
{
|
||||
public override SemanticTokenType TokenType => SemanticTokenType.Identifier;
|
||||
|
||||
public static bool TryParse(uint linePos, uint characterPos, LinkedListNode<char> now,
|
||||
out IdentifierSemanticToken? token)
|
||||
{
|
||||
token = null;
|
||||
return false;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user