tokenize method
Executes lexical analysis
Implementation
List<LatexToken> tokenize() {
// HLog.d(_tag, "开始词法分析,输入长度: ${input.length}");
while (_position < input.length) {
final char = _peek();
if (char == null) break;
switch (char) {
case '\\':
_handleBackslash();
break;
case '%':
_handleComment();
break;
case '~':
final start = _position;
_advance();
_tokens.add(
WhitespaceToken("\u00A0", range: SourceRange(start, _position)),
);
break;
case '{':
final start = _position;
_advance();
_tokens.add(LeftBraceToken(range: SourceRange(start, _position)));
break;
case '}':
final start = _position;
_advance();
_tokens.add(RightBraceToken(range: SourceRange(start, _position)));
break;
case '[':
final start = _position;
_advance();
_tokens.add(LeftBracketToken(range: SourceRange(start, _position)));
break;
case ']':
final start = _position;
_advance();
_tokens.add(RightBracketToken(range: SourceRange(start, _position)));
break;
case '^':
final start = _position;
_advance();
_tokens.add(SuperscriptToken(range: SourceRange(start, _position)));
break;
case '\'':
final start = _position;
_advance();
_tokens.add(PrimeToken(range: SourceRange(start, _position)));
break;
case '_':
final start = _position;
_advance();
_tokens.add(SubscriptToken(range: SourceRange(start, _position)));
break;
case '&':
final start = _position;
_advance();
_tokens.add(AmpersandToken(range: SourceRange(start, _position)));
break;
case '\$':
_handleMathShift();
break;
// Dart 3 supports multi-matching for switch cases:
case '+':
case '-':
case '=':
case '<':
case '>':
case ',':
case ';':
case ':':
case '(':
case ')':
case '|':
case '.':
final start = _position;
_tokens.add(TextToken(char, range: SourceRange(start, start + 1)));
_advance();
break;
case '\n':
case '\r':
_handleNewLine();
break;
case ' ':
case '\t':
_handleWhitespace();
break;
default:
_handleText();
}
}
_tokens.add(EOFToken(range: SourceRange(_position, _position)));
// HLog.d(_tag, "词法分析完成,生成 ${_tokens.length} 个 token");
return _tokens;
}