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

mclexを使うように今までのyylexを書き直すための原型を書いてみた。
といってもyylexの骨格はそのままで、
文字の取得をmclexによるトークンの取得に置き換えただけである。

mclex_test2.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 [%c]\n", mclval);
            break;
        default:
            printf("NORMAL_STRING [");
            for (;;) {
                printf("%c", c);
                c = mclex();
                switch (c) {
                case EOF:
                case START_MARK:
                case END_MARK:
                case START_ANNOTATION:
                    mcunput(c);
                    printf("]\n");
                    goto eos;
                }
            }
            eos:
            break;
        }
    } while (! eof);
    return 0;
}
$ echo -n "ab(cd:ef)gh" | ./mclex_test2
NORMAL_STRING [ab]
START_MARK
NORMAL_STRING [cd]
START_ANNOTATION [:]
NORMAL_STRING [ef]
END_MARK
NORMAL_STRING [gh]

$ echo -n "((<<)><: <a b>c</a>" | ./mclex_test2
START_MARK
NORMAL_STRING [a]
START_ANNOTATION [ ]
NORMAL_STRING [b]
END_MARK
NORMAL_STRING [c]
START_MARK
NORMAL_STRING [/a]
END_MARK

NORMAL_STRINGは構文解析器でのトークン識別子でいえばSTRING_EXCEPT_SPECIALに相当する。