diff --git a/Makefile b/Makefile index c86d620..2832d38 100644 --- a/Makefile +++ b/Makefile @@ -26,13 +26,14 @@ build: ## Build Textmate grammar for PARI/GP. build: $(shell echo $(BUILD_DIR)parigp.{JSON-,YAML-,}tmLanguage) @cp $< $(BUILD_DIR)parigp.tmLanguage.json +J2_TEMPLATES := $(wildcard $(ROOT_DIR)src/*.j2) +J2_RENDERS := $(J2_TEMPLATES:.j2=) + .PHONY: clean clean: ## Clean the build targets. clean: - @rm -f $(BUILD_DIR)* + @rm -f $(BUILD_DIR)* $(ROOT_DIR)/images/coverage-badge.svg $(J2_RENDERS) -J2_TEMPLATES := $(wildcard $(ROOT_DIR)src/*.j2) -J2_RENDERS := $(J2_TEMPLATES:.j2=) $(BUILD_DIR)parigp.YAML-tmLanguage: $(J2_RENDERS) | $(BUILD_DIR) @yq ea '. as $$item ireduce ({}; . * $$item )' $(ROOT_DIR)src/*.YAML-tmLanguage > $@ diff --git a/src/functions.YAML-tmLanguage.j2 b/src/functions.YAML-tmLanguage.j2 index 9b6791d..624cdb9 100644 --- a/src/functions.YAML-tmLanguage.j2 +++ b/src/functions.YAML-tmLanguage.j2 @@ -43,7 +43,7 @@ repository: patterns: - include: '#function-vars' - - begin: '([[:alpha:]][[:alnum:]_]*)\b(?=\s*=\s*[^\->]+\s*\-\s*>)' + begin: '([[:alpha:]][[:alnum:]_]*)\b(?=\s*=\s*(\(([^()]|(\g<2>))*\)|[[:alpha:]][[:alnum:]_]*)\s*\-\s*>)' end: '(?<=\->)' beginCaptures: 1: @@ -51,6 +51,18 @@ repository: name: meta.function.lambda.parigp patterns: - include: '#function-vars' + - + begin: '(\(([^()]|(\g<0>))*\)|[[:alpha:]][[:alnum:]_]*|\{.+\})(?=\s*\-\s*>)' + end: '(?<=\->)' + beginCaptures: + 1: + name: entity.name.function.user.lambda.anonymous.parigp + patterns: + - include: '#function-vars' + name: meta.function.lambda.anonymous.parigp + patterns: + - include: '#general' + - include: '#operators' - begin: '\.([[:alpha:]][[:alnum:]_]*)\b(?=[^=]*=)' end: '(?<=\=)' diff --git a/src/main.YAML-tmLanguage b/src/main.YAML-tmLanguage index c66bb1c..a4d3e17 100644 --- a/src/main.YAML-tmLanguage +++ b/src/main.YAML-tmLanguage @@ -57,13 +57,13 @@ repository: code: patterns: - include: '#comments' + - include: '#functions' - <<: *parens_rules patterns: - include: '#code' - include: '#braces' - include: '#brackets' - - include: '#functions' - include: '#meta-commands' - include: '#type-hints' - include: '#literals' diff --git a/src/operators.YAML-tmLanguage b/src/operators.YAML-tmLanguage index e51b6f9..ac481fd 100644 --- a/src/operators.YAML-tmLanguage +++ b/src/operators.YAML-tmLanguage @@ -32,7 +32,7 @@ repository: match: '(\+=|\-=|\*=|\/=|\\=|<<=|>>=)' name: keyword.operator.arithmetic.assign.parigp - - match: '(\-|\+|\*|\/|\\|\\/|%)' + match: '(\-|\+|\*|\^|\/|\\|\\/|%)' name: keyword.operator.arithmetic.parigp - match: '(\.\.)' diff --git a/tests/other.test.gp b/tests/other.test.gp index 4cb59a0..9079145 100644 --- a/tests/other.test.gp +++ b/tests/other.test.gp @@ -1,16 +1,35 @@ ## SYNTAX TEST "source.parigp" "Functions" - [(x) -> x, 1] -##^ source.parigp meta.brackets.parigp punctuation.section.brackets.begin.parigp -## ^ source.parigp meta.brackets.parigp meta.parens.parigp punctuation.section.parens.begin.parigp -## ^ source.parigp meta.brackets.parigp meta.parens.parigp variable.name.parigp -## ^ source.parigp meta.brackets.parigp meta.parens.parigp punctuation.section.parens.end.parigp -## ^ ^ ^ source.parigp meta.brackets.parigp constant.character.whitespace.parigp -## ^^ source.parigp meta.brackets.parigp keyword.operator.lambda -## ^ source.parigp meta.brackets.parigp variable.name.parigp -## ^ source.parigp meta.brackets.parigp markup.punctuation.separator.parigp -## ^ source.parigp meta.brackets.parigp constant.numeric.int.parigp -## ^ source.parigp meta.brackets.parigp punctuation.section.brackets.end.parigp + + v = ((y, {z: t_INT = 1}) -> y^2 + z^2)(10) +##^ source.parigp variable.name.parigp +## ^ ^ source.parigp constant.character.whitespace.parigp +## ^ source.parigp keyword.operator.assignment.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp variable.parameter.function.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp markup.punctuation.separator.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp meta.function.parameter.optional.parigp meta.function.parameter.optional.begin.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp meta.function.parameter.optional.parigp variable.parameter.function.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp meta.function.parameter.optional.parigp markup.annotation.parigp +## ^ ^ ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp meta.function.parameter.optional.parigp constant.character.whitespace.parigp +## ^^^^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp meta.function.parameter.optional.parigp support.type.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp meta.function.parameter.optional.parigp keyword.operator.assignment.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp meta.function.parameter.optional.parigp constant.numeric.int.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp meta.function.parameter.optional.parigp meta.function.parameter.optional.end.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp punctuation.section.parens.end.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ ^ ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ ^ source.parigp meta.parens.parigp variable.name.parigp +## ^ ^ ^ source.parigp meta.parens.parigp keyword.operator.arithmetic.parigp +## ^ ^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp \q ##^^ source.parigp support.function.parigp @@ -35,3 +54,92 @@ ## ^^ source.parigp keyword.operator.shift.parigp ## ^ source.parigp constant.numeric.int.parigp ## ^ source.parigp markup.punctuation.statement-terminator.parigp + + x -> x +##^ source.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp variable.parameter.function.parigp +## ^ source.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ source.parigp constant.character.whitespace.parigp +## ^ source.parigp variable.name.parigp + + [(x) -> x, 1] +##^ source.parigp meta.brackets.parigp punctuation.section.brackets.begin.parigp +## ^^^ source.parigp meta.brackets.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp +## ^ source.parigp meta.brackets.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.brackets.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ source.parigp meta.brackets.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.brackets.parigp variable.name.parigp +## ^ source.parigp meta.brackets.parigp markup.punctuation.separator.parigp +## ^ source.parigp meta.brackets.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.brackets.parigp constant.numeric.int.parigp +## ^ source.parigp meta.brackets.parigp punctuation.section.brackets.end.parigp + + ({x} -> 1)() +##^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp + + (x -> 1)(10) +##^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp + + \\ Currying +##^^ source.parigp punctuation.definition.comment.parigp comment.line.double-slash.parigp + ((x) -> (y) -> y + x^2)(1)(2) +##^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp variable.parameter.function.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp punctuation.section.parens.end.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp variable.parameter.function.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp meta.parens.parigp punctuation.section.parens.end.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ ^ source.parigp meta.parens.parigp variable.name.parigp +## ^ ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp keyword.operator.arithmetic.parigp +## ^ source.parigp meta.parens.parigp keyword.operator.arithmetic.parigp +## ^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp +## ^ ^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ ^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp + + (x -> y -> y + x^2)(1)(2) +##^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp variable.parameter.function.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp entity.name.function.user.lambda.anonymous.parigp variable.parameter.function.parigp +## ^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp constant.character.whitespace.parigp +## ^^ source.parigp meta.parens.parigp meta.function.lambda.anonymous.parigp keyword.operator.lambda +## ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp variable.name.parigp +## ^ ^ source.parigp meta.parens.parigp constant.character.whitespace.parigp +## ^ source.parigp meta.parens.parigp keyword.operator.arithmetic.parigp +## ^ source.parigp meta.parens.parigp variable.name.parigp +## ^ source.parigp meta.parens.parigp keyword.operator.arithmetic.parigp +## ^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp +## ^ ^ source.parigp meta.parens.parigp punctuation.section.parens.begin.parigp +## ^ ^ source.parigp meta.parens.parigp constant.numeric.int.parigp +## ^ ^ source.parigp meta.parens.parigp punctuation.section.parens.end.parigp