diff --git a/src/main/lang/prolog.bnf b/src/main/lang/prolog.bnf index 44f5505..c02729c 100644 --- a/src/main/lang/prolog.bnf +++ b/src/main/lang/prolog.bnf @@ -93,7 +93,7 @@ list_constructor ::= '[' ']' | '[' primary '|' primary ']' | '[' primary ']' common_val ::= common_predicate | ident | literal | list_constructor | '_' -private common_val_or_paren ::= common_val | '(' common_val ')' | '{' common_val '}' +private common_val_or_paren ::= common_val | '(' primary ')' | '{' primary '}' private primary ::= (common_val_or_paren | logical_not | operator_id) (common_val_or_paren | equiv_binary | logical_or | operator_id)* diff --git a/src/test/scala/parser/PrologParsingTestCaseBase.scala b/src/test/scala/parser/PrologParsingTestCaseBase.scala index ff926b0..e0b084a 100644 --- a/src/test/scala/parser/PrologParsingTestCaseBase.scala +++ b/src/test/scala/parser/PrologParsingTestCaseBase.scala @@ -14,6 +14,10 @@ class PrologParsingTestCaseBase extends ParsingTestCase("", "pl", new PrologPars doTest(true) } + def testIssue20(): Unit = { + doTest(true) + } + override def includeRanges(): Boolean = true override def skipSpaces(): Boolean = true diff --git a/src/test/testData/Issue20.pl b/src/test/testData/Issue20.pl new file mode 100644 index 0000000..cf6a836 --- /dev/null +++ b/src/test/testData/Issue20.pl @@ -0,0 +1,7 @@ +ast(Tokens, Out, Options) :- + catch( + ( + maplist, + debug(ast, "Renamed", [Renamed]) + ) + ). \ No newline at end of file diff --git a/src/test/testData/Issue20.txt b/src/test/testData/Issue20.txt new file mode 100644 index 0000000..36243ba --- /dev/null +++ b/src/test/testData/Issue20.txt @@ -0,0 +1,70 @@ +FILE(0,132) + PrologToplevelExprImpl(TOPLEVEL_EXPR)(0,131) + PrologExprHeadImpl(EXPR_HEAD)(0,25) + PrologPredicateImpl(PREDICATE)(0,25) + PrologPredicateIdImpl(PREDICATE_ID)(0,3) + PsiElement(const_id)('ast')(0,3) + PrologParameterListImpl(PARAMETER_LIST)(3,25) + PsiElement(()('(')(3,4) + PrologCommonValImpl(COMMON_VAL)(4,10) + PrologIdentImpl(IDENT)(4,10) + PsiElement(atom_id)('Tokens')(4,10) + PrologEquivBinaryImpl(EQUIV_BINARY)(10,24) + PrologLogicalAndImpl(LOGICAL_AND)(10,24) + PsiElement(,)(',')(10,11) + PrologCommonValImpl(COMMON_VAL)(12,15) + PrologIdentImpl(IDENT)(12,15) + PsiElement(atom_id)('Out')(12,15) + PrologEquivBinaryImpl(EQUIV_BINARY)(15,24) + PrologLogicalAndImpl(LOGICAL_AND)(15,24) + PsiElement(,)(',')(15,16) + PrologCommonValImpl(COMMON_VAL)(17,24) + PrologIdentImpl(IDENT)(17,24) + PsiElement(atom_id)('Options')(17,24) + PsiElement())(')')(24,25) + PsiElement(:-)(':-')(26,28) + PrologExprBodyImpl(EXPR_BODY)(33,131) + PrologCommonValImpl(COMMON_VAL)(33,131) + PrologCommonPredicateImpl(COMMON_PREDICATE)(33,131) + PrologRefPredicateIdImpl(REF_PREDICATE_ID)(33,38) + PsiElement(const_id)('catch')(33,38) + PrologParameterListImpl(PARAMETER_LIST)(38,131) + PsiElement(()('(')(38,39) + PsiElement(()('(')(48,49) + PrologCommonValImpl(COMMON_VAL)(62,69) + PrologCommonPredicateImpl(COMMON_PREDICATE)(62,69) + PrologRefPredicateIdImpl(REF_PREDICATE_ID)(62,69) + PsiElement(const_id)('maplist')(62,69) + PrologEquivBinaryImpl(EQUIV_BINARY)(69,115) + PrologLogicalAndImpl(LOGICAL_AND)(69,115) + PsiElement(,)(',')(69,70) + PrologCommonValImpl(COMMON_VAL)(83,115) + PrologCommonPredicateImpl(COMMON_PREDICATE)(83,115) + PrologRefPredicateIdImpl(REF_PREDICATE_ID)(83,88) + PsiElement(const_id)('debug')(83,88) + PrologParameterListImpl(PARAMETER_LIST)(88,115) + PsiElement(()('(')(88,89) + PrologCommonValImpl(COMMON_VAL)(89,92) + PrologCommonPredicateImpl(COMMON_PREDICATE)(89,92) + PrologRefPredicateIdImpl(REF_PREDICATE_ID)(89,92) + PsiElement(const_id)('ast')(89,92) + PrologEquivBinaryImpl(EQUIV_BINARY)(92,114) + PrologLogicalAndImpl(LOGICAL_AND)(92,114) + PsiElement(,)(',')(92,93) + PrologCommonValImpl(COMMON_VAL)(94,103) + PrologLiteralImpl(LITERAL)(94,103) + PsiElement(string)('"Renamed"')(94,103) + PrologEquivBinaryImpl(EQUIV_BINARY)(103,114) + PrologLogicalAndImpl(LOGICAL_AND)(103,114) + PsiElement(,)(',')(103,104) + PrologCommonValImpl(COMMON_VAL)(105,114) + PrologListConstructorImpl(LIST_CONSTRUCTOR)(105,114) + PsiElement([)('[')(105,106) + PrologCommonValImpl(COMMON_VAL)(106,113) + PrologIdentImpl(IDENT)(106,113) + PsiElement(atom_id)('Renamed')(106,113) + PsiElement(])(']')(113,114) + PsiElement())(')')(114,115) + PsiElement())(')')(124,125) + PsiElement())(')')(130,131) + PsiElement(.)('.')(131,132)