Міністерствто освіти і науки України
Національний університет  “Львівська політехніка”
Кафедра прикладної математики
Звіт
Лабораторна робота №2:
Лексичний аналізатор
                                                                                                                                                                          
Тема : Розглянути підмножину мови Pascal, у якій є  ідентифікатори (довжина – не більше 10 символів), цілі константи (довжина – не більше 6 символів), дійсні константи з фіксованою крапкою ( довжина цілої частини – до 3 символів, дробової – до 5 символів), які використовуються у операторах опису (типи змінних – real , integer), оператори присвоєння, складні оператори (begin … end) умовні оператори (коротка форма, умова – одна операція порівняння).
Код програми :
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace SysProgLab2
{
    public partial class Form1 : Form
    {
       
        ArrayList list = new ArrayList();
        string s;
        string[] service ={"and","begin","real","integer","var","program","or"}; 
        string[] ssplit;
        public Form1()
        {
            InitializeComponent();
        }
        private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            s = textBox1.Text;
            ssplit = s.Split(new char[] {'\r',',','\n',' ','<','>',':','=',';'},StringSplitOptions.RemoveEmptyEntries);
            foreach (string stemp in ssplit)
            {
                transefer(stemp);
            }
            for (int k = 1; k < s.Length; k++)
            {
                if (s[k] == '=')
                {
                    if (!Char.IsDigit(s[k + 1]) && !char.IsLetter(s[k + 1])) Err(k);
                    if (!Char.IsDigit(s[k - 1]) && !char.IsLetter(s[k - 1]) && s[k - 1] != '>' && s[k - 1] != '<' && s[k - 1] != ':') Err(k);
                }
                if (s[k] == ':')
                {
                    if (s[k + 1] != '=' && s[k + 1] != 'r' && s[k + 1] != 'i') Err(k);
                    if (!char.IsLetter(s[k - 1]) && !char.IsDigit(s[k - 1])) Err(k);
                }
                if (s[k] == '.')
                {
                    if (!char.IsLetter(s[k + 1]) && !char.IsDigit(s[k + 1])) Err(k);
                    if (!char.IsLetter(s[k - 1]) && !char.IsDigit(s[k - 1])) Err(k);
                }
                if (s[k] == '>')
                {
                    if (!char.IsLetter(s[k + 1]) && !char.IsDigit(s[k + 1])&&s[k+1]!='=') Err(k);
                    if (!char.IsLetter(s[k - 1]) && !char.IsDigit(s[k - 1])&&s[k-1]!='<') Err(k);
                }
                if (s[k] == '<')
                {
                    if (!char.IsLetter(s[k + 1]) && !char.IsDigit(s[k + 1]) && s[k + 1] != '=' && s[k - 1] != '<') Err(k);
                    if (!char.IsLetter(s[k - 1]) && !char.IsDigit(s[k - 1]) ) Err(k);
                
            }
        }
        public bool isIndef(char[] ch)
        {
            if (ch[0] != '_' && !Char.IsLetter(ch[0])) return false;
            if (ch[0] == '_' && !char.IsLetter(ch[1])) return false;
            for (int i = 1; i < ch.Length; i++)
            {
                if (!char.IsLetter(ch[i]) && !char.IsDigit(ch[i]) && ch[i] != '_') return false;
            }
            return true;
        }
        public void Err(int i)
        {
            if (MessageBox.Show("Error in statement", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)
            {
                textBox1.Focus();
                textBox1.Select(i, 1);
            }
        }
        public bool isDConst(char[] ch)
        {
            int pr = 0;
            if (!char.IsDigit(ch[0])) return false;
            for (int i = 1; i < ch.Length; i++)
            {
                if (ch[i] == '.') pr++;
                if (!char.IsDigit(ch[i])&&ch[i]!='.') return false;
                if (ch[i] == '.' && pr > 1) return false;
            }
            if (pr == 0) return false;
            return true;
        }
        public bool isCConst(char[] ch)
        {
            for (int i = 0; i < ch.Length; i++)
            if (!char.IsDigit(ch[i])) return false;
        return t     
    
        }
        public bool isService(string ch)
        {
            bool pr = false;
            for (int i = 0; i < service.Length; i++)
            {
                if (ch == service[i]) pr = true;
            }
            return pr;
        }
        public void transefer(string s)
        {
            bool prapor=true;
            foreach (string sk in list)
            {
                if (s == sk) prapor = false;
            }
            list.Add(s);
            if (prapor)
            {
                prapor = false;
                if (isService(s))
                {
                    listBox1.Items.Add(s + " -> slyzhbove slovo");
                }
                else
                    if (isIndef(s.ToCharArray()))
                        if (s.Length <= 10)
                            listBox1.Items.Add(s + " -> identuficator");
                        else listBox1.Items.Add(s + " -> identuficator z perevuschenjam");
                if (isCConst(s.ToCharArray()))
                    if (s.Length <= 6) listBox1.Items.Add(s + " -> cila konstanta");
                    else listBox1.Items.Add(s + " -> cila konstanta z perevuschenjam");
                if (isDConst(s.ToCharArray()))
                {
                    string s1 = "";
                    string s2 = "";
                    if (s.Split('.')[0].Length > 3) s1 = " perev. cil.";
                    if (s.Split('.')[1].Length > 5) s2 = " perev. drob.";
                    listBox1.Items.Add(s + " -> Drobova const. " + s1 + s2);
                    s1 = "";
                    s2 = "";
                }
            }
           
        }
        private void button1_Click(object sender, EventArgs e)
        {
           
            StreamReader sr = new StreamReader(Application.StartupPath  + "\\code.txt");
            textBox1.Text = sr.ReadToEnd();
            sr.Close();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            StreamWriter sw = new StreamWriter(Application.StartupPath + "\\outcode.txt");
            foreach (string str in listBox1.Items)
            {
                sw.WriteLine(str);
            }
            sw.Close();
        }
    }
}
Контрольний приклад :
Висновок : у даній лаборвторній роботі я навчився програмувати лексичний аналізатор і розбивати на лексеми.