Міністерствто освіти і науки України
Національний університет “Львівська політехніка”
Кафедра прикладної математики
Звіт
Лабораторна робота №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();
}
}
}
Контрольний приклад :
Висновок : у даній лаборвторній роботі я навчився програмувати лексичний аналізатор і розбивати на лексеми.