{
  "name": "named_precedences",

  "extras": [
    {
      "type": "PATTERN",
      "value": "\\s+"
    }
  ],

  "precedences": [
    [
      {"type": "SYMBOL", "name": "member_expression"},
      {"type": "STRING", "value": "and"},
      {"type": "STRING", "value": "or"}
    ],
    [
      {"type": "SYMBOL", "name": "nested_type"},
      {"type": "STRING", "value": "type_intersection"},
      {"type": "STRING", "value": "type_union"}
    ]
  ],

  "conflicts": [
    ["expression", "type"],
    ["expression", "nested_type"]
  ],

  "rules": {
    "program": {
      "type": "REPEAT",
      "content": {
        "type": "CHOICE",
        "members": [
          {"type": "SYMBOL", "name": "expression_statement"},
          {"type": "SYMBOL", "name": "declaration_statement"}
        ]
      }
    },

    "expression_statement": {
      "type": "SEQ",
      "members": [
        {"type": "SYMBOL", "name": "expression"},
        {"type": "STRING", "value": ";"}
      ]
    },

    "declaration_statement": {
      "type": "SEQ",
      "members": [
        {"type": "SYMBOL", "name": "type"},
        {"type": "SYMBOL", "name": "expression"},
        {"type": "STRING", "value": ";"}
      ]
    },

    "expression": {
      "type": "CHOICE",
      "members": [
        {"type": "SYMBOL", "name": "member_expression"},
        {"type": "SYMBOL", "name": "binary_expression"},
        {"type": "SYMBOL", "name": "identifier"}
      ]
    },

    "member_expression": {
      "type": "SEQ",
      "members": [
        {"type": "SYMBOL", "name": "expression"},
        {"type": "STRING", "value": "."},
        {"type": "SYMBOL", "name": "identifier"}
      ]
    },

    "binary_expression": {
      "type": "CHOICE",
      "members": [
        {
          "type": "PREC_LEFT",
          "value": "or",
          "content": {
            "type": "SEQ",
            "members": [
              {"type": "SYMBOL", "name": "expression"},
              {"type": "STRING", "value": "||"},
              {"type": "SYMBOL", "name": "expression"}
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": "and",
          "content": {
            "type": "SEQ",
            "members": [
              {"type": "SYMBOL", "name": "expression"},
              {"type": "STRING", "value": "&&"},
              {"type": "SYMBOL", "name": "expression"}
            ]
          }
        }
      ]
    },

    "type": {
      "type": "CHOICE",
      "members": [
        {"type": "SYMBOL", "name": "nested_type"},
        {"type": "SYMBOL", "name": "binary_type"},
        {"type": "SYMBOL", "name": "identifier"}
      ]
    },

    "nested_type": {
      "type": "SEQ",
      "members": [
        {"type": "SYMBOL", "name": "identifier"},
        {"type": "STRING", "value": "."},
        {"type": "SYMBOL", "name": "identifier"}
      ]
    },

    "binary_type": {
      "type": "CHOICE",
      "members": [
        {
          "type": "PREC_LEFT",
          "value": "type_union",
          "content": {
            "type": "SEQ",
            "members": [
              {"type": "SYMBOL", "name": "type"},
              {"type": "STRING", "value": "||"},
              {"type": "SYMBOL", "name": "type"}
            ]
          }
        },
        {
          "type": "PREC_LEFT",
          "value": "type_intersection",
          "content": {
            "type": "SEQ",
            "members": [
              {"type": "SYMBOL", "name": "type"},
              {"type": "STRING", "value": "&&"},
              {"type": "SYMBOL", "name": "type"}
            ]
          }
        }
      ]
    },

    "identifier": {
      "type": "PATTERN",
      "value": "[a-z]\\w+"
    }
  }
}
