用于匹配 printf 和 scanf 语句的 lex 文件的正则表达式

Regex for lex file to match printf and scanf statements

我正在尝试制作一个编译器,其中 lex 文件与以下 printf 和 scanf 语句的简单变体相匹配:

printf("\n Enter your string:");
scanf("%s",str);
scanf("%d",&prelength);

在 scanf 示例中,str 声明为 char str[20]prelength 声明为 int prelength

我目前包含在我的 lex 文件中的正则表达式如下(分别用于 scanf 和 printf):

scanf\(\"([\w\W]*(%[d|c|f|lf|s])*)+\"(,\s*&?[a-zA-Z]+)*\); 
printf\(\"([\w\W]*(%[d|c|f|lf|s])*)+\"(,\s*[a-zA-Z]+)*\); 

我不知道为什么上面的正则表达式与上面给出的 printf 和 scanf 示例不匹配(类似于 c 中的那些,但更简单)。

你的两条scanf行居然匹配成功了。 printf 行不匹配,因为字符串文字的模式不匹配。问题是 lex 不理解 \w\W,所以 [\w\W] 只匹配字母 wW.

如果 lex 确实支持 \w\W,那么 [\w\W] 将匹配每个 "word character" 或不是 "word character" 的字符。换句话说,它将匹配所有内容。所以这告诉我们,除了 [\w\W],您可以只写 .,它受 lex 支持并且匹配所有内容。它还告诉我们 (%[d|c|f|lf|s])*)+ 位是多余的,因为该部分可以匹配的所有内容都已经被 .* 部分匹配了。因此,外部的 + 限定符也是多余的。

因此考虑到这一点,字符串文字的正则表达式将变为 \".*\"(它不匹配换行符,但这没关系,因为 C 不允许在字符串文字中使用未转义的换行符)。问题在于,这将匹配输入中从第一个 "last " 的所有内容,而不是 next "。所以你想禁止 "s 出现在字符串中。但是,当通过在其前面加上反斜杠(换行符也是如此)进行转义时,允许在字符串中使用 "。因此,考虑到所有这些因素,适合字符串文字的正则表达式是:

\"(\(.|\n)|[^\n\"])*\"