term_path = name_lower | name_upper , "." , name_lower ; type_path = name_lower | name_upper , "." , name_lower ; variable_or_application_expression = term_path [ "(" , expression , { "," , expression } , ")" ] ; new_parameters = "(" , expression , { "," , expression } , ")" ; new_expression = "new" , type_path , new_parameters ; record_expression_fields = "{" , name_lower , "=" , expression , { "," name_lower , "=" , expression } , "}" ; record_expression = "record" , type_path , record_expression_fields ; local_declaration = "value" , name_lower , [ ":" , type_path ] , "=" , expression ; local_declarations = local_declaration , ";" , { local_declarations } ; let_expression = "let" , local_declarations , "in" , expression , "end" ; conditional_expression = "if" , expression , "then" , expression , "else" , expression , "end" ; matrix_column_access_expression = "column" , expression , integer_literal ; expression_pre = integer_literal | real_literal | boolean_literal | variable_or_application_expression | conditional_expression | matrix_column_access_expression | let_expression | new_expression | record_expression ; expression_projection = "." , name_lower ; expression_swizzle_names = "[" , name_lower , { "," , name_lower } , "]" ; expression = expression_pre , { expression_swizzle | expression_projection } ;