Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ambiguity when combining tuple projection and when clause #2125

Open
sungshik opened this issue Jan 18, 2025 · 0 comments
Open

Ambiguity when combining tuple projection and when clause #2125

sungshik opened this issue Jan 18, 2025 · 0 comments

Comments

@sungshik
Copy link
Contributor

Describe the bug

An ambiguity may arise when tuple projection is combined with (pattern matching in) a when clause.

To Reproduce

First (no problem yet), the following function consumes a unary tuple and produces the same unary tuple in a contrived way:

rascal>tuple[str] f1(tuple[str] tup) = <tup<0>>;
tuple[str] (tuple[str]): function(|prompt:///|(0,41,<1,0>,<1,41>))

rascal>f1(<"foo">)
tuple[str]: <"foo">

Next (no problem still), the following function is the same as f1, except it has a superfluous when clause:

rascal>tuple[str] f2(tuple[str] tup) = <tup<0>> when <_> := tup;
tuple[str] (tuple[str]): function(|prompt:///|(0,57,<1,0>,<1,57>))

rascal>f2(<"foo">)
tuple[str]: <"foo">

Last (problem), the following function is the same as f2, except the when clause is more liberal (but equally superfluous):

rascal>tuple[str] f3(tuple[str] tup) = <tup<0>> when _ := tup;
Unexpected failure during parsing of current command: 
Ambiguous code (internal error), tuple[str] f3(tuple[str] tup) = <tup<0>> when _ := tup;

Expected behavior

No ambiguity error

Stack traces

org.rascalmpl.interpreter.asserts.Ambiguous: Ambiguous code (internal error), tuple[str] f3(tuple[str] tup) = <tup<0>> when _ := tup;
        at org.rascalmpl.parser.uptr.UPTRNodeFactory.buildAmbiguityNode(UPTRNodeFactory.java:76)
        at org.rascalmpl.parser.uptr.UPTRNodeFactory.createAmbiguityNode(UPTRNodeFactory.java:85)
        at org.rascalmpl.parser.uptr.UPTRNodeFactory.createAmbiguityNode(UPTRNodeFactory.java:23)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.convertToUPTR(SortContainerNodeFlattener.java:183)
        at org.rascalmpl.parser.gtd.result.out.DefaultNodeFlattener.convert(DefaultNodeFlattener.java:63)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.buildAlternative(SortContainerNodeFlattener.java:90)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.gatherProduction(SortContainerNodeFlattener.java:65)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.gatherAlternatives(SortContainerNodeFlattener.java:53)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.convertToUPTR(SortContainerNodeFlattener.java:166)
        at org.rascalmpl.parser.gtd.result.out.DefaultNodeFlattener.convert(DefaultNodeFlattener.java:63)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.buildAlternative(SortContainerNodeFlattener.java:90)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.gatherProduction(SortContainerNodeFlattener.java:65)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.gatherAlternatives(SortContainerNodeFlattener.java:53)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.convertToUPTR(SortContainerNodeFlattener.java:166)
        at org.rascalmpl.parser.gtd.result.out.DefaultNodeFlattener.convert(DefaultNodeFlattener.java:63)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.buildAlternative(SortContainerNodeFlattener.java:90)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.gatherProduction(SortContainerNodeFlattener.java:65)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.gatherProduction(SortContainerNodeFlattener.java:71)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.gatherProduction(SortContainerNodeFlattener.java:71)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.gatherAlternatives(SortContainerNodeFlattener.java:53)
        at org.rascalmpl.parser.gtd.result.out.SortContainerNodeFlattener.convertToUPTR(SortContainerNodeFlattener.java:166)
        at org.rascalmpl.parser.gtd.result.out.DefaultNodeFlattener.convert(DefaultNodeFlattener.java:63)
        at org.rascalmpl.parser.gtd.result.out.DefaultNodeFlattener.convert(DefaultNodeFlattener.java:79)
        at org.rascalmpl.parser.gtd.SGTDBF.buildResult(SGTDBF.java:1306)
        at org.rascalmpl.parser.gtd.SGTDBF.parse(SGTDBF.java:1245)
        at org.rascalmpl.parser.gtd.SGTDBF.parse(SGTDBF.java:1249)
        at org.rascalmpl.parser.gtd.SGTDBF.parse(SGTDBF.java:1261)
        at org.rascalmpl.interpreter.Evaluator.parseCommand(Evaluator.java:1052)
        at org.rascalmpl.interpreter.Evaluator.parseCommand(Evaluator.java:1042)
        at org.rascalmpl.repl.RascalInterpreterREPL.isStatementComplete(RascalInterpreterREPL.java:176)
        at org.rascalmpl.repl.BaseRascalREPL.handleInput(BaseRascalREPL.java:105)
        at org.rascalmpl.vscode.lsp.terminal.LSPTerminalREPL$1.handleInput(LSPTerminalREPL.java:233)
        at org.rascalmpl.repl.BaseREPL.handleInput(BaseREPL.java:179)
        at org.rascalmpl.repl.BaseREPL.run(BaseREPL.java:346)
        at org.rascalmpl.vscode.lsp.terminal.LSPTerminalREPL.main(LSPTerminalREPL.java:320)
@sungshik sungshik changed the title Ambiguity when combining tuple projection with when clause Ambiguity when combining tuple projection and when clause Jan 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant