用于匹配 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]
只匹配字母 w
和 W
.
如果 lex 确实支持 \w
和 \W
,那么 [\w\W]
将匹配每个 "word character" 或不是 "word character" 的字符。换句话说,它将匹配所有内容。所以这告诉我们,除了 [\w\W]
,您可以只写 .
,它受 lex 支持并且匹配所有内容。它还告诉我们 (%[d|c|f|lf|s])*)+
位是多余的,因为该部分可以匹配的所有内容都已经被 .*
部分匹配了。因此,外部的 +
限定符也是多余的。
因此考虑到这一点,字符串文字的正则表达式将变为 \".*\"
(它不匹配换行符,但这没关系,因为 C 不允许在字符串文字中使用未转义的换行符)。问题在于,这将匹配输入中从第一个 "
到 last "
的所有内容,而不是 next "
。所以你想禁止 "
s 出现在字符串中。但是,当通过在其前面加上反斜杠(换行符也是如此)进行转义时,允许在字符串中使用 "
。因此,考虑到所有这些因素,适合字符串文字的正则表达式是:
\"(\(.|\n)|[^\n\"])*\"
我正在尝试制作一个编译器,其中 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]
只匹配字母 w
和 W
.
如果 lex 确实支持 \w
和 \W
,那么 [\w\W]
将匹配每个 "word character" 或不是 "word character" 的字符。换句话说,它将匹配所有内容。所以这告诉我们,除了 [\w\W]
,您可以只写 .
,它受 lex 支持并且匹配所有内容。它还告诉我们 (%[d|c|f|lf|s])*)+
位是多余的,因为该部分可以匹配的所有内容都已经被 .*
部分匹配了。因此,外部的 +
限定符也是多余的。
因此考虑到这一点,字符串文字的正则表达式将变为 \".*\"
(它不匹配换行符,但这没关系,因为 C 不允许在字符串文字中使用未转义的换行符)。问题在于,这将匹配输入中从第一个 "
到 last "
的所有内容,而不是 next "
。所以你想禁止 "
s 出现在字符串中。但是,当通过在其前面加上反斜杠(换行符也是如此)进行转义时,允许在字符串中使用 "
。因此,考虑到所有这些因素,适合字符串文字的正则表达式是:
\"(\(.|\n)|[^\n\"])*\"