plum

#treesitter#compiler#wasm

git clone https://git.pyrossh.dev/plum

A statically typed, imperative programming language inspired by rust, python


plum-tooling/tree-sitter-plum/src/grammar.json
{
  "$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
  "name": "plum",
  "rules": {
    "source": {
      "type": "SEQ",
      "members": [
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "module"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "import"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "trait"
              },
              {
                "type": "SYMBOL",
                "name": "enum"
              },
              {
                "type": "SYMBOL",
                "name": "fn"
              },
              {
                "type": "SYMBOL",
                "name": "const"
              },
              {
                "type": "SYMBOL",
                "name": "test"
              }
            ]
          }
        }
      ]
    },
    "module": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "module"
        },
        {
          "type": "SYMBOL",
          "name": "mod_identifier"
        }
      ]
    },
    "import": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "import"
        },
        {
          "type": "SYMBOL",
          "name": "url"
        }
      ]
    },
    "url": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "url_segment"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "/"
              },
              {
                "type": "SYMBOL",
                "name": "url_segment"
              }
            ]
          }
        }
      ]
    },
    "url_segment": {
      "type": "PATTERN",
      "value": "[a-zA-Z_][a-zA-Z_0-9]*"
    },
    "generics": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "["
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "generic_type"
            },
            {
              "type": "REPEAT",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "SYMBOL",
                    "name": "generic_type"
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "STRING",
          "value": "]"
        }
      ]
    },
    "generic_type": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "generic"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": ":"
                },
                {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "SYMBOL",
                      "name": "type_identifier"
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "STRING",
                            "value": "+"
                          },
                          {
                            "type": "SYMBOL",
                            "name": "type_identifier"
                          }
                        ]
                      }
                    }
                  ]
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "type": {
      "type": "CHOICE",
      "members": [
        {
          "type": "PREC",
          "value": 24,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "SYMBOL",
                "name": "type_identifier"
              },
              {
                "type": "FIELD",
                "name": "generics",
                "content": {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "SEQ",
                      "members": [
                        {
                          "type": "STRING",
                          "value": "["
                        },
                        {
                          "type": "SEQ",
                          "members": [
                            {
                              "type": "SYMBOL",
                              "name": "type"
                            },
                            {
                              "type": "REPEAT",
                              "content": {
                                "type": "SEQ",
                                "members": [
                                  {
                                    "type": "STRING",
                                    "value": ","
                                  },
                                  {
                                    "type": "SYMBOL",
                                    "name": "type"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        {
                          "type": "STRING",
                          "value": "]"
                        }
                      ]
                    },
                    {
                      "type": "BLANK"
                    }
                  ]
                }
              }
            ]
          }
        },
        {
          "type": "SYMBOL",
          "name": "generic"
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "STRING",
              "value": "["
            },
            {
              "type": "STRING",
              "value": "]"
            },
            {
              "type": "FIELD",
              "name": "element",
              "content": {
                "type": "SYMBOL",
                "name": "type"
              }
            }
          ]
        }
      ]
    },
    "variadic_type": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "..."
        },
        {
          "type": "SYMBOL",
          "name": "type"
        }
      ]
    },
    "trait": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "trait"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "type_identifier"
          }
        },
        {
          "type": "FIELD",
          "name": "generics",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "generics"
              },
              {
                "type": "BLANK"
              }
            ]
          }
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "SYMBOL",
          "name": "_indent"
        },
        {
          "type": "FIELD",
          "name": "fields",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "REPEAT",
                "content": {
                  "type": "ALIAS",
                  "content": {
                    "type": "SYMBOL",
                    "name": "trait_field"
                  },
                  "named": true,
                  "value": "field"
                }
              },
              {
                "type": "BLANK"
              }
            ]
          }
        },
        {
          "type": "SYMBOL",
          "name": "_dedent"
        }
      ]
    },
    "trait_field": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "fn_identifier"
          }
        },
        {
          "type": "FIELD",
          "name": "params",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "("
              },
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "CHOICE",
                        "members": [
                          {
                            "type": "SYMBOL",
                            "name": "self"
                          },
                          {
                            "type": "SYMBOL",
                            "name": "param"
                          }
                        ]
                      },
                      {
                        "type": "REPEAT",
                        "content": {
                          "type": "SEQ",
                          "members": [
                            {
                              "type": "STRING",
                              "value": ","
                            },
                            {
                              "type": "CHOICE",
                              "members": [
                                {
                                  "type": "SYMBOL",
                                  "name": "self"
                                },
                                {
                                  "type": "SYMBOL",
                                  "name": "param"
                                }
                              ]
                            }
                          ]
                        }
                      }
                    ]
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              },
              {
                "type": "STRING",
                "value": ")"
              }
            ]
          }
        },
        {
          "type": "FIELD",
          "name": "returns",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": "->"
                  },
                  {
                    "type": "SYMBOL",
                    "name": "type"
                  }
                ]
              },
              {
                "type": "BLANK"
              }
            ]
          }
        }
      ]
    },
    "param": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "var_identifier"
          }
        },
        {
          "type": "STRING",
          "value": ":"
        },
        {
          "type": "FIELD",
          "name": "type",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "type"
              },
              {
                "type": "SYMBOL",
                "name": "variadic_type"
              },
              {
                "type": "SYMBOL",
                "name": "fn_value_type"
              }
            ]
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "="
                },
                {
                  "type": "FIELD",
                  "name": "value",
                  "content": {
                    "type": "SYMBOL",
                    "name": "expression"
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "fn_value_type": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "fn"
        },
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "FIELD",
          "name": "params",
          "content": {
            "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": ")"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "->"
                },
                {
                  "type": "FIELD",
                  "name": "returns",
                  "content": {
                    "type": "SYMBOL",
                    "name": "type"
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "enum": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "enum"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "type_identifier"
          }
        },
        {
          "type": "FIELD",
          "name": "generics",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "generics"
              },
              {
                "type": "BLANK"
              }
            ]
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "CHOICE",
              "members": [
                {
                  "type": "FIELD",
                  "name": "implements",
                  "content": {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": "("
                      },
                      {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "SYMBOL",
                            "name": "type_identifier"
                          },
                          {
                            "type": "REPEAT",
                            "content": {
                              "type": "SEQ",
                              "members": [
                                {
                                  "type": "STRING",
                                  "value": ","
                                },
                                {
                                  "type": "SYMBOL",
                                  "name": "type_identifier"
                                }
                              ]
                            }
                          }
                        ]
                      },
                      {
                        "type": "STRING",
                        "value": ")"
                      }
                    ]
                  }
                },
                {
                  "type": "FIELD",
                  "name": "params",
                  "content": {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": "("
                      },
                      {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "SYMBOL",
                            "name": "enum_param"
                          },
                          {
                            "type": "REPEAT",
                            "content": {
                              "type": "SEQ",
                              "members": [
                                {
                                  "type": "STRING",
                                  "value": ","
                                },
                                {
                                  "type": "SYMBOL",
                                  "name": "enum_param"
                                }
                              ]
                            }
                          }
                        ]
                      },
                      {
                        "type": "STRING",
                        "value": ")"
                      }
                    ]
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "SYMBOL",
          "name": "_indent"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "REPEAT",
              "content": {
                "type": "ALIAS",
                "content": {
                  "type": "SYMBOL",
                  "name": "enum_field"
                },
                "named": true,
                "value": "field"
              }
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "FIELD",
          "name": "methods",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "REPEAT",
                "content": {
                  "type": "SYMBOL",
                  "name": "fn"
                }
              },
              {
                "type": "BLANK"
              }
            ]
          }
        },
        {
          "type": "SYMBOL",
          "name": "_dedent"
        }
      ]
    },
    "enum_param": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "var_identifier"
          }
        },
        {
          "type": "STRING",
          "value": ":"
        },
        {
          "type": "FIELD",
          "name": "type",
          "content": {
            "type": "SYMBOL",
            "name": "type"
          }
        }
      ]
    },
    "enum_field": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "|"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "type_identifier"
          }
        },
        {
          "type": "FIELD",
          "name": "parameters",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": "("
                      },
                      {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "SYMBOL",
                            "name": "type"
                          },
                          {
                            "type": "REPEAT",
                            "content": {
                              "type": "SEQ",
                              "members": [
                                {
                                  "type": "STRING",
                                  "value": ","
                                },
                                {
                                  "type": "SYMBOL",
                                  "name": "type"
                                }
                              ]
                            }
                          }
                        ]
                      },
                      {
                        "type": "STRING",
                        "value": ")"
                      }
                    ]
                  },
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": "("
                      },
                      {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "SYMBOL",
                            "name": "enum_named_field"
                          },
                          {
                            "type": "REPEAT",
                            "content": {
                              "type": "SEQ",
                              "members": [
                                {
                                  "type": "STRING",
                                  "value": ","
                                },
                                {
                                  "type": "SYMBOL",
                                  "name": "enum_named_field"
                                }
                              ]
                            }
                          }
                        ]
                      },
                      {
                        "type": "STRING",
                        "value": ")"
                      }
                    ]
                  },
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": "("
                      },
                      {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "SYMBOL",
                            "name": "expression"
                          },
                          {
                            "type": "REPEAT",
                            "content": {
                              "type": "SEQ",
                              "members": [
                                {
                                  "type": "STRING",
                                  "value": ","
                                },
                                {
                                  "type": "SYMBOL",
                                  "name": "expression"
                                }
                              ]
                            }
                          }
                        ]
                      },
                      {
                        "type": "STRING",
                        "value": ")"
                      }
                    ]
                  }
                ]
              },
              {
                "type": "BLANK"
              }
            ]
          }
        }
      ]
    },
    "enum_named_field": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "var_identifier"
          }
        },
        {
          "type": "STRING",
          "value": ":"
        },
        {
          "type": "FIELD",
          "name": "type",
          "content": {
            "type": "SYMBOL",
            "name": "type"
          }
        }
      ]
    },
    "fn": {
      "type": "PREC_LEFT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "externKw",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "STRING",
                  "value": "extern"
                },
                {
                  "type": "BLANK"
                }
              ]
            }
          },
          {
            "type": "STRING",
            "value": "fun"
          },
          {
            "type": "FIELD",
            "name": "name",
            "content": {
              "type": "SYMBOL",
              "name": "fn_identifier"
            }
          },
          {
            "type": "FIELD",
            "name": "params",
            "content": {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "("
                },
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "SEQ",
                      "members": [
                        {
                          "type": "CHOICE",
                          "members": [
                            {
                              "type": "SYMBOL",
                              "name": "self"
                            },
                            {
                              "type": "SYMBOL",
                              "name": "param"
                            }
                          ]
                        },
                        {
                          "type": "REPEAT",
                          "content": {
                            "type": "SEQ",
                            "members": [
                              {
                                "type": "STRING",
                                "value": ","
                              },
                              {
                                "type": "CHOICE",
                                "members": [
                                  {
                                    "type": "SYMBOL",
                                    "name": "self"
                                  },
                                  {
                                    "type": "SYMBOL",
                                    "name": "param"
                                  }
                                ]
                              }
                            ]
                          }
                        }
                      ]
                    },
                    {
                      "type": "BLANK"
                    }
                  ]
                },
                {
                  "type": "STRING",
                  "value": ")"
                }
              ]
            }
          },
          {
            "type": "FIELD",
            "name": "returns",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "STRING",
                      "value": "->"
                    },
                    {
                      "type": "SYMBOL",
                      "name": "type"
                    }
                  ]
                },
                {
                  "type": "BLANK"
                }
              ]
            }
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "FIELD",
                "name": "body",
                "content": {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "STRING",
                      "value": "="
                    },
                    {
                      "type": "CHOICE",
                      "members": [
                        {
                          "type": "SYMBOL",
                          "name": "expression"
                        },
                        {
                          "type": "SYMBOL",
                          "name": "body"
                        }
                      ]
                    }
                  ]
                }
              },
              {
                "type": "BLANK"
              }
            ]
          }
        ]
      }
    },
    "body": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_indent"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_statement"
          }
        },
        {
          "type": "SYMBOL",
          "name": "_dedent"
        }
      ]
    },
    "test": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "test"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "string"
          }
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "body"
          }
        }
      ]
    },
    "_statement": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "assign"
        },
        {
          "type": "SYMBOL",
          "name": "break"
        },
        {
          "type": "SYMBOL",
          "name": "continue"
        },
        {
          "type": "SYMBOL",
          "name": "assert"
        },
        {
          "type": "SYMBOL",
          "name": "for"
        },
        {
          "type": "SYMBOL",
          "name": "while"
        },
        {
          "type": "SYMBOL",
          "name": "if"
        },
        {
          "type": "SYMBOL",
          "name": "match"
        },
        {
          "type": "SYMBOL",
          "name": "return"
        },
        {
          "type": "SYMBOL",
          "name": "todo"
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        }
      ]
    },
    "const": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "const_identifier"
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        }
      ]
    },
    "field_target": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "object",
          "content": {
            "type": "SYMBOL",
            "name": "primary_expression"
          }
        },
        {
          "type": "STRING",
          "value": "."
        },
        {
          "type": "FIELD",
          "name": "member",
          "content": {
            "type": "SYMBOL",
            "name": "fn_identifier"
          }
        }
      ]
    },
    "assign": {
      "type": "SEQ",
      "members": [
        {
          "type": "SEQ",
          "members": [
            {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "var_identifier"
                },
                {
                  "type": "SYMBOL",
                  "name": "field_target"
                }
              ]
            },
            {
              "type": "REPEAT",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "CHOICE",
                    "members": [
                      {
                        "type": "SYMBOL",
                        "name": "var_identifier"
                      },
                      {
                        "type": "SYMBOL",
                        "name": "field_target"
                      }
                    ]
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "FIELD",
          "name": "op",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "STRING",
                "value": "="
              },
              {
                "type": "STRING",
                "value": ":="
              }
            ]
          }
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "expression"
            },
            {
              "type": "REPEAT",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "SYMBOL",
                    "name": "expression"
                  }
                ]
              }
            }
          ]
        }
      ]
    },
    "assert": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "assert"
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        }
      ]
    },
    "return": {
      "type": "PREC_RIGHT",
      "value": 2,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "return"
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "expression"
              },
              {
                "type": "BLANK"
              }
            ]
          }
        ]
      }
    },
    "break": {
      "type": "PREC_LEFT",
      "value": 0,
      "content": {
        "type": "STRING",
        "value": "break"
      }
    },
    "continue": {
      "type": "PREC_LEFT",
      "value": 0,
      "content": {
        "type": "STRING",
        "value": "continue"
      }
    },
    "todo": {
      "type": "PREC_LEFT",
      "value": 0,
      "content": {
        "type": "STRING",
        "value": "todo"
      }
    },
    "if": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "if"
        },
        {
          "type": "FIELD",
          "name": "condition",
          "content": {
            "type": "SYMBOL",
            "name": "expression"
          }
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "body"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "FIELD",
            "name": "alternative",
            "content": {
              "type": "SYMBOL",
              "name": "else_if"
            }
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "FIELD",
              "name": "otherwise",
              "content": {
                "type": "SYMBOL",
                "name": "else"
              }
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "else_if": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "else if"
        },
        {
          "type": "FIELD",
          "name": "condition",
          "content": {
            "type": "SYMBOL",
            "name": "expression"
          }
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "body"
          }
        }
      ]
    },
    "else": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "else"
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "body"
          }
        }
      ]
    },
    "for": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "for"
        },
        {
          "type": "FIELD",
          "name": "left",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "SYMBOL",
                "name": "var_identifier"
              },
              {
                "type": "REPEAT",
                "content": {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "STRING",
                      "value": ","
                    },
                    {
                      "type": "SYMBOL",
                      "name": "var_identifier"
                    }
                  ]
                }
              }
            ]
          }
        },
        {
          "type": "STRING",
          "value": ":="
        },
        {
          "type": "STRING",
          "value": "range"
        },
        {
          "type": "FIELD",
          "name": "right",
          "content": {
            "type": "SYMBOL",
            "name": "primary_expression"
          }
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "body"
          }
        }
      ]
    },
    "while": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "while"
        },
        {
          "type": "FIELD",
          "name": "condition",
          "content": {
            "type": "SYMBOL",
            "name": "expression"
          }
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "SYMBOL",
            "name": "body"
          }
        }
      ]
    },
    "dotted_name": {
      "type": "PREC",
      "value": 1,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "var_identifier"
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "."
                },
                {
                  "type": "SYMBOL",
                  "name": "var_identifier"
                }
              ]
            }
          }
        ]
      }
    },
    "match": {
      "type": "PREC_LEFT",
      "value": 0,
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "match"
              },
              {
                "type": "SEQ",
                "members": [
                  {
                    "type": "FIELD",
                    "name": "subject",
                    "content": {
                      "type": "SYMBOL",
                      "name": "expression"
                    }
                  },
                  {
                    "type": "REPEAT",
                    "content": {
                      "type": "SEQ",
                      "members": [
                        {
                          "type": "STRING",
                          "value": ","
                        },
                        {
                          "type": "FIELD",
                          "name": "subject",
                          "content": {
                            "type": "SYMBOL",
                            "name": "expression"
                          }
                        }
                      ]
                    }
                  }
                ]
              },
              {
                "type": "SYMBOL",
                "name": "_indent"
              },
              {
                "type": "REPEAT",
                "content": {
                  "type": "FIELD",
                  "name": "case",
                  "content": {
                    "type": "SYMBOL",
                    "name": "case"
                  }
                }
              },
              {
                "type": "SYMBOL",
                "name": "_dedent"
              }
            ]
          },
          {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "match"
              },
              {
                "type": "SYMBOL",
                "name": "_indent"
              },
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "FIELD",
                        "name": "case",
                        "content": {
                          "type": "SYMBOL",
                          "name": "guard_case"
                        }
                      },
                      {
                        "type": "REPEAT",
                        "content": {
                          "type": "SEQ",
                          "members": [
                            {
                              "type": "SYMBOL",
                              "name": "_arm_break"
                            },
                            {
                              "type": "FIELD",
                              "name": "case",
                              "content": {
                                "type": "SYMBOL",
                                "name": "guard_case"
                              }
                            }
                          ]
                        }
                      }
                    ]
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              },
              {
                "type": "SYMBOL",
                "name": "_dedent"
              }
            ]
          }
        ]
      }
    },
    "case": {
      "type": "SEQ",
      "members": [
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "case_pattern"
            },
            {
              "type": "REPEAT",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "SYMBOL",
                    "name": "case_pattern"
                  }
                ]
              }
            }
          ]
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "when"
                },
                {
                  "type": "FIELD",
                  "name": "guard",
                  "content": {
                    "type": "SYMBOL",
                    "name": "expression"
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": "=>"
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "expression"
              },
              {
                "type": "SYMBOL",
                "name": "body"
              }
            ]
          }
        }
      ]
    },
    "case_pattern": {
      "type": "PREC",
      "value": 1,
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "class_pattern"
          },
          {
            "type": "SYMBOL",
            "name": "type_identifier"
          },
          {
            "type": "SYMBOL",
            "name": "string"
          },
          {
            "type": "SYMBOL",
            "name": "integer"
          },
          {
            "type": "SYMBOL",
            "name": "float"
          },
          {
            "type": "SYMBOL",
            "name": "dotted_name"
          },
          {
            "type": "STRING",
            "value": "_"
          }
        ]
      }
    },
    "guard_case": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "|"
        },
        {
          "type": "FIELD",
          "name": "guard",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "expression"
              },
              {
                "type": "STRING",
                "value": "_"
              }
            ]
          }
        },
        {
          "type": "STRING",
          "value": "=>"
        },
        {
          "type": "FIELD",
          "name": "body",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "expression"
              },
              {
                "type": "SYMBOL",
                "name": "body"
              }
            ]
          }
        }
      ]
    },
    "class_pattern": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "type_identifier"
        },
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "SYMBOL",
                      "name": "case_pattern"
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "STRING",
                            "value": ","
                          },
                          {
                            "type": "SYMBOL",
                            "name": "case_pattern"
                          }
                        ]
                      }
                    }
                  ]
                },
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "STRING",
                      "value": ","
                    },
                    {
                      "type": "BLANK"
                    }
                  ]
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "expression": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "comparison_operator"
        },
        {
          "type": "SYMBOL",
          "name": "not_operator"
        },
        {
          "type": "SYMBOL",
          "name": "boolean_operator"
        },
        {
          "type": "SYMBOL",
          "name": "closure"
        },
        {
          "type": "SYMBOL",
          "name": "primary_expression"
        },
        {
          "type": "SYMBOL",
          "name": "ternary_expression"
        },
        {
          "type": "SYMBOL",
          "name": "elvis_expression"
        }
      ]
    },
    "primary_expression": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "binary_operator"
        },
        {
          "type": "SYMBOL",
          "name": "self"
        },
        {
          "type": "SYMBOL",
          "name": "var_identifier"
        },
        {
          "type": "SYMBOL",
          "name": "type_identifier"
        },
        {
          "type": "SYMBOL",
          "name": "const_identifier"
        },
        {
          "type": "SYMBOL",
          "name": "string"
        },
        {
          "type": "SYMBOL",
          "name": "integer"
        },
        {
          "type": "SYMBOL",
          "name": "float"
        },
        {
          "type": "SYMBOL",
          "name": "unary_operator"
        },
        {
          "type": "SYMBOL",
          "name": "attribute"
        },
        {
          "type": "SYMBOL",
          "name": "try_expression"
        },
        {
          "type": "SYMBOL",
          "name": "safe_attribute"
        },
        {
          "type": "SYMBOL",
          "name": "fn_call"
        },
        {
          "type": "SYMBOL",
          "name": "class_call"
        },
        {
          "type": "SYMBOL",
          "name": "parenthesized_expression"
        }
      ]
    },
    "parenthesized_expression": {
      "type": "PREC",
      "value": 1,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "{"
          },
          {
            "type": "SYMBOL",
            "name": "expression"
          },
          {
            "type": "STRING",
            "value": "}"
          }
        ]
      }
    },
    "not_operator": {
      "type": "PREC",
      "value": 12,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "!"
          },
          {
            "type": "FIELD",
            "name": "argument",
            "content": {
              "type": "SYMBOL",
              "name": "expression"
            }
          }
        ]
      }
    },
    "boolean_operator": {
      "type": "CHOICE",
      "members": [
        {
          "type": "PREC_LEFT",
          "value": 11,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "&&"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 10,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "||"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "expression"
                }
              }
            ]
          }
        }
      ]
    },
    "binary_operator": {
      "type": "CHOICE",
      "members": [
        {
          "type": "PREC_LEFT",
          "value": 18,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "+"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 18,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "-"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 19,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "*"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 19,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "/"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 19,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "%"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 14,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "|"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 15,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "&"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 16,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "^"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 17,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": "<<"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": 17,
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "FIELD",
                "name": "left",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              },
              {
                "type": "FIELD",
                "name": "operator",
                "content": {
                  "type": "STRING",
                  "value": ">>"
                }
              },
              {
                "type": "FIELD",
                "name": "right",
                "content": {
                  "type": "SYMBOL",
                  "name": "primary_expression"
                }
              }
            ]
          }
        }
      ]
    },
    "unary_operator": {
      "type": "PREC",
      "value": 20,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "operator",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "STRING",
                  "value": "+"
                },
                {
                  "type": "STRING",
                  "value": "-"
                }
              ]
            }
          },
          {
            "type": "FIELD",
            "name": "argument",
            "content": {
              "type": "SYMBOL",
              "name": "primary_expression"
            }
          }
        ]
      }
    },
    "comparison_operator": {
      "type": "PREC_LEFT",
      "value": 13,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "primary_expression"
          },
          {
            "type": "FIELD",
            "name": "operator",
            "content": {
              "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": "primary_expression"
          }
        ]
      }
    },
    "closure": {
      "type": "PREC",
      "value": -2,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "|"
          },
          {
            "type": "FIELD",
            "name": "parameters",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "SYMBOL",
                      "name": "var_identifier"
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "STRING",
                            "value": ","
                          },
                          {
                            "type": "SYMBOL",
                            "name": "var_identifier"
                          }
                        ]
                      }
                    }
                  ]
                },
                {
                  "type": "BLANK"
                }
              ]
            }
          },
          {
            "type": "STRING",
            "value": "|"
          },
          {
            "type": "FIELD",
            "name": "body",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "expression"
                },
                {
                  "type": "SYMBOL",
                  "name": "body"
                }
              ]
            }
          }
        ]
      }
    },
    "attribute": {
      "type": "PREC",
      "value": 23,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "object",
            "content": {
              "type": "SYMBOL",
              "name": "primary_expression"
            }
          },
          {
            "type": "STRING",
            "value": "."
          },
          {
            "type": "FIELD",
            "name": "member",
            "content": {
              "type": "SYMBOL",
              "name": "fn_identifier"
            }
          },
          {
            "type": "FIELD",
            "name": "arguments",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "fn_argument_list"
                },
                {
                  "type": "BLANK"
                }
              ]
            }
          }
        ]
      }
    },
    "try_expression": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "value",
          "content": {
            "type": "SYMBOL",
            "name": "primary_expression"
          }
        },
        {
          "type": "STRING",
          "value": "?"
        }
      ]
    },
    "safe_attribute": {
      "type": "PREC",
      "value": 23,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "object",
            "content": {
              "type": "SYMBOL",
              "name": "primary_expression"
            }
          },
          {
            "type": "STRING",
            "value": "?."
          },
          {
            "type": "FIELD",
            "name": "member",
            "content": {
              "type": "SYMBOL",
              "name": "fn_identifier"
            }
          },
          {
            "type": "FIELD",
            "name": "arguments",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "fn_argument_list"
                },
                {
                  "type": "BLANK"
                }
              ]
            }
          }
        ]
      }
    },
    "fn_call": {
      "type": "PREC",
      "value": 23,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "function",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "var_identifier"
                },
                {
                  "type": "SYMBOL",
                  "name": "type_identifier"
                }
              ]
            }
          },
          {
            "type": "FIELD",
            "name": "arguments",
            "content": {
              "type": "SYMBOL",
              "name": "fn_argument_list"
            }
          }
        ]
      }
    },
    "fn_argument_list": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "SYMBOL",
                      "name": "expression"
                    },
                    {
                      "type": "SYMBOL",
                      "name": "keyword_argument"
                    },
                    {
                      "type": "SYMBOL",
                      "name": "pair_argument"
                    }
                  ]
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": ","
                      },
                      {
                        "type": "CHOICE",
                        "members": [
                          {
                            "type": "SYMBOL",
                            "name": "expression"
                          },
                          {
                            "type": "SYMBOL",
                            "name": "keyword_argument"
                          },
                          {
                            "type": "SYMBOL",
                            "name": "pair_argument"
                          }
                        ]
                      }
                    ]
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "STRING",
              "value": ","
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "keyword_argument": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "var_identifier"
          }
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "FIELD",
          "name": "value",
          "content": {
            "type": "SYMBOL",
            "name": "expression"
          }
        }
      ]
    },
    "pair_argument": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "string"
          }
        },
        {
          "type": "STRING",
          "value": "=>"
        },
        {
          "type": "FIELD",
          "name": "value",
          "content": {
            "type": "SYMBOL",
            "name": "expression"
          }
        }
      ]
    },
    "class_call": {
      "type": "PREC",
      "value": 23,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "type",
            "content": {
              "type": "SYMBOL",
              "name": "type_identifier"
            }
          },
          {
            "type": "FIELD",
            "name": "generics",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "STRING",
                      "value": "["
                    },
                    {
                      "type": "SEQ",
                      "members": [
                        {
                          "type": "SYMBOL",
                          "name": "type"
                        },
                        {
                          "type": "REPEAT",
                          "content": {
                            "type": "SEQ",
                            "members": [
                              {
                                "type": "STRING",
                                "value": ","
                              },
                              {
                                "type": "SYMBOL",
                                "name": "type"
                              }
                            ]
                          }
                        }
                      ]
                    },
                    {
                      "type": "STRING",
                      "value": "]"
                    }
                  ]
                },
                {
                  "type": "BLANK"
                }
              ]
            }
          },
          {
            "type": "FIELD",
            "name": "arguments",
            "content": {
              "type": "SYMBOL",
              "name": "class_argument_list"
            }
          }
        ]
      }
    },
    "class_argument_list": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "CHOICE",
                      "members": [
                        {
                          "type": "SYMBOL",
                          "name": "spread_argument"
                        },
                        {
                          "type": "SYMBOL",
                          "name": "field_argument"
                        }
                      ]
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "STRING",
                            "value": ","
                          },
                          {
                            "type": "CHOICE",
                            "members": [
                              {
                                "type": "SYMBOL",
                                "name": "spread_argument"
                              },
                              {
                                "type": "SYMBOL",
                                "name": "field_argument"
                              }
                            ]
                          }
                        ]
                      }
                    }
                  ]
                },
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "STRING",
                      "value": ","
                    },
                    {
                      "type": "BLANK"
                    }
                  ]
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "field_argument": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "var_identifier"
          }
        },
        {
          "type": "STRING",
          "value": ":"
        },
        {
          "type": "FIELD",
          "name": "value",
          "content": {
            "type": "SYMBOL",
            "name": "expression"
          }
        }
      ]
    },
    "spread_argument": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": ".."
        },
        {
          "type": "FIELD",
          "name": "value",
          "content": {
            "type": "SYMBOL",
            "name": "expression"
          }
        }
      ]
    },
    "ternary_expression": {
      "type": "PREC_RIGHT",
      "value": -1,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "expression"
          },
          {
            "type": "STRING",
            "value": "?"
          },
          {
            "type": "SYMBOL",
            "name": "expression"
          },
          {
            "type": "STRING",
            "value": ":"
          },
          {
            "type": "SYMBOL",
            "name": "expression"
          }
        ]
      }
    },
    "elvis_expression": {
      "type": "PREC_RIGHT",
      "value": -1,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "expression"
          },
          {
            "type": "STRING",
            "value": "?:"
          },
          {
            "type": "SYMBOL",
            "name": "expression"
          }
        ]
      }
    },
    "string": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "string_start"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "interpolation"
              },
              {
                "type": "SYMBOL",
                "name": "string_content"
              }
            ]
          }
        },
        {
          "type": "SYMBOL",
          "name": "string_end"
        }
      ]
    },
    "string_content": {
      "type": "PREC_RIGHT",
      "value": 0,
      "content": {
        "type": "REPEAT1",
        "content": {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "escape_interpolation"
            },
            {
              "type": "SYMBOL",
              "name": "escape_sequence"
            },
            {
              "type": "SYMBOL",
              "name": "_not_escape_sequence"
            },
            {
              "type": "SYMBOL",
              "name": "_string_content"
            }
          ]
        }
      }
    },
    "interpolation": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "{"
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "STRING",
          "value": "}"
        }
      ]
    },
    "escape_sequence": {
      "type": "IMMEDIATE_TOKEN",
      "content": {
        "type": "PREC",
        "value": 1,
        "content": {
          "type": "SEQ",
          "members": [
            {
              "type": "STRING",
              "value": "\\"
            },
            {
              "type": "CHOICE",
              "members": [
                {
                  "type": "PATTERN",
                  "value": "u[a-fA-F\\d]{4}"
                },
                {
                  "type": "PATTERN",
                  "value": "U[a-fA-F\\d]{8}"
                },
                {
                  "type": "PATTERN",
                  "value": "x[a-fA-F\\d]{2}"
                },
                {
                  "type": "PATTERN",
                  "value": "\\d{1,3}"
                },
                {
                  "type": "PATTERN",
                  "value": "\\r?\\n"
                },
                {
                  "type": "PATTERN",
                  "value": "['\"abfrntv\\\\]"
                },
                {
                  "type": "PATTERN",
                  "value": "N\\{[^}]+\\}"
                }
              ]
            }
          ]
        }
      }
    },
    "_not_escape_sequence": {
      "type": "IMMEDIATE_TOKEN",
      "content": {
        "type": "STRING",
        "value": "\\"
      }
    },
    "float": {
      "type": "TOKEN",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SEQ",
            "members": [
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "TOKEN",
                        "content": {
                          "type": "SEQ",
                          "members": [
                            {
                              "type": "PATTERN",
                              "value": "[0-9]+"
                            },
                            {
                              "type": "REPEAT",
                              "content": {
                                "type": "SEQ",
                                "members": [
                                  {
                                    "type": "PATTERN",
                                    "value": "_+"
                                  },
                                  {
                                    "type": "PATTERN",
                                    "value": "[0-9]+"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "type": "TOKEN",
                        "content": {
                          "type": "SEQ",
                          "members": [
                            {
                              "type": "PATTERN",
                              "value": "[eE]"
                            },
                            {
                              "type": "CHOICE",
                              "members": [
                                {
                                  "type": "PATTERN",
                                  "value": "[+-]"
                                },
                                {
                                  "type": "BLANK"
                                }
                              ]
                            },
                            {
                              "type": "TOKEN",
                              "content": {
                                "type": "SEQ",
                                "members": [
                                  {
                                    "type": "PATTERN",
                                    "value": "[0-9]+"
                                  },
                                  {
                                    "type": "REPEAT",
                                    "content": {
                                      "type": "SEQ",
                                      "members": [
                                        {
                                          "type": "PATTERN",
                                          "value": "_+"
                                        },
                                        {
                                          "type": "PATTERN",
                                          "value": "[0-9]+"
                                        }
                                      ]
                                    }
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      }
                    ]
                  },
                  {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "CHOICE",
                        "members": [
                          {
                            "type": "TOKEN",
                            "content": {
                              "type": "SEQ",
                              "members": [
                                {
                                  "type": "PATTERN",
                                  "value": "[0-9]+"
                                },
                                {
                                  "type": "REPEAT",
                                  "content": {
                                    "type": "SEQ",
                                    "members": [
                                      {
                                        "type": "PATTERN",
                                        "value": "_+"
                                      },
                                      {
                                        "type": "PATTERN",
                                        "value": "[0-9]+"
                                      }
                                    ]
                                  }
                                }
                              ]
                            }
                          },
                          {
                            "type": "BLANK"
                          }
                        ]
                      },
                      {
                        "type": "STRING",
                        "value": "."
                      },
                      {
                        "type": "TOKEN",
                        "content": {
                          "type": "SEQ",
                          "members": [
                            {
                              "type": "PATTERN",
                              "value": "[0-9]+"
                            },
                            {
                              "type": "REPEAT",
                              "content": {
                                "type": "SEQ",
                                "members": [
                                  {
                                    "type": "PATTERN",
                                    "value": "_+"
                                  },
                                  {
                                    "type": "PATTERN",
                                    "value": "[0-9]+"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "type": "CHOICE",
                        "members": [
                          {
                            "type": "TOKEN",
                            "content": {
                              "type": "SEQ",
                              "members": [
                                {
                                  "type": "PATTERN",
                                  "value": "[eE]"
                                },
                                {
                                  "type": "CHOICE",
                                  "members": [
                                    {
                                      "type": "PATTERN",
                                      "value": "[+-]"
                                    },
                                    {
                                      "type": "BLANK"
                                    }
                                  ]
                                },
                                {
                                  "type": "TOKEN",
                                  "content": {
                                    "type": "SEQ",
                                    "members": [
                                      {
                                        "type": "PATTERN",
                                        "value": "[0-9]+"
                                      },
                                      {
                                        "type": "REPEAT",
                                        "content": {
                                          "type": "SEQ",
                                          "members": [
                                            {
                                              "type": "PATTERN",
                                              "value": "_+"
                                            },
                                            {
                                              "type": "PATTERN",
                                              "value": "[0-9]+"
                                            }
                                          ]
                                        }
                                      }
                                    ]
                                  }
                                }
                              ]
                            }
                          },
                          {
                            "type": "BLANK"
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "PATTERN",
                    "value": "[fF]"
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              }
            ]
          },
          {
            "type": "SEQ",
            "members": [
              {
                "type": "TOKEN",
                "content": {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "PATTERN",
                      "value": "[0-9]+"
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "PATTERN",
                            "value": "_+"
                          },
                          {
                            "type": "PATTERN",
                            "value": "[0-9]+"
                          }
                        ]
                      }
                    }
                  ]
                }
              },
              {
                "type": "PATTERN",
                "value": "[fF]"
              }
            ]
          }
        ]
      }
    },
    "integer": {
      "type": "CHOICE",
      "members": [
        {
          "type": "TOKEN",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "PATTERN",
                    "value": "[1-9]"
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              },
              {
                "type": "TOKEN",
                "content": {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "PATTERN",
                      "value": "[0-9]+"
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "PATTERN",
                            "value": "_+"
                          },
                          {
                            "type": "PATTERN",
                            "value": "[0-9]+"
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        },
        {
          "type": "TOKEN",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "0"
              },
              {
                "type": "PATTERN",
                "value": "[xX]"
              },
              {
                "type": "TOKEN",
                "content": {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "PATTERN",
                      "value": "[0-9a-fA-F]+"
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "PATTERN",
                            "value": "_+"
                          },
                          {
                            "type": "PATTERN",
                            "value": "[0-9a-fA-F]+"
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        },
        {
          "type": "TOKEN",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "0"
              },
              {
                "type": "PATTERN",
                "value": "[bB]"
              },
              {
                "type": "TOKEN",
                "content": {
                  "type": "SEQ",
                  "members": [
                    {
                      "type": "PATTERN",
                      "value": "[01]"
                    },
                    {
                      "type": "REPEAT",
                      "content": {
                        "type": "SEQ",
                        "members": [
                          {
                            "type": "PATTERN",
                            "value": "_+"
                          },
                          {
                            "type": "PATTERN",
                            "value": "[01]"
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    },
    "self": {
      "type": "PATTERN",
      "value": "self"
    },
    "comment": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "#"
          },
          {
            "type": "PATTERN",
            "value": ".*"
          }
        ]
      }
    },
    "identifier": {
      "type": "PATTERN",
      "value": "[_a-z][_a-zA-Z0-9]*"
    },
    "generic": {
      "type": "PATTERN",
      "value": "[A-Z]"
    },
    "mod_identifier": {
      "type": "PATTERN",
      "value": "[a-z][a-z0-9]*(_[a-z0-9]+)*"
    },
    "const_identifier": {
      "type": "PATTERN",
      "value": "[A-Z][A-Z0-9]*(_[A-Z0-9]+)*"
    },
    "var_identifier": {
      "type": "PATTERN",
      "value": "[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*"
    },
    "fn_identifier": {
      "type": "PATTERN",
      "value": "[a-z][a-zA-Z0-9]*"
    },
    "type_identifier": {
      "type": "PATTERN",
      "value": "[A-Z][a-zA-Z0-9]+"
    }
  },
  "extras": [
    {
      "type": "SYMBOL",
      "name": "comment"
    },
    {
      "type": "PATTERN",
      "value": "[\\s\\f\\uFEFF\\u2060\\u200B]|\\r?\\n"
    }
  ],
  "conflicts": [
    [
      "fn_argument_list",
      "class_argument_list"
    ],
    [
      "expression",
      "try_expression"
    ]
  ],
  "precedences": [],
  "externals": [
    {
      "type": "SYMBOL",
      "name": "_newline"
    },
    {
      "type": "SYMBOL",
      "name": "_indent"
    },
    {
      "type": "SYMBOL",
      "name": "_dedent"
    },
    {
      "type": "SYMBOL",
      "name": "string_start"
    },
    {
      "type": "SYMBOL",
      "name": "_string_content"
    },
    {
      "type": "SYMBOL",
      "name": "escape_interpolation"
    },
    {
      "type": "SYMBOL",
      "name": "string_end"
    },
    {
      "type": "SYMBOL",
      "name": "comment"
    },
    {
      "type": "STRING",
      "value": "]"
    },
    {
      "type": "STRING",
      "value": ")"
    },
    {
      "type": "STRING",
      "value": "}"
    },
    {
      "type": "SYMBOL",
      "name": "_arm_break"
    }
  ],
  "inline": [
    "generic_type"
  ],
  "supertypes": [],
  "reserved": {}
}