diff --git a/corpus/edigits_like.langexp b/corpus/edigits_like.langexp index fcd7174..8a2a89c 100644 --- a/corpus/edigits_like.langexp +++ b/corpus/edigits_like.langexp @@ -69,6 +69,7 @@ test_k 'n 'k : Int Int -> Bool = { (simple_type_identifier)) (import (simple_name_identifier)) + (empty_lines) (function_definition (simple_name_identifier) (block @@ -237,6 +238,7 @@ test_k 'n 'k : Int Int -> Bool = { (operator) (name_expression (simple_name_identifier))))))))) + (empty_lines) (function_definition (simple_name_identifier) (argument_name_identifier) @@ -273,6 +275,7 @@ test_k 'n 'k : Int Int -> Bool = { (simple_type_identifier)) (simple_name_identifier) (argument_name_identifier))))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -310,6 +313,7 @@ test_k 'n 'k : Int Int -> Bool = { (simple_name_identifier) (simple_name_identifier) (argument_name_identifier)))) + (empty_lines) (return (operator_expression (operator_expression @@ -329,6 +333,7 @@ test_k 'n 'k : Int Int -> Bool = { (operator) (name_expression (simple_name_identifier))))))) + (empty_lines) (function_definition (simple_name_identifier) (argument_name_identifier) @@ -410,6 +415,7 @@ test_k 'n 'k : Int Int -> Bool = { (return (name_expression (simple_name_identifier))))) + (empty_lines) (function_definition (simple_name_identifier) (argument_name_identifier) @@ -429,6 +435,7 @@ test_k 'n 'k : Int Int -> Bool = { (number_literal)) (return (bool_literal))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -461,6 +468,7 @@ test_k 'n 'k : Int Int -> Bool = { (operator) (name_expression (simple_name_identifier))))) + (empty_lines) (return (operator_expression (name_expression diff --git a/corpus/test.langexp b/corpus/test.langexp index bd64caa..2475e17 100644 --- a/corpus/test.langexp +++ b/corpus/test.langexp @@ -94,7 +94,7 @@ func_2 = { maybe_something!; // open optional: if null then return default value (operator) - %x := maybe_something ?| value + %x := maybe_something ?| value; %y := Fruit @apple (); @@ -224,11 +224,14 @@ parse_number : Unit! = { -------------------------------------------------------------------------------- (source_file + (empty_lines) (import (simple_name_identifier)) + (empty_lines) (import (placeholder) (simple_name_identifier)) + (empty_lines) (import (simple_name_identifier) (simple_name_identifier) @@ -237,9 +240,11 @@ parse_number : Unit! = { (import (simple_name_identifier) (simple_name_identifier)) + (empty_lines) (function_definition (simple_name_identifier) (block + (empty_lines) (loop (block (match @@ -255,6 +260,7 @@ parse_number : Unit! = { (operator) (char_literal)) (loop_control)))) + (empty_lines) (loop (operator_expression (name_expression @@ -265,6 +271,7 @@ parse_number : Unit! = { (name_expression (simple_name_identifier) (simple_name_identifier)))) + (empty_lines) (loop (name_definition (simple_name_identifier)) @@ -276,6 +283,7 @@ parse_number : Unit! = { (name_expression (simple_name_identifier) (string_literal)))) + (empty_lines) (condition (operator_expression (operator_expression @@ -322,6 +330,7 @@ parse_number : Unit! = { (simple_name_identifier))) (return (unit_literal))))) + (empty_lines) (function_definition (definition_info (info) @@ -354,6 +363,7 @@ parse_number : Unit! = { (case (placeholder) (null_literal)))) + (empty_lines) (function_definition (definition_info (info)) @@ -372,6 +382,7 @@ parse_number : Unit! = { (operator) (name_expression (argument_name_identifier)))) + (empty_lines) (function_definition (definition_info (info) @@ -416,6 +427,7 @@ parse_number : Unit! = { (name_expression (simple_name_identifier) (argument_name_identifier)))))) + (empty_lines) (function_definition (simple_name_identifier) (block @@ -425,6 +437,7 @@ parse_number : Unit! = { (case (name_expression (simple_name_identifier)))) + (empty_lines) (match (operator_expression (name_definition @@ -436,6 +449,7 @@ parse_number : Unit! = { (name_expression (simple_name_identifier) (simple_name_identifier)))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -449,12 +463,14 @@ parse_number : Unit! = { (operator) (name_expression (argument_name_identifier)))))) + (empty_lines) (match (name_definition (simple_name_identifier)) (case (lambda (number_literal)))) + (empty_lines) (match (name_expression (simple_name_identifier)) @@ -488,6 +504,7 @@ parse_number : Unit! = { (case (placeholder) (string_literal))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -499,6 +516,7 @@ parse_number : Unit! = { (name_expression (simple_name_identifier) (simple_name_identifier)) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -511,6 +529,7 @@ parse_number : Unit! = { (placeholder) (name_expression (simple_name_identifier)))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -522,6 +541,7 @@ parse_number : Unit! = { (string_literal) (annotation_identifier) (float_number_literal)))) + (empty_lines) (match (suffix_expression (name_definition @@ -531,6 +551,7 @@ parse_number : Unit! = { (simple_name_identifier)) (name_expression (simple_name_identifier)))) + (empty_lines) (match (suffix_expression (name_definition @@ -538,6 +559,7 @@ parse_number : Unit! = { (case (name_expression (simple_name_identifier)))) + (empty_lines) (match (suffix_expression (name_definition @@ -545,10 +567,13 @@ parse_number : Unit! = { (case (name_expression (simple_name_identifier)))) + (empty_lines) (suffix_expression (simple_name_identifier)) + (empty_lines) (suffix_expression (simple_name_identifier)) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -558,15 +583,18 @@ parse_number : Unit! = { (simple_name_identifier)) (operator) (name_expression - (simple_name_identifier) - (name_definition - (simple_name_identifier))))) + (simple_name_identifier))))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) (case (constructor (type (simple_type_identifier)) (annotation_identifier) (unit_literal)))) + (empty_lines) (match (name_expression (simple_name_identifier)) @@ -591,6 +619,7 @@ parse_number : Unit! = { (annotation_identifier) (unit_literal)) (string_literal))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -599,6 +628,7 @@ parse_number : Unit! = { (operator) (number_literal) (number_literal)))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -615,6 +645,7 @@ parse_number : Unit! = { (tuple_access (simple_name_identifier) (number_literal))))) + (empty_lines) (function_definition (definition_info (info)) @@ -628,6 +659,7 @@ parse_number : Unit! = { (name_expression (simple_name_identifier) (argument_name_identifier)))) + (empty_lines) (function_definition (simple_name_identifier) (block @@ -636,6 +668,7 @@ parse_number : Unit! = { (simple_name_identifier) (simple_name_identifier) (simple_name_identifier)))) + (empty_lines) (function_definition (simple_name_identifier) (block @@ -644,6 +677,7 @@ parse_number : Unit! = { (simple_name_identifier) (simple_name_identifier) (simple_name_identifier)))) + (empty_lines) (function_definition (simple_name_identifier) (block @@ -652,6 +686,7 @@ parse_number : Unit! = { (simple_name_identifier) (simple_name_identifier) (simple_name_identifier)))) + (empty_lines) (type_definition (simple_type_identifier) (variant_type @@ -662,6 +697,7 @@ parse_number : Unit! = { (annotation_identifier) (type (simple_type_identifier))))) + (empty_lines) (type_definition (simple_type_identifier) (variant_type @@ -677,6 +713,7 @@ parse_number : Unit! = { (annotation_identifier) (type (simple_type_identifier))))) + (empty_lines) (function_definition (definition_info (info)) @@ -743,6 +780,7 @@ parse_number : Unit! = { (simple_name_identifier)) (operator) (bool_literal)))))))) + (empty_lines) (function_definition (definition_info (info)) @@ -809,6 +847,7 @@ parse_number : Unit! = { (simple_name_identifier)) (operator) (bool_literal)))))))) + (empty_lines) (type_definition (definition_info (info) @@ -838,6 +877,7 @@ parse_number : Unit! = { (argument_type_identifier)) (type (argument_type_identifier)))))) + (empty_lines) (type_definition (simple_type_identifier) (function_definition @@ -859,6 +899,7 @@ parse_number : Unit! = { (argument_name_identifier) (name_expression (simple_name_identifier)))) + (empty_lines) (function_definition (simple_name_identifier) (block @@ -884,6 +925,7 @@ parse_number : Unit! = { (type (simple_type_identifier))) (simple_name_identifier)))))) + (empty_lines) (function_definition (simple_name_identifier) (block @@ -923,6 +965,7 @@ parse_number : Unit! = { (operator) (name_expression (simple_name_identifier))))) + (empty_lines) (function_definition (simple_name_identifier) (block @@ -934,6 +977,8 @@ parse_number : Unit! = { (array_access (simple_name_identifier) (number_literal))))))) + (empty_lines) + (empty_lines) (function_definition (definition_info (info)) @@ -947,6 +992,7 @@ parse_number : Unit! = { (name_expression (simple_name_identifier) (argument_name_identifier)))) + (empty_lines) (function_definition (definition_info (info)) @@ -977,6 +1023,7 @@ parse_number : Unit! = { (case (reference_expression (simple_name_identifier)))))) + (empty_lines) (function_definition (definition_info (info)) @@ -1003,6 +1050,7 @@ parse_number : Unit! = { (case (reference_expression (simple_name_identifier)))))) + (empty_lines) (function_definition (definition_info (info)) @@ -1023,6 +1071,7 @@ parse_number : Unit! = { (operator) (name_expression (simple_name_identifier)))) + (empty_lines) (function_definition (definition_info (info)) @@ -1036,6 +1085,7 @@ parse_number : Unit! = { (case (name_expression (simple_name_identifier))))) + (empty_lines) (function_definition (definition_info (info)) @@ -1055,6 +1105,7 @@ parse_number : Unit! = { (argument_name_identifier) (annotation_identifier) (argument_name_identifier))) + (empty_lines) (function_definition (definition_info (info)) @@ -1072,6 +1123,7 @@ parse_number : Unit! = { (simple_type_identifier)) (argument_name_identifier) (argument_name_identifier))) + (empty_lines) (typeclass_definition (definition_info (info)) @@ -1083,6 +1135,7 @@ parse_number : Unit! = { (simple_type_identifier)) (type (simple_type_identifier)))) + (empty_lines) (function_definition (definition_info (info)) @@ -1102,6 +1155,7 @@ parse_number : Unit! = { (name_expression (simple_name_identifier) (string_literal))))) + (empty_lines) (function_definition (definition_info (info)) diff --git a/grammar.g4 b/grammar.g4 index b6401cb..8ee8719 100644 --- a/grammar.g4 +++ b/grammar.g4 @@ -9,6 +9,7 @@ statement: import | type_definition | function_definition | typeclass_definition + | EMPTY_LINES ; import: ('::' | 'import') (SIMPLE_NAME_IDENTIFIER | '_') ('=' SIMPLE_NAME_IDENTIFIER)? @@ -56,7 +57,7 @@ operator_expression: /* prec left ?? */ | /* prec 1 */ expression OPERATOR_TAIL3 expression ; -block: '{' (super_expression ';')* '}' ; +block: '{' ((super_expression ';') | EMPTY_LINES)* '}' ; array: '[[' (scoped_expression)+ ']]' ; @@ -144,6 +145,8 @@ literal: FLOAT_NUMBER_LITERAL DEFINITION_INFO : : ': ' ([^\n]*)+ ; ANNOTATION_INFO : ANNOTATION_IDENTIFIER [^\n]* ; +EMPTY_LINES '\n' ('\n')+ + LINE_COMMENT : '#!' [^\n]* -> skip ; LINE_COMMENT : '//' [^\n]* -> skip ; BLOCK_COMMENT : '\*' ([^*] |('\*' [^/]))* '*/' -> skip ; diff --git a/grammar.js b/grammar.js index 33bab5c..7527d8a 100644 --- a/grammar.js +++ b/grammar.js @@ -21,6 +21,7 @@ module.exports = grammar({ $.type_definition, $.function_definition, $.typeclass_definition, + $.empty_lines, ), import: $ => seq( @@ -128,7 +129,7 @@ module.exports = grammar({ // --- continers - block: $ => seq('{', repeat(seq($._super_expression, ';')), '}'), + block: $ => seq('{', repeat(choice(seq($._super_expression, ';'), $.empty_lines)), '}'), array: $ => seq('[[', repeat1($._scoped_expression), ']]'), @@ -239,10 +240,12 @@ module.exports = grammar({ // --- comments definition_info: $ => repeat1(seq(': ', $.info)), - annotation_info: $ => seq($.annotation_identifier, $.info), + annotation_info: $ => seq($.annotation_identifier, ' ', $.info), info: $ => /[^\n]*/, + empty_lines: $ => /\n\n+/, + _exec_comment: $ => token(seq('#!', /[^\n]*/)), _line_comment: $ => token(seq('//', /[^\n]*/)), _block_comment: $ => token(seq('/*', /([^*]|(\*[^/]))*/, '*/')),