非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

モノイド的構文解析(6)

モノイド的構文解析言語 MonParser - MonParser の構文解析(C# 形式)

MonParser (C# 形式) バージョン 0.1

最初に定義した MonParser は BNFPython 版 MonIter の形式で書くものです。これは BNF 形式ということにします。MonParser (C# 形式)を MonParser (BNF 形式)と同じことができるようにします。以下のように構成されたものを「構文式」と呼ぶことにします。

  • 「str(文字列)」は構文木で使われない文字列を表します。文字列は正規表現を表します。
  • 「st(文字列)」は構文木で使われない文字列を表します。文字列は正規表現ではありません。
  • 「opr(文字列)」は構文木で使う文字列を表します。文字列は正規表現を表します。
  • 「op(文字列)」は構文木で使う文字列を表します。文字列は正規表現ではありません。
  • 「list(構文式, 区切りの構文式)」は区切りで区切られたリストを表します。
  • 「preun(構文式, 演算子の構文式)」は前置単項演算子の式を表します。
  • 「postun(構文式, 演算子の構文式)」は後置単項演算子の式を表します。
  • 「leftbin(構文式, 演算子の構文式)」は左結合二項演算子の式を表します。
  • 「rightbin(構文式, 演算子の構文式)」は右結合二項演算子の式を表します。
  • 「構文式1 & 構文式2」は構文式1と構文式2が連続する構文を表します。
  • 「構文式1 | 構文式2」は構文式1と構文式2のどちらかが成立することを表します。
  • 「構文式 * n」(n は 0 以上の整数)は構文式が n 回以上繰り返される構文を表します。
  • 「構文式 ^ コンストラクター」は構文式で表された構文を表し、構文式から構文木を構成します。
MonParser (BNF 形式)の構文解析(C# 形式)

MonParser (C# 形式) バージョン 0.1 で MonParser (BNF 形式)の構文を書きます。

        par str(string s) => par.StringRegExp(s);
        par st(string s) => par.String(s);
        par opr(string s) => par.OperatorRegExp(s);
        par op(string s) => par.Operator(s);
        par list(par p, par s) => par.List(p, s);
        par preun(par p, par op) => par.PrefixUnary(p, op);
        par postun(par p, par op) => par.PostfixUnary(p, op);
        par leftbin(par p, par op) => par.LeftBinary(p, op);
        par rightbin(par p, par op) => par.RightBinary(p, op);

        par string_ => str(@""".*""");
        par operator_ => str(@"'.*'");
        par identifier => str(@"[A-Za-z_][A-Za-z0-9_]*");
        par constructor => str(@"[A-Za-z_][A-Za-z0-9_]*");

        par term =>
              st("(") & expression & st(")")
            | string_
            | operator_
            | identifier
            | constructor;

        par unary_operator => op("*") | op("+");

        par unary_expression =>
            postun(term, unary_operator) ^ SyntaxTree.UnaryExpression;

        par conjunction => list(term, st("&")) ^ SyntaxTree.Conjunction;

        par assoc_operator => op("&*") | op("*&");

        par assoc =>
              conjunction
            | conjunction & assoc_operator & operator_ ^ SyntaxTree.AssocExpression;

        par construction =>
              assoc
            | assoc & st("->") & constructor ^ SyntaxTree.Construction;

        par expression => list(construction, st("|")) ^ SyntaxTree.Expression;

        par expression_statement => expression ^ SyntaxTree.ExpressionStatement;

        par definition => st("def") & identifier & st("=") & expression ^ SyntaxTree.Definition;

        par statement =>
              definition
            | expression_statement;

        par program => list(statement, st(";")) ^ SyntaxTree.Program_;