在此任务中,您必须编写一个程序来读取正则表达式,并生成另一个程序,该程序输出该正则表达式是否接受输入字符串。输出必须是使用与提交相同的语言编写的程序。
输入值
输入是与以下ABNF匹配的正则表达式r(初始生产规则为REGEX
):
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
如果输入与此语法不匹配,则程序的行为未定义。
解释
将输入解释为正则表达式,其中*
的Kleene-star(表示重复左参数零次或多次)|
是替代方法,(
并且)
组且根本没有运算符串联在一起。分组优先于星形,星形优先于串联,串联优先于替代。
如果正则表达式匹配整个字符串,则认为该字符串可以接受。
输出量
该程序的输出是另一个与您的提交使用相同语言编写的程序,该程序在运行时以实现定义的方式读取字符串s,输出r是否接受s然后终止。输出可以以用户定义的方式完成,尽管对于接受和拒绝的程序必须只有两个不同的输出。
您可以假定输出程序的输入从不超过2 16 -1字节。
限制条件
您的提交或提交的任何程序均不得使用内置功能或
- 匹配正则表达式
- 转换正则表达式
- 编译正则表达式
- 从语法生成解析器
- 简化问题,使您的提交变得微不足道
计分
您提交的分数是它的字符数。得分最低的提交者获胜。
测试用例
所有测试用例均包含正则表达式,一组接受的字符串,一组拒绝的字符串以及C99中的示例程序,该程序是(假设的)C99提交的有效输出。
(空正则表达式)
接受的字符串
- (空输入)
拒绝弦
- 富
- 酒吧
- 巴兹
- ux
范例程序
#include <stdio.h>
int main() {
char input[65536];
gets(input);
return input[0] != 0;
}
(b|)(ab)*(a|)
(a
和b
交替)
接受的字符串
a
ba
abababababa
abab
拒绝的字符串
afba
foo
babba
示例程序
#include <stdio.h>
int main() {
char input[65536];
int state = 0;
for (;;) switch (state) {
case 0: switch (getchar()) {
case 'a': state = 1; break;
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 1: switch (getchar()) {
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 2: switch (getchar()) {
case 'a': state = 1; break;
case EOF: return 0;
default: return 1;
} break;
}
(0|1(0|1)*)(|A(0|1)*1)
(二进制浮点数)
接受的字符串
- 10110100
- 0
- 1A00001
拒绝的字符串
- 011
- 10A
- 1A00
- 100A010
return (regex.match(stdin) is not null)
不允许使用类似程序。