102 lines
1.8 KiB
Plaintext
102 lines
1.8 KiB
Plaintext
/*
|
|
Example code: FigFig
|
|
|
|
Tokenizer.fig
|
|
Copyright (C) 2020-2026 PuqiAR
|
|
|
|
*/
|
|
|
|
import token {Token, TokenType};
|
|
|
|
func list_contains(lst: List, value: Any) -> Bool
|
|
{
|
|
for var i := 0; i < lst.length(); i += 1
|
|
{
|
|
if lst[i] == value
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
func isspace(c: String) -> Bool
|
|
{
|
|
return c == " " || c == "\n" || c == "\t";
|
|
}
|
|
|
|
func isalpha(c: String) -> Bool
|
|
{
|
|
const alb := [
|
|
"a", "b", "c", "d",
|
|
"e", "f", "g", "h",
|
|
"i", "j", "k", "l",
|
|
"m", "n", "o", "p",
|
|
"q", "r", "s", "t",
|
|
"u", "v", "w", "x",
|
|
"y", "z",
|
|
"A", "B", "C", "D",
|
|
"E", "F", "G", "H",
|
|
"I", "J", "K", "L",
|
|
"M", "N", "O", "P",
|
|
"Q", "R", "S", "T",
|
|
"U", "V", "W", "X",
|
|
"Y", "Z"
|
|
];
|
|
return list_contains(alb, c);
|
|
}
|
|
|
|
|
|
public struct Tokenizer
|
|
{
|
|
src: String = "";
|
|
idx: Int = 0;
|
|
|
|
func next() -> Null
|
|
{
|
|
idx += 1;
|
|
}
|
|
|
|
func hasNext() -> Bool
|
|
{
|
|
return idx < src.length();
|
|
}
|
|
|
|
func produce() -> String
|
|
{
|
|
const tmp := src[idx];
|
|
idx += 1;
|
|
return tmp;
|
|
}
|
|
|
|
func current() -> String
|
|
{
|
|
return src[idx];
|
|
}
|
|
|
|
public func TokenizeAll() -> List
|
|
{
|
|
var output := [];
|
|
|
|
const push := func (tok: Token) => output.push(tok);
|
|
|
|
while hasNext()
|
|
{
|
|
while hasNext() && isspace(current())
|
|
{
|
|
next();
|
|
}
|
|
if isalpha(current())
|
|
{
|
|
var identi := "";
|
|
while hasNext() && isalpha(current())
|
|
{
|
|
identi += produce();
|
|
}
|
|
push(new Token{identi, TokenType.Identifier});
|
|
}
|
|
}
|
|
|
|
return output;
|
|
}
|
|
} |