blob: bb5b1e517c00585ac6dc1a98d5687e12e49ab3cf [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--========================================================================
DTD (Document Type Definition) for grammar definition originally created
by James Clark. The idea is to define an abstract grammar in XML than
may then be used by documentation, directly by parser generators,
or via an XSLT stylesheet or other transformation, may generate
a parser compiler specification such as for YACC or JavaCC.
$Log$
Revision 1.1.2.1 2002/08/14 18:47:41 pauldick
Xalan3 specific additions.
Revision 1.1 2002/07/14 05:47:11 sboag
new grammar definition set for XPath2.
Revision 1.10 2002/03/17 21:31:08 sboag
Made new grammar element, <next/> for use in primary or prefix expressions,
to control when the next element is going to be called. Somewhat experemental.
Changed javacc stylesheet and bnf stylesheets to handle g:next.
Fixed bugs with child::text(), by adding text, comment, etc., tokens to after forward
or reverse axis. (note: have to do the same to names after @). This is yet
another bad hack.
Fixed bug with @type, by adding At token to lexical stateswitch into QNAME state
for XQuery.
Revision 1.9 2002/03/06 13:41:44 sboag
Add some attributes for control of prefix productions.
Revision 1.8 2001/12/20 21:01:14 sboag
Added Jerome's Core changes, and fixed stuff to make core.jar and a core applet.
Revision 1.7 2001/12/09 22:07:16 sboag
Fixed problem with comments from previous checkin.
Revision 1.6 2001/12/09 21:39:37 sboag
[batch checkin] Added {- - comment - -} type comments.
Added ";" list query processing. Added some stuff for ^char handling in reg
expressions, in order to support CharData better, but backed out of this (but
left some of the support in. Removed old type def and group stuff (can look to
previous versions if we want to add this back in). Changed to case sensitivity
in grammar, and updated fragment.xml. Added optional (AT schemaLocation)? to
SchemaImport. Other minor changes in support of WG decisions.
Revision 1.5 2001/12/07 09:09:27 sboag
Add a "show" attribute for RequiredSkip that allows control of whether or not
to show the whitespace in the EBNF productions. Only show it in those cases
where it is required to disambiguate a token.
Revision 1.4 2001/11/16 21:53:34 sboag
I thought I already did this once, but changed action attribute to use CDATA
instead of just popState|pushState, to enable pushState(STATE).
Revision 1.3 2001/11/15 06:18:40 sboag
Change type for action attribute to CDATA, in order to support
action="pushState(STATETOKEN)".
=========================================================================-->
<!-- The root element of the definition -->
<!ELEMENT grammar (language | start | token | skip | exprProduction | lexical-state-transitions | production)+>
<!ATTLIST grammar
xmlns CDATA #FIXED "http://www.w3.org/2001/03/XPath/grammar"
>
<!-- Declare a language subset or superset, if they are used in the
if attributes.
Attributes:
id -> the id of the language. 'if' attributes should map to these ids.
display-name -> The name to use for the descriptive name of the language.
-->
<!ELEMENT language EMPTY>
<!ATTLIST language
id ID #REQUIRED
display-name CDATA #REQUIRED
>
<!-- The grammar must say where the start point is.
Attributes:
name -> the name of the starting production.
state -> the start state for lexical matching.
if -> space separated list of tokens for conditional processing.
-->
<!ELEMENT start EMPTY>
<!ATTLIST start
name IDREF #REQUIRED
state CDATA #IMPLIED
if IDREFS #IMPLIED
>
<!-- ============= Lexical Specifications (terminals) ==============-->
<!-- Define a token.
Attributes:
name -> the name of the token.
if -> space separated list of tokens for conditional processing.
inline -> tell if the BNF description should expand this token inline.
override -> (not sure what this does yet. -sb)
recognize -> The state where this token will be recognized.
is-macro -> "yes" if this token can be used just as a macro,
and not as a true token.
value-type -> If just a grammatical token, use "none",
or use "string" for a string value
or use "number" for a number value
or use "id" if it is a token value with meaning.
-->
<!ELEMENT token (string | zeroOrMore | charClass | requiredSkip | optional | ref | choice | optionalSkip | oneOrMore)+>
<!ATTLIST token
name ID #REQUIRED
if IDREFS #IMPLIED
inline CDATA #IMPLIED
override CDATA #IMPLIED
recognize CDATA #IMPLIED
is-macro (yes | no) #IMPLIED
special (no | yes) #IMPLIED
value-type (none | string | number | id) #IMPLIED
show (yes | no) #IMPLIED
>
<!-- Specification of a single character token. -->
<!ELEMENT char (#PCDATA)>
<!ATTLIST char
if IDREFS #IMPLIED
complement (no | yes) #IMPLIED
>
<!-- SGML mode in emacs doesn't like this, so I'm avoiding it for now. -->
<!-- ATTLIST char
xml:space CDATA #IMPLIED
-->
<!ELEMENT charClass (charCode | char | charCodeRange | charRange)+>
<!ELEMENT charCode EMPTY>
<!ATTLIST charCode
value CDATA #REQUIRED
if IDREFS #IMPLIED
>
<!ELEMENT charCodeRange EMPTY>
<!ATTLIST charCodeRange
minValue CDATA #REQUIRED
maxValue CDATA #REQUIRED
if IDREFS #IMPLIED
>
<!ELEMENT charRange EMPTY>
<!ATTLIST charRange
minChar (0 | A | a) #REQUIRED
maxChar (9 | F | f) #REQUIRED
if IDREFS #IMPLIED
>
<!-- Defines a character that must be complemented by another character of
the same value, such as a quote. -->
<!ELEMENT complement (charClass)>
<!ATTLIST complement
if IDREFS #IMPLIED
>
<!-- Defines a string token. -->
<!ELEMENT string (#PCDATA)>
<!ATTLIST string
ignoreCase CDATA #IMPLIED
if IDREFS #IMPLIED
>
<!ELEMENT skip (choice | ref)>
<!ATTLIST skip
recognize CDATA #IMPLIED
if IDREFS #IMPLIED
>
<!ELEMENT requiredSkip EMPTY>
<!ATTLIST requiredSkip
recognize CDATA #IMPLIED
if IDREFS #IMPLIED
show (yes | no) #IMPLIED
>
<!--=================== Lexical State Transitions =================== -->
<!-- Define a transition table for lexical states. Using this is more
convenient and cleaner than defining transitions for each token.
Attributes:
if -> space separated list of tokens for conditional processing.
(Not currently used by the stylesheet!)
-->
<!ELEMENT lexical-state-transitions (transition-default?, transition+)>
<!ATTLIST lexical-state-transitions
if IDREFS #REQUIRED
>
<!-- Define the default transition for all tokens not defined by the
transition element.
Attributes:
if -> space separated list of tokens for conditional processing.
(Not currently used by the stylesheet!)
recognize -> The state where the tokens will be recognized.
nextState -> The next state to transition to. Invalid if popState us
used for the action.
action -> State stack action.
-->
<!ELEMENT transition-default EMPTY>
<!ATTLIST transition-default
if IDREFS #IMPLIED
recognize CDATA #IMPLIED
nextState CDATA #IMPLIED
action CDATA #IMPLIED
>
<!-- Define a transition for a token or set of tokens.
Attributes:
refs -> IDREFS list of the tokens for which this transition applies.
if -> space separated list of tokens for conditional processing.
(Not currently used by the stylesheet!)
recognize -> The state where the tokens will be recognized.
nextState -> The next state to transition to. Invalid if popState us
used for the action.
action -> State stack action.
-->
<!ELEMENT transition EMPTY>
<!ATTLIST transition
refs IDREFS #REQUIRED
if IDREFS #IMPLIED
recognize CDATA #IMPLIED
nextState CDATA #IMPLIED
action CDATA #IMPLIED
>
<!--=================== Parser Production Specifications ===============-->
<!-- A production that defines a "cascade" of productions that define
operator precedence.
name -> the ID of the production.
if -> space separated list of tokens for conditional processing.
-->
<!ELEMENT exprProduction (level+)>
<!ATTLIST exprProduction
name ID #REQUIRED
if IDREFS #IMPLIED
>
<!ELEMENT level (postfix | binary | prefix | primary)+>
<!ATTLIST level
if IDREFS #IMPLIED
>
<!-- Basic non-terminal production.
name -> the ID of the production.
if -> space separated list of tokens for conditional processing.
show -> Don't show in the BNF if this value is "no".
-->
<!ELEMENT production (optional | ref | choice | sequence | zeroOrMore | oneOrMore)+>
<!ATTLIST production
name ID #REQUIRED
if IDREFS #IMPLIED
show (yes | no) #IMPLIED
>
<!-- Defines a binary operator.
name -> the ID of the production.
if -> space separated list of tokens for conditional processing.
Example:
<binary name="EqualityExpr">
<choice>
<ref name="Equals"/>
<ref name="NotEquals"/>
</choice>
</binary>
-->
<!ELEMENT binary (ref | choice)>
<!ATTLIST binary
name ID #REQUIRED
if IDREFS #IMPLIED
>
<!ELEMENT optionalSkip EMPTY>
<!ATTLIST optionalSkip
if IDREFS #IMPLIED
>
<!ELEMENT postfix (ref | optional)+>
<!ATTLIST postfix
name ID #REQUIRED
if IDREFS #IMPLIED
>
<!ELEMENT prefix (optional | ref | choice | zeroOrMore | oneOrMore | sequence | next)+>
<!ATTLIST prefix
name ID #REQUIRED
if IDREFS #IMPLIED
prefix-seq-type CDATA "*"
>
<!-- This element is used in exprProduction to control where the next production
will be called from. If it is not used, the next production will automatically be
called.
-->
<!ELEMENT next EMPTY>
<!ATTLIST next
if IDREFS #IMPLIED
>
<!ELEMENT primary (optional | ref | choice | zeroOrMore | oneOrMore)+>
<!ATTLIST primary
name ID #REQUIRED
if IDREFS #IMPLIED
>
<!ELEMENT ref EMPTY>
<!ATTLIST ref
name IDREF #REQUIRED
if IDREFS #IMPLIED
>
<!--================ General Constructs =================-->
<!ELEMENT zeroOrMore (string | charClass | optional | ref |
choice | optional | zeroOrMore | oneOrMore | sequence | complement)+>
<!ATTLIST zeroOrMore
name ID #IMPLIED
if IDREFS #IMPLIED
>
<!ELEMENT oneOrMore (string | charClass | optional | ref |
choice | optional | zeroOrMore | oneOrMore | sequence | complement)+>
<!ATTLIST oneOrMore
name ID #IMPLIED
if IDREFS #IMPLIED
>
<!ELEMENT optional (string | charClass | optional | ref |
choice | optional | zeroOrMore | oneOrMore | sequence | complement)+>
<!ATTLIST optional
name ID #IMPLIED
if IDREFS #IMPLIED
>
<!ELEMENT choice (ref | string | sequence)+>
<!ATTLIST choice
name ID #IMPLIED
break CDATA #IMPLIED
if IDREFS #IMPLIED
>
<!ELEMENT sequence (string | ref | optional | zeroOrMore | choice | next)+>
<!ATTLIST sequence
name ID #IMPLIED
if IDREFS #IMPLIED
>