マーク付けに使う文字の変更 #3

複数の種類のメタ文字を同じ文字に指定すると、

int yylex(void)
...snip
    if (c == start_mark_char) return START_MARK;
    if (c == end_mark_char) return END_MARK;
    if (c == start_annotation_char) {
...snip
        return START_ANNOTATION;
    }

なので、START_MARK > END_MARK > START_ANNOTATIONの順で、返される終端記号の種類が優先される。
そんな変な指定をすること自体がエラー的なので、そのような指定があればエラーを返すようにすべきだろう。

int main(int argc, char *argv[])
...snip
    while ((opt = getopt(argc, argv, "s:e:a:")) != -1) {
...snip
    }
    if (start_mark_char == end_mark_char || end_mark_char == start_annotation_char || start_annotation_char == start_mark_char) {
        fprintf(stderr, "error: meta characters must differ from each other\n");
        exit(1);
    }
    return yyparse();
...snip
$ echo -n "abcabc" | ./parser -sa -ea
error: meta characters must differ from each other

$ echo -n "abcabc" | ./parser -sa -ec
marked-string [b]
marked-string [b]