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

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

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

繰り返しの記法を追加します。また、C# 版では数値の演算が追加されていたのでそれも追加します。

  • かっこを使うことができるとします。
  • 「式 *」は式の繰り返し(一回もない場合も含む)を表します。
  • 「式 +」は式の繰り返し(一回は必要)を表します。
  • 「式1 &* 式2」は式1の後に「式2 & 式1」が繰り返された(一回もない場合も含む)ものを表します。「&*」の優先順位は「&」と「|」の間とします。
  • 「/」で囲まれた部分に式を書くことができるとします。この中で
    • 「[」と「]」で囲まれた一文字はその文字を表します。
    • 「[」と「]」で囲まれた「文字1-文字2」は文字1から文字2までのコードの文字のどれかを表します。
  • 「"」で囲まれた部分(文字列リテラル)と「/」で囲まれた部分以外では空白は無視されるとします。
def program = statement_block;

def statement_block = statement &* ";";

def statement =
      definition
    | expression_statement;

def definition =  "def" & identifier & "(" & (parameter_name &* ",") & ")" & "=" & expression;

def expression_statement = expression;

def expression = term &* "&";

def term =
      domain_expression
    | function
    | domain_function;

def function = "$" & identifier & "(" & (expression &* ",") & ")";

def domain_function = identifier & "(" & (domain_expression &* ",") & ")";

def domain_expression = domain_product &* "+";

def domain_product = domain_unary &* "*";

def domain_unary =
      domain_term;
    | "-" & domain_unary;

def domain_term =
      identifier
    | number;

def parameter_name = /([A-Z]|[a-z]|[_])&([A-Z]|[a-z]|[0-9]|[_])*/;
def identifier = /([A-Z]|[a-z]|[_])&([A-Z]|[a-z]|[0-9]|[_])*/;
def number = /[0-9]+/;

program