{
  "name": "func",
  "word": "identifier",
  "rules": {
    "translation_unit": {
      "type": "REPEAT",
      "content": {
        "type": "SYMBOL",
        "name": "_top_level_item"
      }
    },
    "_top_level_item": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "function_definition"
        },
        {
          "type": "SYMBOL",
          "name": "include_directive"
        },
        {
          "type": "SYMBOL",
          "name": "pragma_directive"
        },
        {
          "type": "SYMBOL",
          "name": "global_var_declarations"
        },
        {
          "type": "SYMBOL",
          "name": "const_var_declarations"
        }
      ]
    },
    "include_directive": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "#include"
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "SYMBOL",
            "name": "_string_literal"
          },
          "named": true,
          "value": "include_path"
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "pragma_directive": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "#pragma"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "STRING",
              "value": "version"
            },
            {
              "type": "STRING",
              "value": "not-version"
            },
            {
              "type": "STRING",
              "value": "test-version-set"
            }
          ]
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "ALIAS",
              "content": {
                "type": "PATTERN",
                "value": "(\\^|<=|>=|<|>|=)"
              },
              "named": true,
              "value": "version_operator"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "STRING",
              "value": "\""
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "\\d"
          },
          "named": true,
          "value": "major_version"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "."
                },
                {
                  "type": "ALIAS",
                  "content": {
                    "type": "PATTERN",
                    "value": "\\d"
                  },
                  "named": true,
                  "value": "minor_version"
                },
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "SEQ",
                      "members": [
                        {
                          "type": "STRING",
                          "value": "."
                        },
                        {
                          "type": "ALIAS",
                          "content": {
                            "type": "PATTERN",
                            "value": "\\d"
                          },
                          "named": true,
                          "value": "patch_version"
                        }
                      ]
                    },
                    {
                      "type": "BLANK"
                    }
                  ]
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "STRING",
              "value": "\""
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "global_var_declarations": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "global"
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "_global_var_declaration"
            },
            {
              "type": "REPEAT",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_global_var_declaration"
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "const_var_declarations": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "const"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "FIELD",
              "name": "type",
              "content": {
                "type": "SYMBOL",
                "name": "_type"
              }
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "_const_var_declaration"
            },
            {
              "type": "REPEAT",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_const_var_declaration"
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_global_var_declaration": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "type",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "_type"
              },
              {
                "type": "BLANK"
              }
            ]
          }
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        }
      ]
    },
    "_const_var_declaration": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "FIELD",
          "name": "value",
          "content": {
            "type": "SYMBOL",
            "name": "_expression"
          }
        }
      ]
    },
    "_type": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_atomic_type"
        },
        {
          "type": "SYMBOL",
          "name": "function_type"
        }
      ]
    },
    "function_type": {
      "type": "PREC_RIGHT",
      "value": 100,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_atomic_type"
          },
          {
            "type": "STRING",
            "value": "->"
          },
          {
            "type": "SYMBOL",
            "name": "_type"
          }
        ]
      }
    },
    "_atomic_type": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "primitive_type"
        },
        {
          "type": "SYMBOL",
          "name": "var"
        },
        {
          "type": "SYMBOL",
          "name": "hole_type"
        },
        {
          "type": "SYMBOL",
          "name": "type_identifier"
        },
        {
          "type": "SYMBOL",
          "name": "tensor_type"
        },
        {
          "type": "SYMBOL",
          "name": "unit_type"
        },
        {
          "type": "SYMBOL",
          "name": "tuple_type"
        },
        {
          "type": "SYMBOL",
          "name": "_parenthesized_type"
        }
      ]
    },
    "_parenthesized_type": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "SYMBOL",
          "name": "_type"
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "primitive_type": {
      "type": "CHOICE",
      "members": [
        {
          "type": "STRING",
          "value": "int"
        },
        {
          "type": "STRING",
          "value": "cell"
        },
        {
          "type": "STRING",
          "value": "slice"
        },
        {
          "type": "STRING",
          "value": "builder"
        },
        {
          "type": "STRING",
          "value": "cont"
        },
        {
          "type": "STRING",
          "value": "tuple"
        }
      ]
    },
    "tensor_type": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "_type"
            },
            {
              "type": "REPEAT1",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_type"
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "tuple_type": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "["
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "_type"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": ","
                      },
                      {
                        "type": "SYMBOL",
                        "name": "_type"
                      }
                    ]
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": "]"
        }
      ]
    },
    "var": {
      "type": "STRING",
      "value": "var"
    },
    "hole_type": {
      "type": "ALIAS",
      "content": {
        "type": "SYMBOL",
        "name": "underscore"
      },
      "named": true,
      "value": "hole_type"
    },
    "unit_type": {
      "type": "STRING",
      "value": "()"
    },
    "type_identifier": {
      "type": "ALIAS",
      "content": {
        "type": "SYMBOL",
        "name": "identifier"
      },
      "named": true,
      "value": "type_identifier"
    },
    "_expression": {
      "type": "SYMBOL",
      "name": "_expr10"
    },
    "_expr10": {
      "type": "PREC",
      "value": 10,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_expr13"
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SEQ",
                "members": [
                  {
                    "type": "CHOICE",
                    "members": [
                      {
                        "type": "STRING",
                        "value": "="
                      },
                      {
                        "type": "STRING",
                        "value": "+="
                      },
                      {
                        "type": "STRING",
                        "value": "-="
                      },
                      {
                        "type": "STRING",
                        "value": "*="
                      },
                      {
                        "type": "STRING",
                        "value": "/="
                      },
                      {
                        "type": "STRING",
                        "value": "~/="
                      },
                      {
                        "type": "STRING",
                        "value": "^/="
                      },
                      {
                        "type": "STRING",
                        "value": "%="
                      },
                      {
                        "type": "STRING",
                        "value": "~%="
                      },
                      {
                        "type": "STRING",
                        "value": "^%="
                      },
                      {
                        "type": "STRING",
                        "value": "<<="
                      },
                      {
                        "type": "STRING",
                        "value": ">>="
                      },
                      {
                        "type": "STRING",
                        "value": "~>>="
                      },
                      {
                        "type": "STRING",
                        "value": "^>>="
                      },
                      {
                        "type": "STRING",
                        "value": "&="
                      },
                      {
                        "type": "STRING",
                        "value": "|="
                      },
                      {
                        "type": "STRING",
                        "value": "^="
                      }
                    ]
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_expr10"
                  }
                ]
              },
              {
                "type": "BLANK"
              }
            ]
          }
        ]
      }
    },
    "_expr13": {
      "type": "PREC",
      "value": 13,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_expr15"
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": "?"
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_expression"
                  },
                  {
                    "type": "STRING",
                    "value": ":"
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_expr13"
                  }
                ]
              },
              {
                "type": "BLANK"
              }
            ]
          }
        ]
      }
    },
    "_expr15": {
      "type": "PREC",
      "value": 15,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_expr17"
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SEQ",
                "members": [
                  {
                    "type": "CHOICE",
                    "members": [
                      {
                        "type": "STRING",
                        "value": "=="
                      },
                      {
                        "type": "STRING",
                        "value": "<"
                      },
                      {
                        "type": "STRING",
                        "value": ">"
                      },
                      {
                        "type": "STRING",
                        "value": "<="
                      },
                      {
                        "type": "STRING",
                        "value": ">="
                      },
                      {
                        "type": "STRING",
                        "value": "!="
                      },
                      {
                        "type": "STRING",
                        "value": "<=>"
                      }
                    ]
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_expr17"
                  }
                ]
              },
              {
                "type": "BLANK"
              }
            ]
          }
        ]
      }
    },
    "_expr17": {
      "type": "PREC_LEFT",
      "value": 17,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_expr20"
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "SEQ",
              "members": [
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "STRING",
                      "value": "<<"
                    },
                    {
                      "type": "STRING",
                      "value": ">>"
                    },
                    {
                      "type": "STRING",
                      "value": "~>>"
                    },
                    {
                      "type": "STRING",
                      "value": "^>>"
                    }
                  ]
                },
                {
                  "type": "SYMBOL",
                  "name": "_expr20"
                }
              ]
            }
          }
        ]
      }
    },
    "_expr20": {
      "type": "PREC_LEFT",
      "value": 20,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "STRING",
                "value": "-"
              },
              {
                "type": "BLANK"
              }
            ]
          },
          {
            "type": "SYMBOL",
            "name": "_expr30"
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "SEQ",
              "members": [
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "STRING",
                      "value": "-"
                    },
                    {
                      "type": "STRING",
                      "value": "+"
                    },
                    {
                      "type": "STRING",
                      "value": "|"
                    },
                    {
                      "type": "STRING",
                      "value": "^"
                    }
                  ]
                },
                {
                  "type": "SYMBOL",
                  "name": "_expr30"
                }
              ]
            }
          }
        ]
      }
    },
    "_expr30": {
      "type": "PREC_LEFT",
      "value": 30,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_expr75"
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "SEQ",
              "members": [
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "STRING",
                      "value": "*"
                    },
                    {
                      "type": "STRING",
                      "value": "/"
                    },
                    {
                      "type": "STRING",
                      "value": "%"
                    },
                    {
                      "type": "STRING",
                      "value": "~/"
                    },
                    {
                      "type": "STRING",
                      "value": "^/"
                    },
                    {
                      "type": "STRING",
                      "value": "~%"
                    },
                    {
                      "type": "STRING",
                      "value": "^%"
                    },
                    {
                      "type": "STRING",
                      "value": "/%"
                    },
                    {
                      "type": "STRING",
                      "value": "&"
                    }
                  ]
                },
                {
                  "type": "SYMBOL",
                  "name": "_expr75"
                }
              ]
            }
          }
        ]
      }
    },
    "_expr75": {
      "type": "PREC",
      "value": 75,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "STRING",
                "value": "~"
              },
              {
                "type": "BLANK"
              }
            ]
          },
          {
            "type": "SYMBOL",
            "name": "_expr80"
          }
        ]
      }
    },
    "_expr80": {
      "type": "PREC_LEFT",
      "value": 80,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_expr90"
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "SYMBOL",
              "name": "method_call"
            }
          }
        ]
      }
    },
    "method_call": {
      "type": "PREC_LEFT",
      "value": 80,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "STRING",
                "value": "."
              },
              {
                "type": "STRING",
                "value": "~"
              }
            ]
          },
          {
            "type": "FIELD",
            "name": "method_name",
            "content": {
              "type": "SYMBOL",
              "name": "identifier"
            }
          },
          {
            "type": "FIELD",
            "name": "arguments",
            "content": {
              "type": "SYMBOL",
              "name": "_expr100"
            }
          }
        ]
      }
    },
    "_expr90": {
      "type": "PREC_LEFT",
      "value": 90,
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_expr100"
          },
          {
            "type": "SYMBOL",
            "name": "variable_declaration"
          },
          {
            "type": "SYMBOL",
            "name": "function_application"
          }
        ]
      }
    },
    "function_application": {
      "type": "PREC_LEFT",
      "value": 90,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "function",
            "content": {
              "type": "SYMBOL",
              "name": "_nontype_expr100"
            }
          },
          {
            "type": "FIELD",
            "name": "arguments",
            "content": {
              "type": "REPEAT1",
              "content": {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "SYMBOL",
                    "name": "identifier"
                  },
                  {
                    "type": "SYMBOL",
                    "name": "parenthesized_expression"
                  },
                  {
                    "type": "SYMBOL",
                    "name": "tensor_expression"
                  },
                  {
                    "type": "SYMBOL",
                    "name": "unit_literal"
                  }
                ]
              }
            }
          }
        ]
      }
    },
    "variable_declaration": {
      "type": "PREC_LEFT",
      "value": 90,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "type",
            "content": {
              "type": "SYMBOL",
              "name": "type_expression"
            }
          },
          {
            "type": "FIELD",
            "name": "variable",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "identifier"
                },
                {
                  "type": "SYMBOL",
                  "name": "tuple_expression"
                },
                {
                  "type": "SYMBOL",
                  "name": "tensor_expression"
                },
                {
                  "type": "SYMBOL",
                  "name": "parenthesized_expression"
                }
              ]
            }
          }
        ]
      }
    },
    "type_expression": {
      "type": "PREC",
      "value": 101,
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "primitive_type"
          },
          {
            "type": "STRING",
            "value": "type"
          },
          {
            "type": "SYMBOL",
            "name": "var"
          },
          {
            "type": "SYMBOL",
            "name": "parenthesized_type_expression"
          },
          {
            "type": "SYMBOL",
            "name": "tensor_type_expression"
          },
          {
            "type": "SYMBOL",
            "name": "tuple_type_expression"
          }
        ]
      }
    },
    "parenthesized_type_expression": {
      "type": "PREC",
      "value": 101,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "("
          },
          {
            "type": "SYMBOL",
            "name": "type_expression"
          },
          {
            "type": "STRING",
            "value": ")"
          }
        ]
      }
    },
    "tensor_type_expression": {
      "type": "PREC",
      "value": 101,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "("
          },
          {
            "type": "SEQ",
            "members": [
              {
                "type": "SYMBOL",
                "name": "type_expression"
              },
              {
                "type": "REPEAT1",
                "content": {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "STRING",
                      "value": ","
                    },
                    {
                      "type": "SYMBOL",
                      "name": "type_expression"
                    }
                  ]
                }
              }
            ]
          },
          {
            "type": "STRING",
            "value": ")"
          }
        ]
      }
    },
    "tuple_type_expression": {
      "type": "PREC",
      "value": 101,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "["
          },
          {
            "type": "SEQ",
            "members": [
              {
                "type": "SYMBOL",
                "name": "type_expression"
              },
              {
                "type": "REPEAT",
                "content": {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "STRING",
                      "value": ","
                    },
                    {
                      "type": "SYMBOL",
                      "name": "type_expression"
                    }
                  ]
                }
              }
            ]
          },
          {
            "type": "STRING",
            "value": "]"
          }
        ]
      }
    },
    "_nontype_expr100": {
      "type": "PREC",
      "value": 100,
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "parenthesized_expression"
          },
          {
            "type": "SYMBOL",
            "name": "tensor_expression"
          },
          {
            "type": "SYMBOL",
            "name": "tuple_expression"
          },
          {
            "type": "SYMBOL",
            "name": "unit_literal"
          },
          {
            "type": "SYMBOL",
            "name": "primitive_type"
          },
          {
            "type": "SYMBOL",
            "name": "identifier"
          },
          {
            "type": "SYMBOL",
            "name": "number"
          },
          {
            "type": "SYMBOL",
            "name": "underscore"
          },
          {
            "type": "SYMBOL",
            "name": "string"
          }
        ]
      }
    },
    "_expr100": {
      "type": "PREC",
      "value": 100,
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "type_expression"
          },
          {
            "type": "SYMBOL",
            "name": "_nontype_expr100"
          }
        ]
      }
    },
    "unit_literal": {
      "type": "STRING",
      "value": "()"
    },
    "parenthesized_expression": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "SYMBOL",
          "name": "_expression"
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "tensor_expression": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "_expression"
            },
            {
              "type": "REPEAT1",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_expression"
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "tuple_expression": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "["
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "_expression"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": ","
                      },
                      {
                        "type": "SYMBOL",
                        "name": "_expression"
                      }
                    ]
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": "]"
        }
      ]
    },
    "function_definition": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "type_variables",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "type_variables_list"
              },
              {
                "type": "BLANK"
              }
            ]
          }
        },
        {
          "type": "FIELD",
          "name": "return_type",
          "content": {
            "type": "SYMBOL",
            "name": "_type"
          }
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "function_name"
          }
        },
        {
          "type": "FIELD",
          "name": "arguments",
          "content": {
            "type": "SYMBOL",
            "name": "parameter_list"
          }
        },
        {
          "type": "FIELD",
          "name": "specifiers",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "STRING",
                    "value": "impure"
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              },
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "SYMBOL",
                    "name": "inline"
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              },
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "SYMBOL",
                    "name": "method_id"
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              }
            ]
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "STRING",
              "value": ";"
            },
            {
              "type": "FIELD",
              "name": "body",
              "content": {
                "type": "SYMBOL",
                "name": "block_statement"
              }
            },
            {
              "type": "FIELD",
              "name": "asm_body",
              "content": {
                "type": "SYMBOL",
                "name": "asm_function_body"
              }
            }
          ]
        }
      ]
    },
    "function_name": {
      "type": "PATTERN",
      "value": "(`.*`)|((\\.|~)?(([a-zA-Z_](\\w|['?:])+)|([a-zA-Z])))"
    },
    "inline": {
      "type": "CHOICE",
      "members": [
        {
          "type": "STRING",
          "value": "inline"
        },
        {
          "type": "STRING",
          "value": "inline_ref"
        }
      ]
    },
    "method_id": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "method_id"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "("
                },
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "SYMBOL",
                      "name": "number"
                    },
                    {
                      "type": "SYMBOL",
                      "name": "string"
                    }
                  ]
                },
                {
                  "type": "STRING",
                  "value": ")"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "type_variables_list": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "forall"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "CHOICE",
                      "members": [
                        {
                          "type": "STRING",
                          "value": "type"
                        },
                        {
                          "type": "BLANK"
                        }
                      ]
                    },
                    {
                      "type": "SYMBOL",
                      "name": "type_identifier"
                    }
                  ]
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": ","
                      },
                      {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "CHOICE",
                            "members": [
                              {
                                "type": "STRING",
                                "value": "type"
                              },
                              {
                                "type": "BLANK"
                              }
                            ]
                          },
                          {
                            "type": "SYMBOL",
                            "name": "type_identifier"
                          }
                        ]
                      }
                    ]
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": "->"
        }
      ]
    },
    "parameter_list": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "parameter_declaration"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": ","
                      },
                      {
                        "type": "SYMBOL",
                        "name": "parameter_declaration"
                      }
                    ]
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "parameter_declaration": {
      "type": "PREC",
      "value": 1,
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SEQ",
            "members": [
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "FIELD",
                    "name": "type",
                    "content": {
                      "type": "SYMBOL",
                      "name": "_type"
                    }
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              },
              {
                "type": "ALIAS",
                "content": {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "FIELD",
                      "name": "name",
                      "content": {
                        "type": "SYMBOL",
                        "name": "identifier"
                      }
                    },
                    {
                      "type": "SYMBOL",
                      "name": "underscore"
                    }
                  ]
                },
                "named": true,
                "value": "parameter"
              }
            ]
          },
          {
            "type": "FIELD",
            "name": "type",
            "content": {
              "type": "SYMBOL",
              "name": "_type"
            }
          }
        ]
      }
    },
    "asm_function_body": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "asm_specifier"
        },
        {
          "type": "REPEAT1",
          "content": {
            "type": "SYMBOL",
            "name": "asm_instruction"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "asm_specifier": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "asm"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "("
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "ALIAS",
                    "content": {
                      "type": "SYMBOL",
                      "name": "identifier"
                    },
                    "named": true,
                    "value": "parameter"
                  }
                },
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "SEQ",
                      "members": [
                        {
                          "type": "STRING",
                          "value": "->"
                        },
                        {
                          "type": "REPEAT",
                          "content": {
                            "type": "SYMBOL",
                            "name": "number"
                          }
                        }
                      ]
                    },
                    {
                      "type": "BLANK"
                    }
                  ]
                },
                {
                  "type": "STRING",
                  "value": ")"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "asm_instruction": {
      "type": "CHOICE",
      "members": [
        {
          "type": "PREC",
          "value": 2,
          "content": {
            "type": "SYMBOL",
            "name": "multiline_asm_instruction"
          }
        },
        {
          "type": "PREC",
          "value": 1,
          "content": {
            "type": "ALIAS",
            "content": {
              "type": "TOKEN",
              "content": {
                "type": "PATTERN",
                "value": "\"[^\"]*\""
              }
            },
            "named": true,
            "value": "asm_instruction"
          }
        }
      ]
    },
    "multiline_asm_instruction": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "\"\"\""
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "ALIAS",
            "content": {
              "type": "SYMBOL",
              "name": "_multiline_string_fragment"
            },
            "named": true,
            "value": "multiline_string_fragment"
          }
        },
        {
          "type": "STRING",
          "value": "\"\"\""
        }
      ]
    },
    "_multiline_string_fragment": {
      "type": "PREC_RIGHT",
      "value": 0,
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "PATTERN",
            "value": "[^\"]+"
          },
          {
            "type": "SEQ",
            "members": [
              {
                "type": "PATTERN",
                "value": "\"[^\"]*\""
              },
              {
                "type": "REPEAT",
                "content": {
                  "type": "PATTERN",
                  "value": "[^\"]+"
                }
              }
            ]
          }
        ]
      }
    },
    "_statement": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "return_statement"
        },
        {
          "type": "SYMBOL",
          "name": "block_statement"
        },
        {
          "type": "SYMBOL",
          "name": "expression_statement"
        },
        {
          "type": "SYMBOL",
          "name": "empty_statement"
        },
        {
          "type": "SYMBOL",
          "name": "repeat_statement"
        },
        {
          "type": "SYMBOL",
          "name": "if_statement"
        },
        {
          "type": "SYMBOL",
          "name": "do_statement"
        },
        {
          "type": "SYMBOL",
          "name": "while_statement"
        },
        {
          "type": "SYMBOL",
          "name": "try_statement"
        }
      ]
    },
    "return_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "return"
        },
        {
          "type": "SYMBOL",
          "name": "_expression"
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "block_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "{"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_statement"
          }
        },
        {
          "type": "STRING",
          "value": "}"
        }
      ]
    },
    "expression_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_expression"
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "empty_statement": {
      "type": "STRING",
      "value": ";"
    },
    "repeat_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "repeat"
        },
        {
          "type": "FIELD",
          "name": "count",
          "content": {
            "type": "SYMBOL",
            "name": "_expression"
          }
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "block_statement"
          }
        }
      ]
    },
    "if_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "STRING",
              "value": "if"
            },
            {
              "type": "STRING",
              "value": "ifnot"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_if_statement_contents"
        }
      ]
    },
    "_if_statement_contents": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "condition",
          "content": {
            "type": "SYMBOL",
            "name": "_expression"
          }
        },
        {
          "type": "FIELD",
          "name": "consequent",
          "content": {
            "type": "SYMBOL",
            "name": "block_statement"
          }
        },
        {
          "type": "FIELD",
          "name": "alternative",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": "else"
                      },
                      {
                        "type": "SYMBOL",
                        "name": "block_statement"
                      }
                    ]
                  },
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "CHOICE",
                        "members": [
                          {
                            "type": "STRING",
                            "value": "elseif"
                          },
                          {
                            "type": "STRING",
                            "value": "elseifnot"
                          }
                        ]
                      },
                      {
                        "type": "SYMBOL",
                        "name": "_if_statement_contents"
                      }
                    ]
                  }
                ]
              },
              {
                "type": "BLANK"
              }
            ]
          }
        }
      ]
    },
    "do_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "do"
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "block_statement"
          }
        },
        {
          "type": "STRING",
          "value": "until"
        },
        {
          "type": "FIELD",
          "name": "postcondition",
          "content": {
            "type": "SYMBOL",
            "name": "_expression"
          }
        }
      ]
    },
    "while_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "while"
        },
        {
          "type": "FIELD",
          "name": "precondition",
          "content": {
            "type": "SYMBOL",
            "name": "_expression"
          }
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "block_statement"
          }
        }
      ]
    },
    "try_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "try"
        },
        {
          "type": "STRING",
          "value": "{"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_statement"
          }
        },
        {
          "type": "STRING",
          "value": "}"
        },
        {
          "type": "STRING",
          "value": "catch"
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "STRING",
              "value": "("
            },
            {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "SYMBOL",
                      "name": "identifier"
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "STRING",
                            "value": ","
                          },
                          {
                            "type": "SYMBOL",
                            "name": "identifier"
                          }
                        ]
                      }
                    }
                  ]
                },
                {
                  "type": "BLANK"
                }
              ]
            },
            {
              "type": "STRING",
              "value": ")"
            }
          ]
        },
        {
          "type": "STRING",
          "value": "{"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_statement"
          }
        },
        {
          "type": "STRING",
          "value": "}"
        }
      ]
    },
    "number": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "STRING",
                "value": "-"
              },
              {
                "type": "BLANK"
              }
            ]
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": "0x"
                  },
                  {
                    "type": "PATTERN",
                    "value": "[0-9a-fA-F]+"
                  }
                ]
              },
              {
                "type": "PATTERN",
                "value": "[0-9]+"
              }
            ]
          }
        ]
      }
    },
    "string": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_string_literal"
        },
        {
          "type": "SYMBOL",
          "name": "_raw_slice_const"
        },
        {
          "type": "SYMBOL",
          "name": "_slice_const_address"
        },
        {
          "type": "SYMBOL",
          "name": "_int_const_hex"
        },
        {
          "type": "SYMBOL",
          "name": "_string_sha_first_32"
        },
        {
          "type": "SYMBOL",
          "name": "_string_sha_256"
        },
        {
          "type": "SYMBOL",
          "name": "_string_crc_32"
        }
      ]
    },
    "_string_literal": {
      "type": "PATTERN",
      "value": "\"[^\"]*\""
    },
    "_raw_slice_const": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_string_literal"
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "STRING",
            "value": "s"
          },
          "named": true,
          "value": "string_type"
        }
      ]
    },
    "_slice_const_address": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_string_literal"
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "STRING",
            "value": "a"
          },
          "named": true,
          "value": "string_type"
        }
      ]
    },
    "_int_const_hex": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_string_literal"
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "STRING",
            "value": "u"
          },
          "named": true,
          "value": "string_type"
        }
      ]
    },
    "_string_sha_first_32": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_string_literal"
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "STRING",
            "value": "h"
          },
          "named": true,
          "value": "string_type"
        }
      ]
    },
    "_string_sha_256": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_string_literal"
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "STRING",
            "value": "H"
          },
          "named": true,
          "value": "string_type"
        }
      ]
    },
    "_string_crc_32": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_string_literal"
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "STRING",
            "value": "c"
          },
          "named": true,
          "value": "string_type"
        }
      ]
    },
    "identifier": {
      "type": "PATTERN",
      "value": "(`.*`)|([a-zA-Z_](\\w|['?:])+)|([a-zA-Z])"
    },
    "underscore": {
      "type": "STRING",
      "value": "_"
    },
    "comment": {
      "type": "TOKEN",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": ";;"
              },
              {
                "type": "PATTERN",
                "value": "[^\\n]*"
              }
            ]
          },
          {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "{-"
              },
              {
                "type": "REPEAT",
                "content": {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "PATTERN",
                      "value": "[^-{]"
                    },
                    {
                      "type": "PATTERN",
                      "value": "-[^}]"
                    },
                    {
                      "type": "PATTERN",
                      "value": "\\{[^-]"
                    },
                    {
                      "type": "SEQ",
                      "members": [
                        {
                          "type": "STRING",
                          "value": "{-"
                        },
                        {
                          "type": "REPEAT",
                          "content": {
                            "type": "CHOICE",
                            "members": [
                              {
                                "type": "PATTERN",
                                "value": "[^-{]"
                              },
                              {
                                "type": "PATTERN",
                                "value": "-[^}]"
                              },
                              {
                                "type": "PATTERN",
                                "value": "\\{[^-]"
                              },
                              {
                                "type": "SEQ",
                                "members": [
                                  {
                                    "type": "STRING",
                                    "value": "{-"
                                  },
                                  {
                                    "type": "REPEAT",
                                    "content": {
                                      "type": "CHOICE",
                                      "members": [
                                        {
                                          "type": "PATTERN",
                                          "value": "[^-{]"
                                        },
                                        {
                                          "type": "PATTERN",
                                          "value": "-[^}]"
                                        },
                                        {
                                          "type": "PATTERN",
                                          "value": "\\{[^-]"
                                        },
                                        {
                                          "type": "SEQ",
                                          "members": [
                                            {
                                              "type": "STRING",
                                              "value": "{-"
                                            },
                                            {
                                              "type": "REPEAT",
                                              "content": {
                                                "type": "CHOICE",
                                                "members": [
                                                  {
                                                    "type": "PATTERN",
                                                    "value": "[^-{]"
                                                  },
                                                  {
                                                    "type": "PATTERN",
                                                    "value": "-[^}]"
                                                  },
                                                  {
                                                    "type": "PATTERN",
                                                    "value": "\\{[^-]"
                                                  },
                                                  {
                                                    "type": "SEQ",
                                                    "members": [
                                                      {
                                                        "type": "STRING",
                                                        "value": "{-"
                                                      },
                                                      {
                                                        "type": "REPEAT",
                                                        "content": {
                                                          "type": "CHOICE",
                                                          "members": [
                                                            {
                                                              "type": "PATTERN",
                                                              "value": "[^-{]"
                                                            },
                                                            {
                                                              "type": "PATTERN",
                                                              "value": "-[^}]"
                                                            },
                                                            {
                                                              "type": "PATTERN",
                                                              "value": "\\{[^-]"
                                                            },
                                                            {
                                                              "type": "SEQ",
                                                              "members": [
                                                                {
                                                                  "type": "STRING",
                                                                  "value": "{-"
                                                                },
                                                                {
                                                                  "type": "PATTERN",
                                                                  "value": "[^-]*-+([^-}][^-]*-+)*"
                                                                },
                                                                {
                                                                  "type": "STRING",
                                                                  "value": "}"
                                                                }
                                                              ]
                                                            }
                                                          ]
                                                        }
                                                      },
                                                      {
                                                        "type": "STRING",
                                                        "value": "-}"
                                                      }
                                                    ]
                                                  }
                                                ]
                                              }
                                            },
                                            {
                                              "type": "STRING",
                                              "value": "-}"
                                            }
                                          ]
                                        }
                                      ]
                                    }
                                  },
                                  {
                                    "type": "STRING",
                                    "value": "-}"
                                  }
                                ]
                              }
                            ]
                          }
                        },
                        {
                          "type": "STRING",
                          "value": "-}"
                        }
                      ]
                    }
                  ]
                }
              },
              {
                "type": "STRING",
                "value": "-}"
              }
            ]
          }
        ]
      }
    }
  },
  "extras": [
    {
      "type": "PATTERN",
      "value": "\\s"
    },
    {
      "type": "SYMBOL",
      "name": "comment"
    }
  ],
  "conflicts": [],
  "precedences": [],
  "externals": [],
  "inline": [],
  "supertypes": []
}

