このタスクでは、正規表現を読み取り、その正規表現が入力文字列を受け入れるかどうかを出力する別のプログラムを生成するプログラムを作成する必要があります。出力は、提出物と同じ言語で書かれたプログラムでなければなりません。
入力
入力は、次のABNFに一致する正規表現rです(最初の生産規則はですREGEX
)。
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
入力がこの文法と一致しない場合、プログラムの動作は未定義です。
解釈
入力を正規表現として解釈します。ここ*
で、Kleene-star(左引数を0回以上繰り返すことを意味します)|
は代替で(
あり、)
グループであり、演算子はまったく連結されていません。グループ化はスターより優先され、スターは連結より優先され、連結は代替より優先されます。
正規表現が文字列全体と一致する場合、文字列は受け入れられると言われます。
出力
プログラムの出力は、文字列読み込み、あなたの投稿と同じ言語で書かれた別のプログラムであるのかどうか、実行時に方法を定義した実装では、出力rは受け入れ秒を終了。出力はユーザー定義の方法で実行できますが、受け入れられたプログラムと拒否されたプログラムの出力は2つだけでなければなりません。
出力プログラムの入力が2 16 -1バイトより長くなることはないと想定できます。
制限事項
提出物も、提出物によって生成されたプログラムも、組み込み機能またはライブラリを使用できません。
- 正規表現に一致
- 正規表現を変換する
- 正規表現をコンパイルする
- 文法からパーサーを生成する
- 提出物が簡単になるように問題を簡素化する
得点
提出のスコアは、その文字の数です。最低スコアの提出が勝ちです。
テストケース
すべてのテストケースには、正規表現、受け入れられた文字列のセット、拒否された文字列のセット、および(仮想的な)C99提出の有効な出力であるC99のサンプルプログラムが含まれています。
(空の正規表現)
受け入れられた文字列
- (空の入力)
拒否された文字列
- foo
- バー
- バズ
- クックス
サンプルプログラム
#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)
(2進浮動小数点数)
受け入れられた文字列
- 10110100
- 0
- 1A00001
拒否された文字列
- 011
- 10A
- 1A00
- 100A010
return (regex.match(stdin) is not null)
は許可されていないと思います。