使用正则表达式的 C# 中的 Lexer(用于过程 Pascal)

Lexer in C#(for procedure Pascal) That Uses Regular Expressions

帮助验证Pascal语言输入程序的正确性。请。

标识符、用双引号括起来的字符串常量和用单引号括起来的单个字符都可以作为参数。

正确

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

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();
    }

我没有将整个 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);
}