FSA가 인식하는 언어가 입력 파일의 행 순서에 따라 달라진다
#next_lambda는 어떤 상태의 엡실론 전이들이 그 상태의 블록 맨 앞에 연속해서 놓여 있다고 가정한다. 첫 줄이 엡실론이 아니면 즉시 break하고, 그 상태의 엡실론 폐포는 통째로 누락된다. 이건 정렬 요구사항이 아니라 그냥 숨은 전제다 — 명세 어디에도 입력 파일이 정렬되어 있다는 말은 없다.
for (auto element : vector<FSATableElement>(begin + start, end)) {
if (not element.str.empty() or element.state != current)
break; // ← 상태의 첫 행이 엡실론이 아니면 폐포를 통째로 포기같은 오토마톤(1 -a→ 2, 2 -z→ 2, 2 -ε→ 3, 3 -b→ 4, 수용상태 4)을 행 순서만 바꿔 두 파일로 만들어 돌린 결과다. 위는 2 2 z가 먼저, 아래는 2 3 #이 먼저다.
$ printf '4\n1 2 a\n2 2 z\n2 3 #\n3 4 b\n' | ./fsa t1.txt input: 'ab' = X input: 'azb' = X $ printf '4\n1 2 a\n2 3 #\n2 2 z\n3 4 b\n' | ./fsa t1b.txt input: 'ab' = O input: 'azb' = O
제공된 data/fsa10.txt·fsa11.txt와 README 예제가 우연히 엡실론 행을 앞에 두고 있어서 이 버그가 드러나지 않는다. isAccept 끝에 붙은 사후 엡실론 폐포(fsa.cc:179–185)가 마지막 상태에 대해서만 한 번 더 보정해 주기 때문에 짧은 예제에서는 더더욱 티가 안 난다. 채점 데이터가 하나만 달랐어도 그대로 터졌을 코드다.