Лексер в C # (для процедуры Pascal), использующий регулярные выражения - PullRequest
0 голосов
/ 03 октября 2018

Помогите проверить правильность процедуры ввода на языке Паскаль.Пожалуйста.

В качестве параметров можно использовать идентификаторы, строковые константы, заключенные в двойные кавычки, и одиночные символы, заключенные в одинарные кавычки.

True

proc1('s',13,"sss");
proc2('s',s,d,11,"sss");
proc3("sss");

False

proc1(s',11,"sss"); 
proc2('s',s,d,11,sss");
proc3("sss);
proc4("sss";

Моя жалкая попытка:

public void ThreadPoolCallback(Object threadContext)
    {
        if ((str.Length == 0) && (str[str.Length - 1] != ')'))
        {
            haveError = true;
        }
        else
        {
            int startIndex = str.IndexOf('('),
            lastIndex = str.LastIndexOf(')'),
            startIndex2 = str.LastIndexOf('('),
            lastIndex2 = str.IndexOf(')');
            if (startIndex < lastIndex && startIndex > 0 && lastIndex == str.Length - 1 &&
            startIndex == startIndex2 && lastIndex == lastIndex2)
            {
                int curr = startIndex + 1;
                while (curr < lastIndex)
                {
                    string s = "";
                    while (str[curr] != ',' && curr < lastIndex)
                    {
                        s += str[curr];
                        curr++;
                    }

                    curr++;
                }
            }
            else
            {
                haveError = true;
            }
        }
        doneEvent.Set();
    }

1 Ответ

0 голосов
/ 04 октября 2018

Я не встроил весь движок Pascal в это регулярное выражение, но он должен делать то, что вы хотите:

@"\((?:(?:'[\d\w_]+'|""[\d\w_]*""|[\d\w_]+),?)*\);"

Он будет совпадать с начальными скобками '(' чисел и букв, отданных однимили двойные кавычки (совпадающие пары) или буквы и цифры, за которыми следует необязательная запятая ',' и заканчивающаяся конечными скобками ')' и точкой с запятой ';'.

Как использовать:

string test = "proc1('s',13,"sss");\n" + "proc2('s',s,d,11,"sss");\n"
+ "proc3("sss");" + "proc1(s',11,"sss");" + "proc2('s',s,d,11,sss");"
+ "proc3("sss);" + "proc4("sss";";

Regex regex = new Regex(@"\((?:(?:'[\d\w_]+'|""[\d\w_]*""|[\d\w_]+),?)*\);");

foreach (Match match in regex.Matches(test))
{
    Console.Write(match.Value);
}
...