Skip to content

Commit

Permalink
fix: support anonymous lambdas, ensure balanced parentheses for param…
Browse files Browse the repository at this point in the history
…eter list, closes #1
  • Loading branch information
piotr-semenov committed May 6, 2024
1 parent 360d8fe commit 15c829d
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 17 deletions.
7 changes: 4 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 > $@

Expand Down
14 changes: 13 additions & 1 deletion src/functions.YAML-tmLanguage.j2
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,26 @@ 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:
name: entity.name.function.user.lambda.parigp
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: '(?<=\=)'
Expand Down
2 changes: 1 addition & 1 deletion src/main.YAML-tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
2 changes: 1 addition & 1 deletion src/operators.YAML-tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ repository:
match: '(\+=|\-=|\*=|\/=|\\=|<<=|>>=)'
name: keyword.operator.arithmetic.assign.parigp
-
match: '(\-|\+|\*|\/|\\|\\/|%)'
match: '(\-|\+|\*|\^|\/|\\|\\/|%)'
name: keyword.operator.arithmetic.parigp
-
match: '(\.\.)'
Expand Down
130 changes: 119 additions & 11 deletions tests/other.test.gp
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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

0 comments on commit 15c829d

Please sign in to comment.