mun_syntax 0.4.0

Parsing functionality for the Mun programming language
Documentation
// Stores definitions which must be used in multiple places
// See `cargo gen-syntax` (defined in crates/tools/src/main.rs)
Grammar(
    single_char_tokens: [
        ["&", "AMP"],
        ["|", "PIPE"],
        ["+", "PLUS"],
        ["-", "MINUS"],
        ["*", "STAR"],
        ["/", "SLASH"],
        ["%", "PERCENT"],
        ["^", "CARET"],
        ["#", "HASH"],
        [".", "DOT"],
        ["<", "LT"],
        [">", "GT"],
        ["=", "EQ"],
        ["(", "L_PAREN"],
        [")", "R_PAREN"],
        ["{", "L_CURLY"],
        ["}", "R_CURLY"],
        ["[", "L_BRACKET"],
        ["]", "R_BRACKET"],
        [";", "SEMI"],
        [":", "COLON"],
        [",", "COMMA"],
        ["!", "EXCLAMATION"],

        // Extended symbols
        ["_", "UNDERSCORE"],
    ],
    // Tokens for which the longest match must be chosen (e.g. `..` is a DOTDOT, but `.` is a DOT)
    multi_char_tokens: [
        // Original Lua symbols
        ["==", "EQEQ"],
        // Not equals differs from Lua in that != is used.
        ["!=", "NEQ"], //["~= ", ""]
        ["<=", "LTEQ"],
        [">=", "GTEQ"],
        ["..", "DOTDOT"],
        ["...", "DOTDOTDOT"],

        // Extended symbols
        ["+=", "PLUSEQ"],
        ["-=", "MINUSEQ"],
        ["*=", "STAREQ"],
        ["/=", "SLASHEQ"],
        ["%=", "PERCENTEQ"],
        ["<<=", "SHLEQ"],
        [">>=", "SHREQ"],
        ["&=", "AMPEQ"],
        ["|=", "PIPEEQ"],
        ["^=", "CARETEQ"],
        ["..=", "DOTDOTEQ"],
        ["::", "COLONCOLON"],
        ["->", "THIN_ARROW"],

        ["&&", "AMPAMP"],
        ["||", "PIPEPIPE"],
        ["<<", "SHL"],
        [">>", "SHR"],
    ],
    keywords: [
        // Original Lua keywords
        "break",
        "do",
        "else",
        // "elseif",    // Simply use else if
        // "end",       // We use braces
        "false",
        "for",
        "fn",
        "if",
        "in",
        "as",
        "use",
        // "local",     // We use let
        "nil",
        // "not",        // We use !
        // "or",
        // "repeat",    // Not supported
        "return",
        // "then",      // Not supported
        "true",
        // "until",     // Not supported
        "while",
        "loop",

        // Extended keywords
        "let",
        "mut",
        "class",
        "struct",
        "never",
        "pub",
        "type",

        "package",
        "super",
        "self",

        "extern"
    ],
    literals: [
        "INT_NUMBER",
        "FLOAT_NUMBER",
        "STRING",
    ],
    tokens: [
        "ERROR",
        "IDENT",
        "INDEX",
        "WHITESPACE",
        "COMMENT",

        // Contextual keywords
        "GC_KW",
        "VALUE_KW",
    ],
    nodes: [
        "SOURCE_FILE",

        "FUNCTION_DEF",
        "EXTERN",
        "RET_TYPE",
        "VISIBILITY",

        "PARAM_LIST",
        "PARAM",

        "STRUCT_DEF",
        "TYPE_ALIAS_DEF",
        "MEMORY_TYPE_SPECIFIER",
        "RECORD_FIELD_DEF_LIST",
        "RECORD_FIELD_DEF",
        "TUPLE_FIELD_DEF_LIST",
        "TUPLE_FIELD_DEF",

        "PATH_TYPE",
        "ARRAY_TYPE",
        "NEVER_TYPE",

        "LET_STMT",
        "EXPR_STMT",

        "PATH_EXPR",
        "PREFIX_EXPR",
        "LITERAL",
        "BIN_EXPR",
        "PAREN_EXPR",
        "CALL_EXPR",
        "FIELD_EXPR",
        "IF_EXPR",
        "INDEX_EXPR",
        "BLOCK_EXPR",
        "RETURN_EXPR",
        "WHILE_EXPR",
        "LOOP_EXPR",
        "BREAK_EXPR",
        "ARRAY_EXPR",
        "CONDITION",

        "BIND_PAT",
        "PLACEHOLDER_PAT",

        "ARG_LIST",

        "NAME",
        "NAME_REF",

        "PATH",
        "PATH_SEGMENT",

        "RECORD_LIT",
        "RECORD_FIELD_LIST",
        "RECORD_FIELD",

        "USE",
        "USE_TREE",
        "USE_TREE_LIST",
        "RENAME"
    ],
    ast: {
        "SourceFile": (
            traits: [ "ModuleItemOwner", "FunctionDefOwner" ],
        ),
        "ModuleItem": (
            enum: ["Use", "FunctionDef", "StructDef", "TypeAliasDef"]
        ),
        "Visibility": (),
        "FunctionDef": (
            traits: [
                "NameOwner",
                "VisibilityOwner",
                "DocCommentsOwner",
                "ExternOwner",
            ],
            options: [ "ParamList", ["body", "BlockExpr"], "RetType" ],
        ),
        "RetType": (options: ["TypeRef"]),
        "ParamList": (
            collections: [
                ["params", "Param"]
            ]
        ),
        "Param": (
            options: [ "Pat" ],
            traits: [
                "TypeAscriptionOwner"
            ],
        ),
        "StructDef": (
            options: ["MemoryTypeSpecifier"],
            traits: [
                "NameOwner",
                "VisibilityOwner",
                "DocCommentsOwner",
            ]
        ),
        "TypeAliasDef": (
            options: ["TypeRef"],
            traits: [
                "NameOwner",
                "VisibilityOwner",
                "DocCommentsOwner",
            ]
        ),
        "MemoryTypeSpecifier": (),
        "RecordFieldDefList": (collections: [("fields", "RecordFieldDef")]),
        "RecordFieldDef": (
            traits: [
                "NameOwner",
                "VisibilityOwner",
                "DocCommentsOwner",
                "TypeAscriptionOwner"
            ]
        ),
        "TupleFieldDefList": (collections: [("fields", "TupleFieldDef")]),
        "TupleFieldDef": (
            options: [
                "TypeRef",
            ],
            traits: [
                "VisibilityOwner",
            ]
        ),
        "LetStmt": (
            options: [
                ["pat", "Pat"],
                ["initializer", "Expr"],
            ],
            traits: [
                "TypeAscriptionOwner",
            ]
        ),
        "Condition": (
            options: [ "Pat", "Expr" ]
        ),

        "ExprStmt": (
            options: [ ["expr", "Expr"] ]
        ),
        "Stmt": (
            enum: ["LetStmt", "ExprStmt"]
        ),

        "LoopExpr": (
            traits: ["LoopBodyOwner"]
        ),

        "WhileExpr": (
            traits: ["LoopBodyOwner"],
            options: [ "Condition" ]
        ),

        "PathExpr": (options: ["Path"]),
        "PrefixExpr": (options: ["Expr"]),
        "BinExpr": (),
        "Literal": (),
        "ParenExpr": (options: ["Expr"]),
        "CallExpr": (
            traits: ["ArgListOwner"],
            options: [ "Expr" ],
        ),
        "IndexExpr": (
        ),
        "FieldExpr": (
            options: ["Expr", "NameRef"]
        ),
        "IfExpr": (
            options: [ "Condition" ]
        ),
        "BreakExpr": (options: ["Expr"]),
        "ArrayExpr": (
            collections: [
                [ "exprs", "Expr" ]
            ]
        ),
        "ArgList": (
            collections: [
                ["args", "Expr"]
            ]
        ),

        "Expr": (
            enum: [
                "Literal",
                "PrefixExpr",
                "PathExpr",
                "BinExpr",
                "ParenExpr",
                "CallExpr",
                "FieldExpr",
                "IfExpr",
                "LoopExpr",
                "WhileExpr",
                "ReturnExpr",
                "BreakExpr",
                "BlockExpr",
                "ArrayExpr",
                "IndexExpr",
                "RecordLit",
            ]
        ),

        "Name": (),
        "NameRef": (),
        "PathType": (options: ["Path"]),
        "ArrayType": (options: ["TypeRef"]),
        "NeverType": (),
        "TypeRef": (
            enum: [
                "PathType",
                "ArrayType",
                "NeverType",
            ]
        ),
        "ReturnExpr": (options: ["Expr"]),
        "BlockExpr": (
            options: [ "Expr" ],
            collections: [
                ["statements", "Stmt"],
            ],
        ),
        "Path": (
            options: [
                ["segment", "PathSegment"],
                ["qualifier", "Path"],
            ]
        ),
        "PathSegment": (
            options: [ "NameRef" ]
        ),

        "BindPat": (
            options: [ "Pat" ],
            traits: ["NameOwner"]
        ),
        "PlaceholderPat": (),
        "Pat": (
            enum: [
                "BindPat",
                "PlaceholderPat"
            ],
        ),

        "RecordLit": (options: ["TypeRef", "RecordFieldList"]),
        "RecordFieldList": (
            collections: [ ("fields", "RecordField") ],
            options: [["spread", "Expr"]]
        ),
        "RecordField": (options: ["NameRef", "Expr"]),

        "Use": (
            options: [["use_tree", "UseTree"]],
            traits: ("VisibilityOwner")
        ),

        "UseTree": (
            options: [
                ["use_tree_list", "UseTreeList"],
                ["path", "Path"],
                ["rename", "Rename"]
            ]
        ),
        "UseTreeList": (
            collections: [ ("use_trees", "UseTree") ]
        ),

        "Rename": (
            traits: ("NameOwner")
        )
    }
)