// Ushbu klass bo'lakni ifodalash uchun
ublic class Token
{
// mumkin bo'lgan bo'laklar turi
public enum TokenType
{
UNKNOWN, // noma’lum bo’lak
IDENTIFIER, // identifikator
OPERATOR, // operator
NUMLITERAL, // sonli literal
STRINGLITERAL, // matnli literal
WHITESPACE, // bo’sh joylar
NEWLINE, // yangi qator
EOP // dastur oxirini belgilash uchun
}
public string Text; // bo'lak matni
public TokenType Type; // bo'lak turi
public int TextPos; // bo'lakni dastur matnidagi pozisiyasi
public Token()
{
|
this.Text = "";
this.TextPos = 0;
this.Type = TokenType.UNKNOWN ;
}
}
public class Lexer
{
// konstantalar
const char CHAR_NULL = '\0';
// o'zgaruvchilar
string text;
int position;
// konstruktor
public Lexer()
{
this.position= 0;
this.text= "";
|
}
// konstruktor
public Lexer(string text)
{
this.text= text;
this.position= 0;
}
// dastur matnini berish/olish
public string Text
{
get { return this.text; }
set { this.text = value; }
}
}
Lexer klassiga kiruvchi matnni belgilab o’qishga yordam beruvchi funksiyalarni qo’shamiz:
// jarayondagi joriy pozisiya public int Position
{
get { return this.position; }
}
// joriy belgini aniqlash
public char CurrentChar()
{
if (position < text.Length)
return Convert.ToChar (text.Substring(position, 1));
else
return CHAR_NULL ;
}
// joriy belgidan keyingi belgini aniqlash
public char NextChar()
{
if (position 1 < text.Length)
return Convert.ToChar(text.Substring(position 1, 1));
else
|
return CHAR_NULL;
}
// joriy belgidan oldingi belgini aniqlash
public char PrevChar()
{
if (position - 1 >= 0)
return Convert.ToChar(text.Substring(position - 1, 1));
Do'stlaringiz bilan baham: |