On Mon, May 12, 2025 at 10:24:12AM -0500, Eric Blake wrote: > On Mon, May 12, 2025 at 09:54:54AM -0500, Nikolaos Chatzikonstantinou wrote: > > > $ echo 'eval(1 || (1/0))' | m4-1.4.20 > > > 1 > > > $ echo 'eval(1 || (1/0))' | m4p > > > m4:stdin:1: divide by zero in eval: 1 || (1/0) > > > 1 > > > > > > > I have a file where I noted some of these here: > > https://codeberg.org/annoyingusername/m4p/src/branch/main/tests/resources/eval_bugs.txt > > Useful. The '1 || (0 / 0)' bug was indeed fixed in 1.4.20. '1 || 2 > &= 3' still complains about invalid operator, but that's intentional: > &= is not a supported operator. But the complaint about '1 || (2 &= > 3)') complaining about a missing right parenthesis (instead of a bad > operator) is something I hadn't noticed before today, and something still > present in 1.4.20. The parser is correctly detecting that the > expression is not valid at the point it hits the invalid operator; but > perhaps the error message could be improved (by stating that it > expects ')' instead of '&=', for example). > > Writing a parser that handles only good expressions is easy. Writing > a parser that provides sane error messages with useful suggestions > when the parse fails is hard. Yours may be the first (indirect) bug > report against 1.4.20!
And here's my first proposed patch for your project: diff --git i/m4p/m4_eval.py w/m4p/m4_eval.py index 91f97e7..6f2e565 100644 --- i/m4p/m4_eval.py +++ w/m4p/m4_eval.py @@ -168,7 +168,7 @@ calc_grammar = """ | "++" atom -> invalid_unary_operator | atom "--" -> invalid_unary_operator | atom "++" -> invalid_unary_operator - | "(" equation ")" + | "(" assignment ")" %import common.WS_INLINE so that 'echo "eval((1&3))" | m4p' outputs 1 instead of an error. -- Eric Blake, Principal Software Engineer Red Hat, Inc. Virtualization: qemu.org | libguestfs.org