📦 Out of Context リポジトリ

リポジトリ / emssr / independent_common_compiler

r2
r2 emssr1
# -*- coding: utf-8 -*-
r2 emssr2
"""notebooks/ の全セルを compile して実行する。
r2 emssr3
r2 emssr4
    python test_notebook.py
r2 emssr5
r2 emssr6
ブラウザを立てずに kernel だけを確かめる。報告が tu でないセルと、語と箱の
r2 emssr7
対応が崩れたセルを数えて返す。接合秩を宣言したセルは ρ まで取る。
r2 emssr8
"""
r2 emssr9
r2 emssr10
import json
r2 emssr11
import os
r2 emssr12
import sys
r2 emssr13
r2 emssr14
HERE = os.path.dirname(os.path.abspath(__file__))
r2 emssr15
for d in ("runtime", "kernel"):
r2 emssr16
    p = os.path.join(HERE, d)
r2 emssr17
    if p not in sys.path:
r2 emssr18
        sys.path.insert(0, p)
r2 emssr19
r2 emssr20
import joint as joint_mod   # noqa: E402
r2 emssr21
import session              # noqa: E402
r2 emssr22
r2 emssr23
session.start(os.path.join(HERE, "runtime", "commonc_lane64.bin"))
r2 emssr24
_J = []
r2 emssr25
r2 emssr26
r2 emssr27
def joint():
r2 emssr28
    if not _J:
r2 emssr29
        _J.append(joint_mod.Joint(os.path.join(HERE, "runtime", "joinrank.bin"),
r2 emssr30
                                  os.path.join(HERE, "runtime", "joinrank.dic"),
r2 emssr31
                                  os.path.join(HERE, "runtime", "anf.bin")))
r2 emssr32
    return _J[0]
r2 emssr33
r2 emssr34
r2 emssr35
def gamma(sc):
r2 emssr36
    if not sc["gamma"]:
r2 emssr37
        return "(空)"
r2 emssr38
    return "  ".join("語%d=%s" % (g["word"], g["num"] if g["den"] == 1
r2 emssr39
                                  else "%d/%d" % (g["num"], g["den"]))
r2 emssr40
                     for g in sc["gamma"])
r2 emssr41
r2 emssr42
r2 emssr43
def main():
r2 emssr44
    bad = 0
r2 emssr45
    for name in sorted(os.listdir(os.path.join(HERE, "notebooks"))):
r2 emssr46
        if not name.endswith(".json"):
r2 emssr47
            continue
r2 emssr48
        nb = json.load(open(os.path.join(HERE, "notebooks", name), encoding="utf-8"))
r2 emssr49
        print("=== %s  %s" % (name, nb["title"]))
r2 emssr50
        for i, c in enumerate(nb["cells"]):
r2 emssr51
            if c.get("kind") != "cmn":
r2 emssr52
                continue
r2 emssr53
            head = "  [%d]" % (i + 1)
r2 emssr54
            try:
r2 emssr55
                sc = session.cell(c["source"], dic=nb.get("dic"),
r2 emssr56
                                  seeds=c.get("seeds"),
r2 emssr57
                                  words=c.get("words") or session.DEFAULT_WORDS)
r2 emssr58
            except session.CellError as e:
r2 emssr59
                if c.get("expect") == "fail":
r2 emssr60
                    print("%s 誤りの見本として止まった: %s" % (head, str(e)[:52]))
r2 emssr61
                else:
r2 emssr62
                    print("%s  失敗: %s" % (head, e))
r2 emssr63
                    bad += 1
r2 emssr64
                continue
r2 emssr65
            if c.get("expect") == "fail":
r2 emssr66
                print("%s  誤りの見本のはずが通った" % head)
r2 emssr67
                bad += 1
r2 emssr68
            note = ""
r2 emssr69
            if sc["report"] != 0:
r2 emssr70
                note += "  報告 %s" % sc["report"]
r2 emssr71
                bad += 1
r2 emssr72
            if not sc["align"]["ok"]:
r2 emssr73
                note += "  対応なし(%s)" % sc["align"]["why"]
r2 emssr74
            print("%s %-34s 音節%-4d 箱%-5d %s%s"
r2 emssr75
                  % (head, gamma(sc), sc["size"]["syl"], sc["size"]["box"],
r2 emssr76
                     sc["mark"], note))
r2 emssr77
            if c.get("inputs"):
r2 emssr78
                image, _n, _m = session.compile_text(c["source"], nb.get("dic"))
r2 emssr79
                tbl = session.vertices(image, c["inputs"])
r2 emssr80
                r = joint()(tbl, len(c["inputs"]), c.get("cut", len(c["inputs"]) // 2))
r2 emssr81
                print("       接合秩 ρ=%d  カット=%d  表=%s" % (r["rho"], r["cut"], tbl))
r2 emssr82
    # commonc では正しいが、過去に notebook 側の補助語彙だけが古く、
r2 emssr83
    # scope.check が commonc より先に拒否していた回帰。
r2 emssr84
    plane = "we re ka, ki sa ka, ki si ka, ki wi ka, gi ka."
r2 emssr85
    try:
r2 emssr86
        sc = session.cell(plane)
r2 emssr87
        if sc["report"] != 0 or sc["out"][:2] != [1, -1]:
r2 emssr88
            print("  [回帰] ツイ数平面: 実行結果が違う %s" % sc["out"][:2])
r2 emssr89
            bad += 1
r2 emssr90
        else:
r2 emssr91
            print("  [回帰] ツイ数平面: %s → %s" % (plane, sc["out"][:2]))
r2 emssr92
    except session.CellError as e:
r2 emssr93
        print("  [回帰] ツイ数平面: 失敗: %s" % e)
r2 emssr94
        bad += 1
r2 emssr95
r2 emssr96
    print("")
r2 emssr97
    print("閉じなかったセル: %d" % bad)
r2 emssr98
    return 1 if bad else 0
r2 emssr99
r2 emssr100
r2 emssr101
if __name__ == "__main__":
r2 emssr102
    sys.exit(main())