[XQuery] A.2.2 Lexical Rules: bad transitions

XQuery 1.0: An XML Query Language
W3C Working Draft 12 November 2003

A.2.2 Lexical Rules

Some of the lexical states have incorrect transitions, causing the lexer
to reject valid queries.

Specifically:

------------------------------------------------------------------------
Query:   <!---- blah ----> | e
Query:   <?PITarget ?> | e
Query:   <![CDATA[x]]> | e

Problem: In each case, after the ">", the lexer is in DEFAULT, which
         doesn't recognize "|" (or any other operator).

Fix:     In DEFAULT, for the transitions on "<!----", "<?", and
         "<![CDATA[", change "pushState()" to "pushState(OPERATOR)".

Note: I reported this on November 28, 2002 (three versions ago), in
http://lists.w3.org/Archives/Public/public-qt-comments/2002Nov/0105.html

------------------------------------------------------------------------

Query:   <Q> { typeswitch (e) case e return e default return e } </Q>

Problem: After the "}", the lexer is in OPERATOR, which doesn't
         recognize "</".

Fix:     In DEFAULT, the transition for <"typeswitch" "("> should not
         involve "pushState(OPERATOR)".

------------------------------------------------------------------------

Query:   processing-instruction {x} {x}

Problem: Accepting the last "}" causes popState() on an empty stack.

Fix:     In OPERATOR, the transition for "{" needs "pushState()".

------------------------------------------------------------------------

Query:   declare variable $x as processing-instruction()? external; e

Problem: After the ")", the lexer is in OPERATOR, which doesn't
         recognize "?".

Fix:     In ITEMTYPE, the transition for <"processing-instruction" "(">
         should change "pushState(OPERATOR)" to
         "pushState(OCCURRENCEINDICATOR)".

------------------------------------------------------------------------

Query:   declare variable $x  external; e
Query:   declare function Q() external; e

Problem: These leave DEFAULT on the stack. It's not clear whether this
         means that the lexer should reject them, but even if not, it's
         still bad form: a lexer with a maximum stack size would be much
         more likely to hit its limit.

Fix:     In DEFAULT, for the transitions on <"declare" "variable" "$">
         and <"declare" "function">, don't "pushState(DEFAULT)".

------------------------------------------------------------------------

-Michael Dyck

Received on Friday, 23 January 2004 04:14:26 UTC