Relax NG non-XML Grammar

source: relaxNG.g
topLevel
decl * ( pattern
| grammar ) END
decl
( "namespace" identifier "=" ( literal
| "inherit" ) )
| ( "default" "namespace" [ identifier ] "=" ( literal
| "inherit" ) )
| ( "datatypes" identifier "=" literal )
pattern
UnaryExpr [ ( "\\|" UnaryExpr ) +
| ( "," UnaryExpr ) +
| ( "&" UnaryExpr ) + ]
UnaryExpr
PrimaryExpr [ "\\*"
| "\\+"
| "\\?" ]
PrimaryExpr
"empty"
| "text"
| "notAllowed"
| ( "element" NameClass 0 "{" pattern "}" )
| ( "attribute" NameClass 1 "{" pattern "}" )
| ( "list" "{" pattern "}" )
| ( "mixed" "{" pattern "}" )
| ( "grammar" "{" grammar "}" )
| ( "\\(" pattern "\\)" )
| ( "externalRef" literal [ inherit ] )
| ( "parent" ref )
| ref
| datatypeValue
| ( datatypeName [ ( params [ Except ] )
| Except
| datatypeValue ] )
Except
"-" PrimaryExpr
NameClass inAttr
PrimaryNameClass inAttr [ ( "\\|" PrimaryNameClass inAttr ) * ]
PrimaryNameClass inAttr
UnprefixedNameClass inAttr
| PrefixedNameClass
| AnyNameClass inAttr
| NsNameClass inAttr
| ParenNameClass inAttr
UnprefixedNameClass inAttr
identifier
PrefixedNameClass
CName
NsNameClass inAttr
nsName [ "-" PrimaryNameClass inAttr ]
AnyNameClass inAttr
"\\*" [ "-" PrimaryNameClass inAttr ]
ParenNameClass inAttr
"\\(" NameClass inAttr "\\)"
ref
identifierNotKeyword
datatypeName
CName
| "string"
| "token"
datatypeValue
literal
params
"{" ( identifier "=" literal ) + "}"
grammar
( definition
| include ) +
definition
defLHS pattern
defLHS
( "start" ( "="
| "\\|="
| "&=" ) )
| identDEF
include
"include" literal [ inherit ] [ "{" definition * "}" ]
inherit
"inherit" "=" identifier
literal
literal1
| literal2