isla icon indicating copy to clipboard operation
isla copied to clipboard

failure when trying to parse expressions containing nested `and`-`not` in prefix notation

Open michaelmera opened this issue 2 years ago • 1 comments

Here is a file reproducing the problem:

# isla_and_not.py
from isla.language import parse_isla

if __name__ == "__main__":
    parse_isla('(and (= <isbn10> "a") (= <isbn10> "b"))')              # no not     -> ok
    parse_isla('(not (= <isbn10> "a")) and (not (= <isbn10> "b"))')    # infix and  -> ok
    parse_isla('(and (not (= <isbn10> "a")) (not (= <isbn10> "b")))')  # prefix and -> fails

Output:

$ python isla_and_not.py
line 1:6 no viable alternative at input 'not'
Traceback (most recent call last):
  File "/home/isla/isla/src/isla/isla_language/IslaLanguageParser.py", line 1398, in sexpr
    la_ = self._interp.adaptivePredict(self._input,21,self._ctx)
  File "/usr/local/lib/python3.10/site-packages/antlr4/atn/ParserATNSimulator.py", line 346, in adaptivePredict
    alt = self.execATN(dfa, s0, input, index, outerContext)
  File "/usr/local/lib/python3.10/site-packages/antlr4/atn/ParserATNSimulator.py", line 418, in execATN
    raise e
antlr4.error.Errors.NoViableAltException: None

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/isla/files/isla_isbn10.py", line 79, in <module>
    parse_isla('(and (not (= <isbn10> "a")) (not (= <isbn10> "b")))')
  File "/home/isla/isla/src/isla/language.py", line 2921, in parse_isla
    antlr4.ParseTreeWalker().walk(isla_emitter, parser.start())
  File "/home/isla/isla/src/isla/isla_language/IslaLanguageParser.py", line 226, in start
    self.formula(0)
  File "/home/isla/isla/src/isla/isla_language/IslaLanguageParser.py", line 971, in formula
    self.sexpr(0)
  File "/home/isla/isla/src/isla/isla_language/IslaLanguageParser.py", line 1521, in sexpr
    self.sexpr(0)
  File "/home/isla/isla/src/isla/isla_language/IslaLanguageParser.py", line 1515, in sexpr
    localctx.op = self.sexpr(0)
  File "/home/isla/isla/src/isla/isla_language/IslaLanguageParser.py", line 1623, in sexpr
    self._errHandler.recover(self, re)
  File "/home/isla/isla/src/isla/language.py", line 2099, in recover
    super().recover(recognizer, e)
  File "/usr/local/lib/python3.10/site-packages/antlr4/error/ErrorStrategy.py", line 697, in recover
    raise ParseCancellationException(e)
antlr4.error.Errors.ParseCancellationException: None

michaelmera avatar Aug 27 '22 10:08 michaelmera

Thanks for reporting this. For the record (Michael knows this already): Expressing the constraint in infix/prefix syntax (without S-expressions!) circumvents this problem.

rindPHI avatar Aug 29 '22 02:08 rindPHI