diff --git a/corpus/edigits_like.langexp b/corpus/edigits_like.langexp index 83212e6..14275bf 100644 --- a/corpus/edigits_like.langexp +++ b/corpus/edigits_like.langexp @@ -86,14 +86,14 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (name_expression (reference_expression (array_access (simple_name_identifier) - (number_literal))) + (index_literal))) (simple_name_identifier)) - (number_literal)))) + (index_literal)))) (empty_lines) (match (name_definition @@ -101,7 +101,7 @@ test_k 'n 'k : Int Int -> Bool = { (case (name_expression (simple_name_identifier) - (number_literal)))) + (index_literal)))) (empty_lines) (match (operator_expression @@ -113,12 +113,12 @@ test_k 'n 'k : Int Int -> Bool = { (case (name_expression (simple_name_identifier) - (number_literal) + (index_literal) (operator_expression (name_expression (simple_name_identifier)) (operator) - (number_literal))))) + (index_literal))))) (empty_lines) (operator_expression (name_expression @@ -136,13 +136,13 @@ test_k 'n 'k : Int Int -> Bool = { (simple_type (simple_type_identifier)) (simple_name_identifier) - (number_literal)) + (index_literal)) (simple_name_identifier) (operator_expression (name_expression (simple_name_identifier)) (operator) - (number_literal))))) + (index_literal))))) (empty_lines) (match (name_definition @@ -173,21 +173,21 @@ test_k 'n 'k : Int Int -> Bool = { (name_definition (simple_name_identifier)) (operator_expression - (number_literal) + (index_literal) (operator) (operator_expression (operator_expression (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (operator_tail1) - (number_literal))) + (index_literal))) (operator_expression (name_expression (simple_name_identifier)) (operator) - (number_literal))) + (index_literal))) (block (empty_lines) (condition @@ -196,7 +196,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (operator_tail1) (name_expression (simple_name_identifier))) @@ -211,7 +211,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier)) (operator) - (number_literal))) + (index_literal))) (operator) (string_literal)) (operator_tail1) @@ -220,7 +220,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (simple_name_identifier)))) (name_expression (simple_name_identifier) @@ -235,15 +235,15 @@ test_k 'n 'k : Int Int -> Bool = { (loop (placeholder) (operator_expression - (number_literal) + (index_literal) (operator) (operator_expression - (number_literal) + (index_literal) (operator) (name_expression (simple_name_identifier) (simple_name_identifier) - (number_literal)))) + (index_literal)))) (char_literal))) (operator) (string_literal)) @@ -276,14 +276,14 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (argument_name_identifier)) (operator) - (number_literal))) + (index_literal))) (return (operator_expression (name_expression (simple_type (simple_type_identifier)) (simple_name_identifier) - (number_literal)) + (index_literal)) (operator) (name_expression (simple_type @@ -303,7 +303,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (argument_name_identifier))) (operator_tail1) - (number_literal)))) + (index_literal)))) (empty_lines) (match (operator_expression @@ -365,13 +365,13 @@ test_k 'n 'k : Int Int -> Bool = { (name_definition (simple_name_identifier)) (case - (number_literal))) + (index_literal))) (empty_lines) (match (name_definition (simple_name_identifier)) (case - (number_literal))) + (index_literal))) (empty_lines) (loop (name_expression @@ -393,7 +393,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (empty_lines))) (empty_lines) (loop @@ -405,7 +405,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier))) (operator_tail1) - (number_literal)) + (index_literal)) (block (empty_lines) (match @@ -420,7 +420,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier))) (operator_tail1) - (number_literal)))) + (index_literal)))) (empty_lines) (condition (name_expression @@ -463,7 +463,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (return (bool_literal))) (empty_lines) @@ -481,10 +481,10 @@ test_k 'n 'k : Int Int -> Bool = { (simple_name_identifier) (simple_name_identifier)) (operator) - (number_literal))) + (index_literal))) (operator_tail1) (operator_expression - (float_number_literal) + (double_literal) (operator) (name_expression (simple_name_identifier) @@ -510,6 +510,6 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier)) (operator) - (number_literal)))) + (index_literal)))) (empty_lines))) (empty_lines)) diff --git a/corpus/test.langexp b/corpus/test.langexp index 3ce1b98..6556b6c 100644 --- a/corpus/test.langexp +++ b/corpus/test.langexp @@ -232,6 +232,21 @@ tuple_argument_test 'x : (A & B & C) = do_something; // ((A1 & A2) | B | C) same to Variant[Tuple[A1 A2] B C] variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; +literals_test = { + %float_number_literal := 1.0f; + %double_number_literal := 1.0; + %int_literal := 1i; + %long_literal := 1l; + %index_literal := 1; + %string_literal := ""; + %unicode_string_literal := ""u; + %char_literal := ''a''; + %unicode_literal := ''↪''u; + %bool_literal := true; + %unit_literal := (); + %null_literal := null; +} + -------------------------------------------------------------------------------- (source_file @@ -285,7 +300,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (block (empty_lines) (name_expression @@ -297,9 +312,9 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_definition (simple_name_identifier)) (operator_expression - (number_literal) + (index_literal) (operator) - (number_literal)) + (index_literal)) (block (empty_lines) (name_expression @@ -341,14 +356,14 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (block (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (empty_lines) (name_expression (simple_name_identifier) @@ -423,7 +438,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (argument_name_identifier)) (operator) - (number_literal))) + (index_literal))) (simple_name_identifier) (argument_name_identifier) (annotation_identifier) @@ -436,10 +451,10 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (argument_name_identifier)) (case (operator_expression - (number_literal) + (index_literal) (operator) - (number_literal)) - (number_literal)) + (index_literal)) + (index_literal)) (case (placeholder) (operator_expression @@ -449,7 +464,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (argument_name_identifier)) (operator) - (number_literal))) + (index_literal))) (operator) (name_expression (simple_name_identifier) @@ -497,29 +512,29 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (simple_name_identifier)) (case (lambda - (number_literal)))) + (index_literal)))) (empty_lines) (match (name_expression (simple_name_identifier)) (case (operator_expression - (number_literal) + (index_literal) (operator) - (number_literal)) + (index_literal)) (string_literal)) (case (operator_expression - (number_literal) + (index_literal) (operator) - (number_literal)) + (index_literal)) (string_literal)) (case (operator_expression (operator_expression - (number_literal) + (index_literal) (operator) - (number_literal)) + (index_literal)) (operator) (name_expression (simple_name_identifier))) @@ -527,7 +542,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (simple_name_identifier)) (operator) - (number_literal)) + (index_literal)) (string_literal)) (case (placeholder) @@ -571,7 +586,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (annotation_identifier) (string_literal) (annotation_identifier) - (float_number_literal)))) + (double_literal)))) (empty_lines) (extra) (empty_lines) @@ -669,8 +684,8 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (case (name_expression (operator) - (number_literal) - (number_literal)))) + (index_literal) + (index_literal)))) (empty_lines) (extra) (empty_lines) @@ -680,17 +695,17 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (case (operator_expression (operator_expression - (number_literal) + (index_literal) (operator) - (number_literal)) + (index_literal)) (operator) - (number_literal)))) + (index_literal)))) (empty_lines) (name_expression (simple_name_identifier) (tuple_access (simple_name_identifier) - (number_literal))) + (index_literal))) (empty_lines))) (empty_lines) (function_definition @@ -795,7 +810,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_definition (simple_name_identifier)) (operator_expression - (number_literal) + (index_literal) (operator) (name_expression (argument_name_identifier) @@ -814,7 +829,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (simple_name_identifier)) (operator) - (number_literal)))) + (index_literal)))) (name_expression (simple_name_identifier) (array_access @@ -827,7 +842,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (simple_name_identifier)) (operator) - (number_literal))))) + (index_literal))))) (operator_expression (name_expression (simple_name_identifier)) @@ -868,7 +883,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_definition (simple_name_identifier)) (operator_expression - (number_literal) + (index_literal) (operator) (name_expression (argument_name_identifier) @@ -887,7 +902,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (simple_name_identifier)) (operator) - (number_literal)))) + (index_literal)))) (name_expression (simple_name_identifier) (array_access @@ -900,7 +915,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (simple_name_identifier)) (operator) - (number_literal))))) + (index_literal))))) (operator_expression (name_expression (simple_name_identifier)) @@ -1054,7 +1069,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (reference_expression (array_access (simple_name_identifier) - (number_literal))))) + (index_literal))))) (empty_lines))) (empty_lines) (extra) @@ -1310,7 +1325,7 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (name_expression (argument_name_identifier)) (operator) - (number_literal)) + (index_literal)) (name_expression (simple_name_identifier) (string_literal)) @@ -1362,4 +1377,81 @@ variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; (simple_type_identifier))) (name_expression (simple_name_identifier))) + (empty_lines) + (function_definition + (simple_name_identifier) + (block + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (float_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (double_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (int_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (long_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (index_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (string_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (unicode_string_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (char_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (unicode_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (bool_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (unit_literal))) + (empty_lines) + (match + (name_definition + (simple_name_identifier)) + (case + (null_literal))) + (empty_lines))) (empty_lines)) diff --git a/grammar.g4 b/grammar.g4 index 37fcea2..f0aeb44 100644 --- a/grammar.g4 +++ b/grammar.g4 @@ -201,10 +201,15 @@ OPERATOR_TAIL1 : [+\-*/%^!?|&,<>=]+\. ; OPERATOR_TAIL2 : [+\-*/%^!?|&,<>=]+\.\. ; OPERATOR_TAIL3 : [+\-*/%^!?|&,<>=]+\.\.\. ; -FLOAT_NUMBER_LITERAL : [0-9]+ '.' [0-9]+ ; -NUMBER_LITERAL : [0-9]+ ; -STRING_LITERAL : \"([^\\\"]|(\\.))*\" ; -CHAR_LITERAL : '\'' '\'' ([^\\\'] | ( '\\' [\u0000-\u00FF])) '\'' '\'' ; +FLOAT_NUMBER_LITERAL : [0-9]+ '.' [0-9]+ 'f' ; +DOUBLE_NUMBER_LITERAL : [0-9]+ '.' [0-9]+ ; +INT_LITERAL : [0-9]+ 'i' ; +LONG_LITERAL : [0-9]+ 'l' ; +INDEX_LITERAL : [0-9]+ ; +STRING_LITERAL : '\"' ([^\\\'] | ( '\\' [\u0000-\u00FF]))* '\"' ; +UNICODE_STRING_LITERAL : '\"' ([^\\\'] | ( '\\' [\u0000-\uFFFF]))* '\"u'; +CHAR_LITERAL : '\'\'' ([^\\\'] | ( '\\' [\u0000-\u00FF])) '\'\'' ; +UNICODE_LITERAL : '\'\'' ([^\\\'] | ( '\\' [\u0000-\uFFFF])) '\'\'u' ; BOOL_LITERAL : 'true' | 'false' ; UNIT_LITERAL : '()' ; NULL_LITERAL : 'null' ; diff --git a/grammar.js b/grammar.js index f808f42..a6c084a 100644 --- a/grammar.js +++ b/grammar.js @@ -140,7 +140,7 @@ module.exports = grammar({ array_access: $ => seq($._scoped_expression, '[', $._super_expression, ']'), - tuple_access: $ => seq($._scoped_expression, '.', $.number_literal), + tuple_access: $ => seq($._scoped_expression, '.', $.index_literal), loop_control: $ => choice('break', 'continue'), @@ -306,19 +306,29 @@ module.exports = grammar({ operator_tail2: $ => /[+\-*/%^!?|&,<>=]+\.\./, operator_tail3: $ => /[+\-*/%^!?|&,<>=]+\.\.\./, - float_number_literal: $ => /[0-9]+\.[0-9]+/, - number_literal: $ => /[0-9]+/, + float_literal: $ => /[0-9]+\.[0-9]+f/, + double_literal: $ => /[0-9]+\.[0-9]+/, + int_literal: $ => /\-?[0-9]+i/, + long_literal: $ => /\-?[0-9]+l/, + index_literal: $ => /[0-9]+/, string_literal: $ => seq('\"', /([^\\\"]|(\\.))*/, '\"'), + unicode_string_literal: $ => seq('\"', /([^\\\"]|(\\.))*/, '\"u'), char_literal: $ => seq('\'\'', /[^\\\']|(\\.)/, '\'\''), + unicode_literal: $ => seq('\'\'', /[^\\\']|(\\.)/, '\'\'u'), bool_literal: $ => choice('true', 'false'), unit_literal: $ => '()', null_literal: $ => 'null', _literal: $ => choice( - $.float_number_literal, - $.number_literal, + $.float_literal, + $.double_literal, + $.int_literal, + $.long_literal, + $.index_literal, $.string_literal, + $.unicode_string_literal, $.char_literal, + $.unicode_literal, $.bool_literal, $.unit_literal, $.null_literal,