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

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

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

モノイド的構文解析言語 MonParser (C# 形式 バージョン 0.2)

MonParser (BNF 形式)の構文解析

「par」はパーサーを表すクラス、「syn」は構文木を表すクラスです。

        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 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 =>
            term > unary_operator ^ syn.UnaryExpression;

        par conjunction => term >> st("&") ^ syn.Conjunction;

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

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

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

        par expression => construction >> st("|") ^ syn.Expression;

        par expression_statement => expression ^ syn.ExpressionStatement;

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

        par statement =>
              definition
            | expression_statement;

        par program => statement >> st(";") ^ syn.Program_;