Синтаксический анализатор (проверка на наличие русских букв) - C#

Узнай цену своей работы

Формулировка задачи:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace scaner
{
    public partial class Form1 : Form
    {
        List<int> lst = new List<int>();
        int position = 0;
        List<string> key_table = new List<string>();
        List<string> var_table = new List<string>();
        List<int> const_table = new List<int>();
        List<string> termin_table = new List<string>();
        List<res> result_scanned = new List<res>();
        string buffer = "";
        string s = "";
        int prev_pos = 0;
        bool flagok = false;
 
        public class res
        {
            public res(int a, int b)
            {
                t = a;
                pos = b;
            }
            public int t;
            public int pos;
        }
 
        public Form1()
        {
            InitializeComponent();
            tabl_key_termin_entering();
        }
 
        void tabl_key_termin_entering()
        {
            // string slovo;
            //int  index = key_table.IndexOf(slovo);
            key_table.Add("program");
            key_table.Add("var");
            key_table.Add("begin");
            key_table.Add("end");
            key_table.Add("procedure");
            key_table.Add("while");
            key_table.Add("do");
            key_table.Add("for");
            key_table.Add("writeln"); key_table.Add("write");
            key_table.Add("readln"); key_table.Add("read");
            key_table.Add("integer");
            key_table.Add("real");
            key_table.Add("function");
 
            termin_table.Add("(");
            termin_table.Add(")");
            termin_table.Add(";");
            termin_table.Add(":="); termin_table.Add(":");
            termin_table.Add(" ");
            termin_table.Add("=");
            termin_table.Add("+");
            termin_table.Add("-");
            termin_table.Add("<="); termin_table.Add("<");
            termin_table.Add(">="); termin_table.Add(">");
            termin_table.Add("\r");
            termin_table.Add("\n");
            termin_table.Add(".");
            termin_table.Add(",");
 
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                FileStream fs = File.OpenRead(openFileDialog1.FileName);
                UTF8Encoding ue = new UTF8Encoding();
                byte[] bytes = new byte[fs.Length];
                fs.Read(bytes, 0, (int)fs.Length);
                s = ue.GetString(bytes);
                s = s.ToLower();
 
                richTextBox2.Text = s.ToString();
            }
        }

        public void Laba1()
        {
            bool flag = false;
           // if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
               /* FileStream fs = File.OpenRead(openFileDialog1.FileName);
                UTF8Encoding ue = new UTF8Encoding();
                byte[] bytes = new byte[fs.Length];
                fs.Read(bytes, 0, (int)fs.Length);
                s = ue.GetString(bytes);
                s = s.ToLower();*/
                s = richTextBox2.Text;

                result_scanned.Clear();
                var_table.Clear();
                const_table.Clear();

                for (int i = 0; i < s.Length; i++)
                {
                    //проверка на терминальный символ
                    for (int j = 0; j < termin_table.Count; j++)
                    {
                        position = 0;
                        string kk = "";
                        if (termin_table[j].Length <= s.Length - i)
                            for (int jj = i; jj < i + termin_table[j].Length; jj++)
                                kk += s[jj];
                        if (kk == termin_table[j])
                        {
                            position = i + termin_table[j].Length;
 
                            result_scanned.Add(new res(4, j));
                            if (flag) prev_pos = position;
                            flag = true;
                            break;
                        }
 
                    }
                    if (flag == false) buffer += s[i];
                    //esli nashli
                    if (flag && buffer != "")
                    {
                        flag = false;
                        // проход по таблицам
                        //  if (prev_pos != -1)
                        //   {
                        // string tmp = "";
                        // for (int jj = prev_pos; jj < i; jj++)
                        // tmp += s[jj];
                        //с ключевыми
                        for (int jj = 0; jj < key_table.Count; jj++)
                            if (buffer == key_table[jj])
                            {
                                if (buffer == "var") flagok = true;
                                if (buffer == "real") flagok = false;
                                result_scanned.Insert(result_scanned.Count - 1, new res(1, jj));
 
                                buffer = "";
                                goto ex;
                            }
                        //c константами
                        try
                        {
                            int chislo = Convert.ToInt32(buffer);
                            if (const_table.Contains(chislo))
                            { }
                            else
                            { const_table.Add(chislo);}
                            result_scanned.Insert(result_scanned.Count - 1, new res(3, (int)const_table.IndexOf(chislo)));
                        }
                        catch (Exception)
                        {
                            //переменные
                            if (var_table.Contains(buffer))
                            { }
                            else
                            {
                                var_table.Add(buffer);
                                if (flagok) lst.Add((int)var_table.IndexOf(buffer));
                                if (buffer[0].ToString() == "'") lst.Add((int)var_table.IndexOf(buffer));
                            }
                            result_scanned.Insert(result_scanned.Count - 1, new res(2, (int)var_table.IndexOf(buffer)));
                        }
                        //  }
                        // else 
                        prev_pos = position;
                        buffer = "";
                    }
                ex:
                    // считываем символ, буфер
                    // если он терминальный - считываем лексему 
                    //и заносим или нет в таблицу, отмечаем в результе
                    //пометки терминалов и лексем
 
                    //проверка не лексемы
                    flag = false;
 
                }
            }
 
            //string[] lines = s.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            //if (openFileDialog1.ShowDialog() == DialogResult.OK)
 
            Laba1();

            //richTextBox2.Text = s.ToString();
            textBox1.Text = "";
            List<string> resultat = new List<string>();
 
            //Proramm
            if (result_scanned[0].pos == 0 && result_scanned[0].t == 1)
            { /*textBox1.Text += "= - ))   Ошибок в терминале Proramm нет!!! \r\n*********************************************************************\r\n"; */}//
            else { textBox1.Text += " Отсутствует programm \n"; };
 
            //имя
            if (result_scanned[2].t == 2)
            { /*textBox1.Text += "= - ))    Ошибок в имени нет!!! \r\n*********************************************************************\r\n"; */}
            else { textBox1.Text += " Uncorrected name of program \n"; };
 
            ////Проверка парности (-) 
            {
                int open = 0; int close = 0;
                for (int i = 0; i < result_scanned.Count; i++)
                {
                    if (result_scanned[i].t == 4 && result_scanned[i].pos == 0)
                    { open++; }
                }
                for (int i = 0; i < result_scanned.Count; i++)
                {
                    if (result_scanned[i].t == 4 && result_scanned[i].pos == 1)
                    { close++; }
                }
 
                for (int i = 0; i < result_scanned.Count; i++)
                {
                    if ((result_scanned[i].t == 4 && result_scanned[i].pos == 0) && (result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 1))
                        textBox1.Text += "Пустые скобки\n";
                }
 
                if (open > close)
                { textBox1.Text += " Пропущены закрывающиеся скобки \n"; };
                if (open < close)
                { textBox1.Text += " Пропущены открывающиеся скобки \n"; }
                else { /*textBox1.Text += "= - ))     Скобки в порядке\r\n*********************************************************************\r\n"; */};
            }
 
            //Проверка парности begin-end
            {
                int begin = 0; int end = 0;
                for (int i = 0; i < result_scanned.Count; i++)
                {
                    if (result_scanned[i].t == 1 && result_scanned[i].pos == 2)
                    { begin++; }
                }
                for (int i = 0; i < result_scanned.Count; i++)
                {
                    if (result_scanned[i].t == 1 && result_scanned[i].pos == 3)
                    { end++; }
                }
                if (begin > end)
                { textBox1.Text += " (    Пропущен end \n"; };
                if (begin < end)
                { textBox1.Text += " (    Пропущен begin \n"; }
                else { /*textBox1.Text += "= - ))     begin-end в порядке\r\n*********************************************************************\r\n"; */};
            }

            //проверка Writeln/write+Readln/read
            {
                for (int i = 0; i < result_scanned.Count; i++)
                {
                    if (result_scanned[i].t == 1 && (result_scanned[i].pos == 8 || result_scanned[i].pos == 9))
                    {
                        if (result_scanned[i + 1].t == 4 && result_scanned[i+1].pos == 0)
                        { }
                        else { textBox1.Text += " После writeln/write нет терминального символа \n"; };
                    }
                }
                for (int i = 0; i < result_scanned.Count; i++)
                {
                    if (result_scanned[i].t == 1 && (result_scanned[i].pos == 10 || result_scanned[i].pos == 11))
                    {
                        if (result_scanned[i + 1].t == 4 && result_scanned[i+1].pos == 0)
                        { }
                        else { textBox1.Text += " После Readln/read нет терминального символа \n"; };
                    }
                }
 
            }
 
            //проверка ;
            for (int i = 0; i < result_scanned.Count; i++)
            {
                if (result_scanned[i].t == 4 && result_scanned[i].pos == 2)
                {
                    if (result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 14)/*13*/
                    { /*textBox1.Text += "= - ))    С ; все впорядке \r\n*********************************************************************\r\n"; */ }
                    else { textBox1.Text += " Некорректно использована ;  \n"; };
                }
            }
 
            //проверка var Begin
            for (int i = 0; i < result_scanned.Count; i++)
            {
                if (result_scanned[i].t == 1 && result_scanned[i].pos == 1)
                {
                    if ((result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 14)/*13*/ && (result_scanned[i - 1].t == 4 && result_scanned[i - 1].pos == 14))
                    { /*textBox1.Text += "= - ))    С Var все впорядке \r\n*********************************************************************\r\n"; */}
                    else { textBox1.Text += " Лишний контекст в строке с Var \n"; };
                }
                if (result_scanned[i].t == 1 && result_scanned[i].pos == 2)
                {
                    if ((result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 14)/*13*/ && (result_scanned[i - 1].t == 4 && result_scanned[i - 1].pos == 14))
                    { /*textBox1.Text += "= - ))    С Begin все впорядке \r\n*********************************************************************\r\n"; */}
                    else { textBox1.Text += " Лишний контекст в строке с Begin  \n"; };
                }
            }
 
            //проверка Перед точкой только END
            for (int i = 0; i < result_scanned.Count; i++)
            {
                if (result_scanned[i].t == 4 && result_scanned[i].pos == 15)
                {
                    if (result_scanned[i - 1].t == 1 && result_scanned[i - 1].pos == 3)
                    { /*textBox1.Text += "= - ))    С точкой все впорядке \r\n*********************************************************************\r\n"; */}
                    else { textBox1.Text += " Не правильно поставлена точка \n"; };
                }
            }
 
            //проверка наличия ; или . после END
            for (int i = 0; i < result_scanned.Count; i++)
            {
                if (result_scanned[i].t == 1 && result_scanned[i].pos == 3)
                {
                    if ((result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 2) || (result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 15))
                    { /*textBox1.Text += "= - ))    После End все впорядке \r\n*********************************************************************\r\n"; */}
                    else { textBox1.Text += " Ошибка конструкции \n"; };
                }
            }
            for (int i = result_scanned.Count - 1; i > 0; i--)
            {
                if (result_scanned[i].t == 2 && !lst.Contains(result_scanned[i].pos) )
                {
                    if (result_scanned[i].pos != 0) textBox1.Text += " Не существует переменной \n";
                }
            }
            //проверка последнего END на точкой
            int i_nado = 0;
            for (int i = result_scanned.Count-1; i > 0; i--)
            {
                if (result_scanned[i].t == 1 && result_scanned[i].pos == 3)
                {
                    i_nado = i;
                    if (result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 15)
                    { /*textBox1.Text += "= - ))    Последний End с точкой \r\n*********************************************************************\r\n"; */}
                    else { textBox1.Text += " Пропущена точка после end \n"; };
                    break;
                }
            }
            //проверка предыдущих END на ;
            for (int i = i_nado - 1; i > 0; i--)
            {
                if (result_scanned[i].t == 1 && result_scanned[i].pos == 3)
                {
                    i_nado = i;
                    if (result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 2)
                    { /*textBox1.Text += "= - ))    предыдущие End с ; \r\n*********************************************************************\r\n"; */}
                    else { textBox1.Text += " Пропущена; после end \n"; };
                    }
            }

            //проверка +-
            for (int i = 0; i < result_scanned.Count; i++)
            {
               
                    if (result_scanned[i].t == 4 && (result_scanned[i].pos == 7 || result_scanned[i].pos == 8))
                    {
                        if (result_scanned[i + 1].t == 2 || result_scanned[i + 1].t == 3) { }else
                        if ((result_scanned[i].pos == 8||result_scanned[i].pos==7) && result_scanned[i].t == 1 && (result_scanned[i + 1].t == 3 || result_scanned[i + 1].t == 2)||(result_scanned[i+1].t==4&&result_scanned[i+1].pos==0)) { }
                        else
                        if ((result_scanned[i + 1].t == 2 || result_scanned[i + 1].t == 3 || (result_scanned[i + 1].t == 4 && result_scanned[i + 1].pos == 0)) && (result_scanned[i - 1].t == 2 || result_scanned[i - 1].t == 3 || (result_scanned[i - 1].t == 4 && result_scanned[i - 1].pos == 1)))
                        { /*textBox1.Text += "вокруг + или - все хорошо \r\n"; */}
                        else { textBox1.Text += "Неправильное арифметическое выражение\n"; };
                    }
            }

            if (textBox1.Text == "") { textBox1.Text = "Программа без ошибок"; }
        }
 
        private void richTextBox2_TextChanged(object sender, EventArgs e)
        {
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }

    }
}
В коде представлен синтаксический анализатор для Pascal'я. Как реализовать проверку наличия русских букв? Пока что он никак на них реагирует, если их накидать в коде. Надо чтобы выдавал сообщение о том, что в коде есть ошибка. Спасибо.

Решение задачи: «Синтаксический анализатор (проверка на наличие русских букв)»

textual
Листинг программы
// первый способ проверять регуляркой
Regex reg = new Regex(@"^([^а-яА-Я]+)$");
if (! reg.IsMatch("Hello Мир !!!"))
         Console.WriteLine("В строке присутствуют кириллические символы.");
else
         Console.WriteLine("Строка без кириллицы.");
 
// второй способ проверять методом IndexOfAny объекта string
string str = "Hello World !!!";
string chs = "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ";
if(str.IndexOfAny(chs.ToCharArray()) != -1)
         Console.WriteLine("В строке присутствуют кириллические символы.");
else
         Console.WriteLine("Строка без кириллицы.");

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы