繰り返しの記法を追加します。また、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

