IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

再帰下降パーサで左再帰が何故ダメなのかが分かった

やっと分かった

parse("1+1+1", i);

function parse(expr, i) {
    var left = parse(expr, i);
    if (expr[i++] !== '+') return 1;
    if (expr[i++] !== '1') throw Error;
    return [left, 1]
}

そりゃ無限ループになるわなあ。
手書きパーサなら演算子順位法を使うからいいけど

ちなみに

再帰だとこう

parse("1+1+1", i);

function parse(expr, i) {
    if (expr[i++] !== '1') throw Error;
    if (expr[i++] !== '+') return 1;
    var right = parse(expr, i);
    return [1, right]
}

無限ループしない