patrickb123 Ответов: 2

Как разобрать оператор IF с помощью C#?


Всем Привет,

Я пытаюсь создать свой собственный простой язык для моего приложения C# с помощью таких команд, как:

MAKE_LETTER
СООБЩЕНИЕ
ОБНОВЛЕНИЕ
CREATECASE
ЕСЛИ ЕЩЕ КОНЕЦ

Однако у меня возникли проблемы с разбором оператора IF. Мне это нужно, чтобы, если условие с оператором if истинно, то оно переходит к следующему концу в текстовом файле. Однако если это условие не выполняется, то переходите к следующему другому. Я включил свой код ниже, чтобы вы могли видеть, где я иду не так.

Любая помощь была бы очень оценена!

Что я уже пробовал:

<pre>string strLine = string.Empty;

            string strFile = @"d:\test.txt";

            ArrayList arr = new ArrayList();

            StreamReader sr = new StreamReader(strFile);

            while (sr.Peek() >= 0)

            {

                strFile = sr.ReadLine();

                arr.Add(strFile);

            }

            for (int i = 0; i < arr.Count; i++)

            {

                if (i > 0)

                {

                    string s1 = arr[i].ToString();
                   // MessageBox.Show(s1);
                    if (s1.Contains("IF"))
                    {
                        string field = "";
                        string message = "";
                        bool con_met = false;

                        if (s1.Contains("[") || s1.Contains("]"))
                        {
                            field = s1.Split('[', ']')[1];
                            string table = field.Split('.')[0];
                            string field_value = field.Substring(field.LastIndexOf('.') + 1);
                            string value = Run_Code.Get_db_val123(table, field_value);
                            Global_Variables.case_ref = "TEST";
                            //MessageBox.Show(value);
                            message = s1.Split('"', '"')[1];
                           // MessageBox.Show("IF " + value + "== " + message);
                            if (value == message)
                            {

                                MessageBox.Show("Conditon Met");
                                //MessageBox.Show(s1)
                                //i = i + 1;
                                i = End_pos;



                            }
                            else
                            {
                                i = Else_pos;
                                //MessageBox.Show("ELSE");
                                
                            }


Код в текстовых файлах выглядит следующим образом:
//MESSAGE("Testing123")

IF "Patrick" = "Patrick" THEN
MAKE_LETTER(test150)
ELSE
//DO Something here
END

BillWoodruff

вы являетесь автором формата файла, который вы читаете ?

patrickb123

Да.

BillWoodruff

почему вы решили использовать именно этот формат ?

2 Ответов

Рейтинг:
0

Richard MacCutchan

Логика довольно проста, вам просто нужно разделить части оператора и проверить условие оператора:

IF verb EQUALS "IF"
BEGIN
    Parse the statement into operand1, operator, operand2
    IF operator EQUALS "="
    BEGIN
        compare the two operands and if equal go to the next statement
        if not equal then skip the next statement
    END
END

Хотя это слишком упрощено, это должно дать вам что-то для работы. Возможно, вы найдете лучший способ-использовать готовый синтаксический анализатор языка. Эта дама: honey the codewitch - профиль специалиста[^] (@code-witch) написал несколько отличных статей на эту тему.


patrickb123

Привет Ричард,

Спасибо за ваш ответ, если бы я использовал этот метод, как бы я проанализировал текстовый файл и перешел к следующему ELSE/END?

Richard MacCutchan

В принципе, то же самое. Синтаксический анализ-это разбиение операторов на маркеры и сопоставление маркеров с вашим набором правил. Но как только вы переходите от простых однострочных выражений к составным, все становится немного сложнее. Перейдите по ссылке, которую я вам дал, и взгляните на некоторые статьи.

Рейтинг:
0

OriginalGriff

Не делайте этого так: слишком легко получить "ложные срабатывания":

MAKE_LETTER("QUIFF")
например будет соответствовать вашему:
if (s1.Contains("IF"))
и это все выбросит на помойку.
Вместо этого подумайте о том, чтобы написать токенизатор[^] и обработка пользовательского кода в виде потока токенов. Существует довольно много лексических процессоров там: Гугл[^] покажет вам пару сотен только на этом сайте. Я бы взглянул на некоторые из этих статей (хотя они могут быть довольно тяжелыми для новичка) и увидел, что они делают, почему они это делают и, возможно, как они это делают, прежде чем идти дальше.
A simplistic approach like you current one will just end up with more, and more special cases as you process more and more complex code - and will quickly become unreliable and unmaintainable! It's worth thinking about "doing it properly" right from the start, as it'll save you a lot of time and heartache later - the more time and effort you invest in the simplistic approach, the harder it is so say "Sod it! this won't work" and throw it away. That's still one of the things I find hardest to do: bin code I've worked hard on because it clearly isn't going to do what I want without major faffing about. And I've been doing this for decades! :laugh:


patrickb123

Привет, я взглянул на ссылку, которую вы предоставили в лексическом парсере. Однако мне было интересно, свободны ли вы для скриншота, чтобы я мог заставить его работать. Так как я не знаю, как его запустить?

Ссылка такова: https://codereview.stackexchange.com/questions/172026/simple-language-tokenizer-in-c