ws = (' '|'\n')* digit = '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' lowercase = "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|"w"|"x"|"y"|"z" uppercase = "A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|"Q"|"R"|"S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z" letter = (lowercase|uppercase):x -> x var = ws uppercase:x letter*:y ws -> ["var", x + "".join(y)] pair = literal:x ":" literal:y -> [x, y] integer = ("-"|"+"):x digit+:y -> ["integer", x + "".join(y)] | digit+:y -> ["integer", "".join(y)] float = digit+:x '.' digit+:y -> ["float", "".join(x) + "." + "".join(y)] atom = lowercase:x letter*:y -> ["atom", x + "".join(y)] string = '"' letter*:x '"' -> ["string", "".join(x)] list = "[" ws expression*:x ws "]" -> ["list", x] set = "(" ws expression*:x ws ")" -> ["set", x] map = "{" ws pair*:x ws "}" -> ["map", x] bool = ("true"|"false"):x -> ["bool", x] nil = "nil":x -> ["nil"] property = (uppercase:x letter*:y) "." (uppercase:v letter*:w) method = "method" "(" var*:x ")" statements:y "end" -> ["method", x, y] literal = (method|float|integer|bool|nil|string|list|set|map):x -> x expression = ws literal:x ws -> x assign = ws (property|var):x ws ":" ws (property|var|literal):y ws -> ["assign", x, y] statement = ws (assign|literal):x ws -> x statements = statement+:x -> ["statements", x]