{
"name": "lox",
"word": "identifier",
"rules": {
"program": {
"type": "FIELD",
"name": "decl",
"content": {
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "decl"
}
}
},
"decl": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "decl_class"
},
{
"type": "SYMBOL",
"name": "decl_fun"
},
{
"type": "SYMBOL",
"name": "decl_var"
},
{
"type": "SYMBOL",
"name": "decl_stmt"
}
]
},
"decl_class": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "class"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "extends",
"content": {
"type": "SYMBOL",
"name": "extends"
}
},
{
"type": "FIELD",
"name": "base",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "{"
},
{
"type": "FIELD",
"name": "method",
"content": {
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "function"
}
}
},
{
"type": "STRING",
"value": "}"
}
]
},
"decl_fun": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "fun"
},
{
"type": "FIELD",
"name": "function",
"content": {
"type": "SYMBOL",
"name": "function"
}
}
]
},
"decl_var": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "var"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "="
},
{
"type": "FIELD",
"name": "value",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ";"
}
]
},
"decl_stmt": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "stmt_block"
},
{
"type": "SYMBOL",
"name": "stmt_expr"
},
{
"type": "SYMBOL",
"name": "stmt_for"
},
{
"type": "SYMBOL",
"name": "stmt_if"
},
{
"type": "SYMBOL",
"name": "stmt_print"
},
{
"type": "SYMBOL",
"name": "stmt_return"
},
{
"type": "SYMBOL",
"name": "stmt_while"
}
]
},
"stmt_block": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "FIELD",
"name": "body",
"content": {
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "decl"
}
}
},
{
"type": "STRING",
"value": "}"
}
]
},
"stmt_expr": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "value",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "STRING",
"value": ";"
}
]
},
"stmt_for": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "for"
},
{
"type": "FIELD",
"name": "paren",
"content": {
"type": "SYMBOL",
"name": "for_paren"
}
},
{
"type": "FIELD",
"name": "body",
"content": {
"type": "SYMBOL",
"name": "decl_stmt"
}
}
]
},
"for_paren": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "init",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "stmt_expr"
},
{
"type": "SYMBOL",
"name": "decl_var"
}
]
}
},
{
"type": "STRING",
"value": ";"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "cond",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ";"
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "incr",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_expr"
}
]
}
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
"stmt_if": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "if"
},
{
"type": "FIELD",
"name": "cond",
"content": {
"type": "SYMBOL",
"name": "grouping"
}
},
{
"type": "FIELD",
"name": "then",
"content": {
"type": "SYMBOL",
"name": "decl_stmt"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "else"
},
{
"type": "FIELD",
"name": "else",
"content": {
"type": "SYMBOL",
"name": "decl_stmt"
}
}
]
},
{
"type": "BLANK"
}
]
}
]
}
},
"stmt_print": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "print"
},
{
"type": "FIELD",
"name": "value",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "STRING",
"value": ";"
}
]
},
"stmt_return": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "return"
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "value",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ";"
}
]
},
"stmt_while": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "while"
},
{
"type": "FIELD",
"name": "cond",
"content": {
"type": "SYMBOL",
"name": "grouping"
}
},
{
"type": "FIELD",
"name": "body",
"content": {
"type": "SYMBOL",
"name": "decl_stmt"
}
}
]
},
"_expr": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "expr_call"
},
{
"type": "SYMBOL",
"name": "expr_infix"
},
{
"type": "SYMBOL",
"name": "expr_prefix"
},
{
"type": "SYMBOL",
"name": "expr_primary"
},
{
"type": "SYMBOL",
"name": "expr_field"
}
]
},
"expr_call": {
"type": "PREC_LEFT",
"value": 8,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "callee",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "FIELD",
"name": "args",
"content": {
"type": "SYMBOL",
"name": "args"
}
}
]
}
},
"expr_field": {
"type": "PREC_LEFT",
"value": 8,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "object",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "STRING",
"value": "."
},
{
"type": "FIELD",
"name": "field",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
}
]
}
},
"expr_infix": {
"type": "CHOICE",
"members": [
{
"type": "PREC_LEFT",
"value": 6,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "lt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "FIELD",
"name": "op",
"content": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "*"
},
{
"type": "STRING",
"value": "/"
}
]
}
},
{
"type": "FIELD",
"name": "rt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 5,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "lt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "FIELD",
"name": "op",
"content": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "+"
},
{
"type": "STRING",
"value": "-"
}
]
}
},
{
"type": "FIELD",
"name": "rt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 4,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "lt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "FIELD",
"name": "op",
"content": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "STRING",
"value": "<="
},
{
"type": "STRING",
"value": ">"
},
{
"type": "STRING",
"value": ">="
}
]
}
},
{
"type": "FIELD",
"name": "rt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 3,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "lt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "FIELD",
"name": "op",
"content": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "=="
},
{
"type": "STRING",
"value": "!="
}
]
}
},
{
"type": "FIELD",
"name": "rt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 2,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "lt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "FIELD",
"name": "op",
"content": {
"type": "STRING",
"value": "and"
}
},
{
"type": "FIELD",
"name": "rt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
}
},
{
"type": "PREC_LEFT",
"value": 1,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "lt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "FIELD",
"name": "op",
"content": {
"type": "STRING",
"value": "or"
}
},
{
"type": "FIELD",
"name": "rt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
}
},
{
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "lt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "FIELD",
"name": "op",
"content": {
"type": "STRING",
"value": "="
}
},
{
"type": "FIELD",
"name": "rt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
}
}
]
},
"expr_prefix": {
"type": "PREC_RIGHT",
"value": 7,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "op",
"content": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "-"
},
{
"type": "STRING",
"value": "!"
}
]
}
},
{
"type": "FIELD",
"name": "rt",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
}
]
}
},
"expr_primary": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "bool"
},
{
"type": "SYMBOL",
"name": "nil"
},
{
"type": "SYMBOL",
"name": "this"
},
{
"type": "SYMBOL",
"name": "number"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "var"
},
{
"type": "SYMBOL",
"name": "grouping"
},
{
"type": "SYMBOL",
"name": "super"
}
]
},
"bool": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "false"
},
{
"type": "STRING",
"value": "true"
}
]
},
"nil": {
"type": "STRING",
"value": "nil"
},
"this": {
"type": "STRING",
"value": "this"
},
"number": {
"type": "PATTERN",
"value": "[0-9]+(\\.[0-9]+)?"
},
"string": {
"type": "PATTERN",
"value": "\"[^\"]*\""
},
"var": {
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
"grouping": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "FIELD",
"name": "inner",
"content": {
"type": "SYMBOL",
"name": "_expr"
}
},
{
"type": "STRING",
"value": ")"
}
]
},
"super": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "super"
},
{
"type": "STRING",
"value": "."
},
{
"type": "FIELD",
"name": "field",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
}
]
},
"extends": {
"type": "STRING",
"value": "<"
},
"function": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "FIELD",
"name": "params",
"content": {
"type": "SYMBOL",
"name": "params"
}
},
{
"type": "FIELD",
"name": "body",
"content": {
"type": "SYMBOL",
"name": "stmt_block"
}
}
]
},
"args": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_expr"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_expr"
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
"params": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "identifier"
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
"comment": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "//"
},
{
"type": "PATTERN",
"value": ".*"
}
]
}
},
"identifier": {
"type": "PATTERN",
"value": "[a-zA-Z_][a-zA-Z0-9_]*"
}
},
"extras": [
{
"type": "PATTERN",
"value": "\\s|\\r?\\n"
},
{
"type": "SYMBOL",
"name": "comment"
}
],
"conflicts": [],
"precedences": [],
"externals": [],
"inline": [],
"supertypes": []
}