in Iris/IrisCompiler/FrontEnd/Lexer.cs [229:351]
private void MoveNextOnLine()
{
AcceptMany(IsWhitespace);
_col += _tokenLen;
if (_col >= _lineLen)
{
_tokenLen = 0;
CurrentToken = Token.Eol;
return;
}
_tokenLen = 1; // Assume token is one character
char c = _lineText[_col];
if (IsAlpha(c))
{
ProcessWord();
return;
}
if (IsDigit(c))
{
CurrentToken = Token.Number;
AcceptMany(IsDigit);
return;
}
switch (c)
{
case '(':
CurrentToken = Token.ChrOpenParen;
break;
case ')':
CurrentToken = Token.ChrCloseParen;
break;
case '[':
CurrentToken = Token.ChrOpenBracket;
break;
case ']':
CurrentToken = Token.ChrCloseBracket;
break;
case ':':
if (Accept('='))
CurrentToken = Token.ChrAssign;
else
CurrentToken = Token.ChrColon;
break;
case ';':
CurrentToken = Token.ChrSemicolon;
break;
case '=':
CurrentToken = Token.ChrEqual;
break;
case '+':
CurrentToken = Token.ChrPlus;
break;
case '-':
CurrentToken = Token.ChrMinus;
break;
case '*':
CurrentToken = Token.ChrStar;
break;
case '/':
if (Accept('/'))
{
// Comment - treat as EOL
_tokenLen = 0;
CurrentToken = Token.Eol;
}
else
{
CurrentToken = Token.ChrSlash;
}
break;
case '%':
CurrentToken = Token.ChrPercent;
break;
case ',':
CurrentToken = Token.ChrComma;
break;
case '>':
if (Accept('='))
CurrentToken = Token.ChrGreaterThanEqual;
else
CurrentToken = Token.ChrGreaterThan;
break;
case '<':
if (Accept('='))
CurrentToken = Token.ChrLessThanEqual;
else if (Accept('>'))
CurrentToken = Token.ChrNotEqual;
else
CurrentToken = Token.ChrLessThan;
break;
case '_':
case '$': // Used for special identifiers in the debugger
ProcessWord();
break;
case '#':
CurrentToken = Token.Number;
AcceptMany(IsHexDigit);
break;
case '\'':
CurrentToken = Token.String;
ProcessString();
break;
case '.':
if (Accept('.'))
CurrentToken = Token.ChrDotDot;
else
CurrentToken = Token.ChrPeriod;
break;
case '{':
ProcessMultilineComment();
break;
default:
AddError("Unexpected character.");
CurrentToken = Token.Skip;
break;
}
}