/* 
!!!!!!!NOTE!!!!!!!!
DO NOT FALL INTO RECURSIVE PATTERNS!!!!

EXAMPLE:
                 ||                                                         ||                                                  ||
                 \/                                                         \/                                                  \/                 
part_def_block = ( type:part_def_token _ name:name _ b _ block:part_def_block* _ b {return {type, name: name.join(''), block}} )* 

*/

startRule = package_block

// CODE DEFINITION RULES
package_block = type:package_token _ name:name _ b _ content:content* b {

    if (!Array.isArray(content) || !content.length) {
        return {type: "Package", name: name.join(''), content: null}
    }
    else {
        return {type: "Package", name: name.join(''), content}
    }
}

part_def_block = type:part_def_token _ name:name _ b _ content:content* b {

    if (!Array.isArray(content) || !content.length) {
        return {type: "PartDef", name: name.join(''), content: null}
    }
    else {
        return {type: "PartDef", name: name.join(''), content}
    }
}

part_usage = type:part_token _ alias:name _ ":" _ parent:name ";" {

    return {type: "PartUsage", alias: alias.join(''), parent: parent.join('')}
}


// CONTENT TO BE PARSED
content = def:(part_def_block) _ {return def} / 
          usage:(part_usage) _ {return usage}


//TOKENS
package_token = "package"
part_def_token = "part def"
part_token = "part"


// BASE RULES
b = "{" / "}"
name = ("'" [a-zA-Z0-9 ]+ "'") / [a-zA-Z0-9]+
code_block = [a-zA-Z0-9 \n\r\t]*
_ "whitespaces" = [ \n\r\t]*