QUEENA

Queena・CHUKEI Playground

Z80文字出力はCHUKEIのみ対応。

1 コードを書く

main.🐧

3 Z80 CONSOLE

待機中

実行で表示。

しくみを見る 開いて確認

01 トークン

実行で表示。

    02 構文木

    実行で表示。

    03 生成コード Z80アセンブリ
    実行で表示。
    04 実行ステップ

    CHUKEIのみ対応。

    使い方・仕様

    naku:出力 / moshi:分岐 / aruku:ループ / zz:コメント

    Zig/WASM → Z80アセンブリ → 機械語 → 既存Z80エミュレータ。CP/Mはコンソール出力のみ。

    すべてブラウザ内で処理。コードは送信しません。トークン・構文木は実際の解析結果です。Queenaの列位置はUTF-8バイト単位。

    文法・実装コード

    Queena · EBNF

    program = { statement } ;
    statement = identifier, "=", expression
      | "naku", "(", expression, ")"
      | "moshi", "(", expression, ")", block,
        { "mata", "(", expression, ")", block }, [ "hoka", block ]
      | "aruku", "(", expression, ")", block
      | "tobu" | "hashiru" ;
    block = "{", { statement }, "}" ;
    expression = comparison, { "==", comparison } ;
    comparison = sum, [ ("<" | ">"), sum ] ;
    sum = product, { ("+" | "-"), product } ;
    product = primary, { ("*" | "/"), primary } ;
    primary = integer | identifier | "(", expression, ")" ;
    integer = digit, { digit } ;
    identifier = letter, { letter | digit } ;
    letter = "A"…"Z" | "a"…"z" | "_" ;
    digit = "0"…"9" ;

    トークン単位の文法。identifierは予約語を除く。整数は0〜65535。空白・改行を読み飛ばし、// と予約語 zz は行末までコメント。

    優先順位:括弧 → * / → + − → < > → ==。反復演算は左結合。tobu・hashiruはループ内のみ。1<2<3、単項 −、文字列、;、<=、>=、!=、% は未対応。

    比較式 → 構文木

        fn comparison(self: *Self) ParseError!*Node {
            var left = try self.term();
    
            // 比較演算は1回のみ許可(連鎖比較は非許可)
            if (self.match(.less) or self.match(.greater)) {
                const operator = self.previous;
                const right = try self.term();
                left = self.tree.createNode(
                    .binary,
                    .{ .binary = .{ .left = left, .operator = operator, .right = right } },
                    null,
                ) catch return ParseError.OutOfMemory;
            }
    
            return left;
        }
    

    左右の式をBinaryノードにする実コード。比較の連鎖はifで制限。

    Parser · Lexer · Z80生成

    Zig/WASMで解析・Z80アセンブリ生成 → アセンブル → 既存Z80エミュレータ。naku(1+2*3) → 7。

    EBNF:{ } 繰り返し / [ ] 省略可能 / | 選択 / , 連結

    図で見る

    イラストで見る、コードから実行まで

    画像をタップすると原寸で開けます。

    入力するときは括弧を付けてください。 図の表記は説明用です。実際のコードは naku(3)、naku(3 + 2) です。

    コードを書く → コンパイラで Z80 アセンブリに変換 → アセンブラで機械語に変換 → Z80 エミュレータで実行。naku 3 の出力は 3。すべてブラウザ内で動作。
    ① 実行までの全体像。既存の Z80 CPU エミュレータを使っています。
    コンパイラの仕組み。naku 3 + 2 を字句解析でトークンに分割し、構文解析で構文木に組み立て、Z80 アセンブリを生成。アセンブラとエミュレータを経て結果 5 を出力。
    ② コンパイラの内部。字句解析 → 構文解析 → コード生成。

    実行中…