[m-users.] Determinism issue with parser
Sean Charles (emacstheviking)
objitsu at gmail.com
Sun Jul 4 23:17:42 AEST 2021
I am having terrible push—pull whack-a-mole issues with my parser and it is literally driving me to despair, I have read 6, 6.1 6,2 over and over until the words have become one long unintelligible mantra of confusion.
I thought —I— decided the determinism then wrote the code and the compiler moans at me to tell me I got it wrong. I can accept that. But I just don’t ‘get it’ yet. Case in point, of the of many errors I now have… …and once again I failed to represent my problem so nobody can help me. Perhaps I can ask some more general questions and then apply the answers to my brain and then to my code? Except I am so confused I can’t frame a question.
ast.m:040: In `on_lexer'(in, in, out):
ast.m:040: error: determinism declaration not satisfied.
ast.m:040: Declared `det', inferred `multi'.
ast.m:115: Call to `ast.parse_all'(in, out, in, out) can succeed more than
ast.m:115: once.
ast.m:254: In `parse_body_term'(out, in, out):
ast.m:254: warning: determinism declaration could be tighter.
ast.m:254: Declared `nondet', inferred `multi'.
ast.m:275: In `parse_fncall'(out, in, out):
ast.m:275: error: determinism declaration not satisfied.
ast.m:275: Declared `semidet', inferred `nondet'.
ast.m:283: Call to `ast.parse_body'(in, out, in, out) can succeed more than
ast.m:283: once.
ast.m:431: In `sexp_or_error'(out, in, in, out):
ast.m:431: error: determinism declaration not satisfied.
So I change one and then recompile and it pops up somewhere else until eventually, the ‘det’ entry point into the module wants to be multi… sigh.
I ditched DCG syntax in favour of state variables which helped readability.
How does the compiler know something is ‘multi’. I guess I don’t know how to interpret the manual properly.
If all possible calls to a particular mode of a predicate or function which return to the caller (calls which terminate, do not throw an exception and do not cause a fatal runtime error)
• have exactly one solution, then that mode is deterministic (det);
• either have no solutions or have one solution, then that mode is semideterministic
(semidet);
• have at least one solution but may have more, then that mode is multi-solution(multi);
• have zero or more solutions, then that mode is nondeterministic (nondet);
• fail without producing a solution, then that mode has a determinism of failure.
I parse a file into a stream of tokens, there can be only one correct way to parse those into a well formed program. One. So the ast builder either fails or it doesnt, that is trapped in the code and a maybe_error is handed back, hence I figure the predicate, as seen by the caller (the REPL atm) should be `det`.
What does it ‘mean’ to be able to have more than one solution? I am not really writing Prolog like code i.e. swathes of facts and rules being interrogated, I am happy with choice-points and backtracking (I thought so anyway).
If I had some good clean examples I think I’d be fine, I look forward to the Eureka moment regarding how to defend myself against the big scary Determinasaurus Rex once and for all because until then I think I’m losing what’s left of my tiny little mind. Mercury feels like the language I wish I’d found 20 years ago and I am determined to get over this obstacle.
Thanks.
Sean
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/users/attachments/20210704/fec766df/attachment.html>
More information about the users
mailing list