モノイド的構文解析言語 MonParser - MonParser の構文解析(C# 形式)
MonParser (C# 形式) バージョン 0.1
最初に定義した MonParser は BNF を Python 版 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_;


