- From: Nico Verwer (Rakensi) <nverwer@rakensi.com>
- Date: Tue, 21 Jan 2025 09:01:34 +0100
- To: public-ixml@w3.org
- Message-ID: <62068c65-1397-4046-bf51-d887c40f447c@rakensi.com>
On 20-01-2025 16:33, John Lumley wrote:
>
> For example in
>
> functionCall: QName ¬ keyword,-"(", arguments, -")".
> keyword: "if" | "return" | ....
>
> would match i(...) oriff(..) but not if(...).
>
> But using the NOT operator:
>
> functionCall: !keyword, QName,-"(", arguments, -")".
> keyword: "if" | "return" | ....
>
> would succeed fori(...) and fail for if(...), as expected, but would
> also fail for iff(...) which is not the intent as the leading two
> characters match keyword and cause the rest of the production to fail.
>
This is indeed a potential pitfall of negative look-ahead.
A better way of doing the above would be:
functionCall: !(keyword, "("), QName,-"(", arguments, -")".
keyword: "if" | "return" | ....
which makes sure that the function name is not a complete keyword. I
have used constructions like this with PEG parsing, and it works. But
then whitespace might be allowed between a function name and the opening
parenthesis, and other syntactic constructions, and things get
complicated quickly.
Received on Tuesday, 21 January 2025 08:01:47 UTC