マーク付き文字列解析器の整理 #2

mclexをgetcharのように使う分には簡単に書ける。

mclex_test.c
#include <stdio.h>
#include "mclex.h"
#include "y.tab.h"

int main(void)
{
    int eof = 0;
    do {
        int c = mclex();
        switch (c) {
        case EOF:
            eof = 1;
            break;
        case START_MARK:
            printf("START_MARK\n");
            break;
        case END_MARK:
            printf("END_MARK\n");
            break;
        case START_ANNOTATION:
            printf("START_ANNOTATION\n");
            break;
        default:
            printf("CHARACTER: %c\n", c);
            break;
        }
    } while (! eof);
    return 0;
}

実際のメタ文字が何であってもmclexが返すのは種類を表した定数値であるので、
今までのyylexで行ってきたように返ってきた値を具体的なメタ文字を格納した変数と比較する必要がなくなる。

$ echo -n "ab(cd:ef)gh" | ./mclex_test
CHARACTER: a
CHARACTER: b
START_MARK
CHARACTER: c
CHARACTER: d
START_ANNOTATION
CHARACTER: e
CHARACTER: f
END_MARK
CHARACTER: g
CHARACTER: h

$ echo -n "((<<)><: <a b>c</a>" | ./mclex_test
START_MARK
CHARACTER: a
START_ANNOTATION
CHARACTER: b
END_MARK
CHARACTER: c
START_MARK
CHARACTER: /
CHARACTER: a
END_MARK

メタ文字変更シーケンスの解析も機能しているようである。