view etc/schema/xslt.rnc @ 110305:b10051866f51

New syntax-propertize functionality. * lisp/font-lock.el (font-lock-syntactic-keywords): Make obsolete. (font-lock-fontify-syntactic-keywords-region): Move handling of font-lock-syntactically-fontified to... (font-lock-default-fontify-region): ...here. Let syntax-propertize-function take precedence. (font-lock-fontify-syntactically-region): Cal syntax-propertize. * lisp/emacs-lisp/regexp-opt.el (regexp-opt-depth): Skip named groups. * lisp/emacs-lisp/syntax.el (syntax-propertize-function) (syntax-propertize-chunk-size, syntax-propertize--done) (syntax-propertize-extend-region-functions): New vars. (syntax-propertize-wholelines, syntax-propertize-multiline) (syntax-propertize--shift-groups, syntax-propertize-via-font-lock) (syntax-propertize): New functions. (syntax-propertize-rules): New macro. (syntax-ppss-flush-cache): Set syntax-propertize--done. (syntax-ppss): Call syntax-propertize. * lisp/progmodes/ada-mode.el (ada-set-syntax-table-properties) (ada-after-change-function, ada-initialize-syntax-table-properties) (ada-handle-syntax-table-properties): Only define when syntax-propertize is not available. (ada-mode): Use syntax-propertize-function. * lisp/progmodes/autoconf.el (autoconf-mode): Use syntax-propertize-function. (autoconf-font-lock-syntactic-keywords): Remove. * lisp/progmodes/cfengine.el (cfengine-mode): Use syntax-propertize-function. (cfengine-font-lock-syntactic-keywords): Remove. * lisp/progmodes/cperl-mode.el (cperl-mode): Use syntax-propertize-function. * lisp/progmodes/fortran.el (fortran-mode): Use syntax-propertize-function. (fortran--font-lock-syntactic-keywords): New var. (fortran-line-length): Update syntax-propertize-function and fortran--font-lock-syntactic-keywords. * lisp/progmodes/gud.el (gdb-script-syntax-propertize-function): New var; replaces gdb-script-font-lock-syntactic-keywords. (gdb-script-mode): Use it. * lisp/progmodes/js.el (js--regexp-literal): Define while compiling. (js-syntax-propertize-function): New var; replaces js-font-lock-syntactic-keywords. (js-mode): Use it. * lisp/progmodes/make-mode.el (makefile-syntax-propertize-function): New var; replaces makefile-font-lock-syntactic-keywords. (makefile-mode): Use it. (makefile-imake-mode): Adjust. * lisp/progmodes/mixal-mode.el (mixal-syntax-propertize-function): New var; replaces mixal-font-lock-syntactic-keywords. (mixal-mode): Use it. * lisp/progmodes/octave-mod.el (octave-syntax-propertize-sqs): New function to replace octave-font-lock-close-quotes. (octave-syntax-propertize-function): New function to replace octave-font-lock-syntactic-keywords. (octave-mode): Use it. * lisp/progmodes/perl-mode.el (perl-syntax-propertize-function): New fun to replace perl-font-lock-syntactic-keywords. (perl-syntax-propertize-special-constructs): New fun to replace perl-font-lock-special-syntactic-constructs. (perl-font-lock-syntactic-face-function): New fun. (perl-mode): Use it. * lisp/progmodes/python.el (python-syntax-propertize-function): New var to replace python-font-lock-syntactic-keywords. (python-mode): Use it. (python-quote-syntax): Simplify and adjust to new use. * lisp/progmodes/ruby-mode.el (ruby-here-doc-beg-re): Define while compiling. (ruby-here-doc-end-re, ruby-here-doc-beg-match) (ruby-font-lock-syntactic-keywords, ruby-comment-beg-syntax) (syntax-ppss, ruby-in-ppss-context-p, ruby-in-here-doc-p) (ruby-here-doc-find-end, ruby-here-doc-beg-syntax) (ruby-here-doc-end-syntax): Only define when syntax-propertize is not available. (ruby-syntax-propertize-function, ruby-syntax-propertize-heredoc): New functions. (ruby-in-ppss-context-p): Update to new syntax of heredocs. (electric-indent-chars): Silence bytecompiler. (ruby-mode): Use prog-mode, syntax-propertize-function, and electric-indent-chars. * lisp/progmodes/sh-script.el (sh-st-symbol): Remove. (sh-font-lock-close-heredoc, sh-font-lock-open-heredoc): Add eol arg. (sh-font-lock-flush-syntax-ppss-cache, sh-font-lock-here-doc): Remove. (sh-font-lock-quoted-subshell): Assume we've already matched $(. (sh-font-lock-paren): Set syntax-multiline. (sh-font-lock-syntactic-keywords): Remove. (sh-syntax-propertize-function): New function to replace it. (sh-mode): Use it. * lisp/progmodes/simula.el (simula-syntax-propertize-function): New var to replace simula-font-lock-syntactic-keywords. (simula-mode): Use it. * lisp/progmodes/tcl.el (tcl-syntax-propertize-function): New var to replace tcl-font-lock-syntactic-keywords. (tcl-mode): Use it. * lisp/progmodes/vhdl-mode.el (vhdl-mode): Use syntax-propertize-function if available. (vhdl-fontify-buffer): Adjust. * lisp/textmodes/bibtex.el (bibtex-mode): Use syntax-propertize-function. * lisp/textmodes/reftex.el (font-lock-syntactic-keywords): Don't declare since we don't use it. * lisp/textmodes/sgml-mode.el (sgml-syntax-propertize-function): New var to replace sgml-font-lock-syntactic-keywords. (sgml-mode): Use it. * lisp/textmodes/tex-mode.el (tex-common-initialization, doctex-mode): Use syntax-propertize-function. * lisp/textmodes/texinfo.el (texinfo-syntax-propertize-function): New fun to replace texinfo-font-lock-syntactic-keywords. (texinfo-mode): Use it. * test/indent/octave.m: Remove some `fixindent' not needed any more.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sat, 11 Sep 2010 01:13:42 +0200
parents bb94fc610c9f
children
line wrap: on
line source

# Copyright (C) 2001-2008 World Wide Web Consortium, (Massachusetts
# Institute of Technology, European Research Consortium for
# Informatics and Mathematics, Keio University).  All Rights Reserved.
# This work is distributed under the W3C(R) Software License in the
# hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE.

# This was mostly generated from the syntax summary in the XSLT
# Recommendation (using XSLT of course).

# Issues: this validates extension elements as literal result
# elements, which is overly restrictive.

namespace local = ""
default namespace xsl = "http://www.w3.org/1999/XSL/Transform"

start =
  stylesheet.element
  | transform.element
  | literal-result-element-as-stylesheet
version = "1.0"
top-level-elements.model =
  (top-level-element.category | top-level-extension)*
top-level-extension =
  element * - (xsl:* | local:*) {
    grammar {
      start = any
      any =
        (attribute * { text }
         | text
         | element * { any })*
    }
  }
template.model = (instruction.category | literal-result-element | text)*
literal-result-element-as-stylesheet =
  element * - xsl:* {
    attribute xsl:version { version },
    literal-result-element-no-version.atts,
    template.model
  }
literal-result-element =
  element * - xsl:* { literal-result-element.atts, template.model }
literal-result-element.atts =
  literal-result-element-no-version.atts,
  attribute xsl:version { version }?
literal-result-element-no-version.atts =
  (attribute * - xsl:* { avt.datatype }
   | attribute xsl:extension-element-prefixes { prefixes.datatype }
   | attribute xsl:exclude-result-prefixes { prefixes.datatype }
   | attribute xsl:use-attribute-sets { qnames.datatype })*
top-level-element.category =
  include.element
  | strip-space.element
  | preserve-space.element
  | template.element
  | namespace-alias.element
  | attribute-set.element
  | variable.element
  | param.element
  | key.element
  | decimal-format.element
  | output.element
instruction.category =
  apply-templates.element
  | apply-imports.element
  | call-template.element
  | element.element
  | attribute.element
  | text.element
  | processing-instruction.element
  | comment.element
  | copy.element
  | value-of.element
  | number.element
  | for-each.element
  | if.element
  | choose.element
  | variable.element
  | copy-of.element
  | message.element
  | fallback.element
extension.atts = attribute * - (xsl:* | local:*) { text }*
stylesheet.element = element stylesheet { stylesheet.model }
transform.element = element transform { stylesheet.model }
stylesheet.model =
  extension.atts,
  attribute id { xsd:NCName }?,
  attribute extension-element-prefixes { prefixes.datatype }?,
  attribute exclude-result-prefixes { prefixes.datatype }?,
  attribute version { version },
  (import.element*, top-level-elements.model)
include.element =
  element include {
    extension.atts,
    attribute href { xsd:anyURI }
  }
import.element =
  element import {
    extension.atts,
    attribute href { xsd:anyURI }
  }
strip-space.element =
  element strip-space {
    extension.atts,
    attribute elements { wildcards.datatype }
  }
preserve-space.element =
  element preserve-space {
    extension.atts,
    attribute elements { wildcards.datatype }
  }
template.element =
  element template {
    extension.atts,
    attribute match { pattern.datatype }?,
    attribute name { qname.datatype }?,
    attribute priority { number.datatype }?,
    attribute mode { qname.datatype }?,
    (param.element*, template.model)
  }
apply-templates.element =
  element apply-templates {
    extension.atts,
    attribute select { expression.datatype }?,
    attribute mode { qname.datatype }?,
    (sort.element | with-param.element)*
  }
apply-imports.element = element apply-imports { extension.atts }
call-template.element =
  element call-template {
    extension.atts,
    attribute name { qname.datatype },
    with-param.element*
  }
namespace-alias.element =
  element namespace-alias {
    extension.atts,
    attribute stylesheet-prefix { prefix.datatype },
    attribute result-prefix { prefix.datatype }
  }
element.element =
  element element {
    extension.atts,
    attribute name { qname.datatype | expr-avt.datatype },
    attribute namespace { xsd:anyURI | brace-avt.datatype }?,
    attribute use-attribute-sets { qnames.datatype }?,
    template.model
  }
attribute.element =
  element attribute {
    extension.atts,
    attribute name { qname.datatype | expr-avt.datatype },
    attribute namespace { xsd:anyURI | brace-avt.datatype }?,
    template.model
  }
attribute-set.element =
  element attribute-set {
    extension.atts,
    attribute name { qname.datatype },
    attribute use-attribute-sets { qnames.datatype }?,
    attribute.element*
  }
text.element =
  element text {
    extension.atts,
    attribute disable-output-escaping {
      xsd:string "yes" | xsd:string "no"
    }?,
    text
  }
processing-instruction.element =
  element processing-instruction {
    extension.atts,
    attribute name { xsd:NCName | expr-avt.datatype },
    template.model
  }
comment.element = element comment { extension.atts, template.model }
copy.element =
  element copy {
    extension.atts,
    attribute use-attribute-sets { qnames.datatype }?,
    template.model
  }
value-of.element =
  element value-of {
    extension.atts,
    attribute select { expression.datatype },
    attribute disable-output-escaping {
      xsd:string "yes" | xsd:string "no"
    }?
  }
number.element =
  element number {
    extension.atts,
    attribute level {
      xsd:string "single" | xsd:string "multiple" | xsd:string "any"
    }?,
    attribute count { pattern.datatype }?,
    attribute from { pattern.datatype }?,
    attribute value { expression.datatype }?,
    attribute format { avt.datatype }?,
    attribute lang { xsd:NMTOKEN | expr-avt.datatype }?,
    attribute letter-value {
      xsd:string "alphabetic"
      | xsd:string "traditional"
      | expr-avt.datatype
    }?,
    attribute grouping-separator { char.datatype | expr-avt.datatype }?,
    attribute grouping-size { number.datatype | expr-avt.datatype }?
  }
for-each.element =
  element for-each {
    extension.atts,
    attribute select { expression.datatype },
    (sort.element*, template.model)
  }
if.element =
  element if {
    extension.atts,
    attribute test { expression.datatype },
    template.model
  }
choose.element =
  element choose { extension.atts, (when.element+, otherwise.element?) }
when.element =
  element when {
    extension.atts,
    attribute test { expression.datatype },
    template.model
  }
otherwise.element = element otherwise { extension.atts, template.model }
sort.element =
  element sort {
    extension.atts,
    attribute select { expression.datatype }?,
    attribute lang { xsd:NMTOKEN | expr-avt.datatype }?,
    attribute data-type {
      xsd:string "text"
      | xsd:string "number"
      | qname-but-not-ncname.datatype
      | expr-avt.datatype
    }?,
    attribute order {
      xsd:string "ascending"
      | xsd:string "descending"
      | expr-avt.datatype
    }?,
    attribute case-order {
      xsd:string "upper-first"
      | xsd:string "lower-first"
      | expr-avt.datatype
    }?
  }
variable.element =
  element variable {
    extension.atts,
    attribute name { qname.datatype },
    (attribute select { expression.datatype }
     | template.model)
  }
param.element =
  element param {
    extension.atts,
    attribute name { qname.datatype },
    (attribute select { expression.datatype }
     | template.model)
  }
copy-of.element =
  element copy-of {
    extension.atts,
    attribute select { expression.datatype }
  }
with-param.element =
  element with-param {
    extension.atts,
    attribute name { qname.datatype },
    (attribute select { expression.datatype }
     | template.model)
  }
key.element =
  element key {
    extension.atts,
    attribute name { qname.datatype },
    attribute match { pattern.datatype },
    attribute use { expression.datatype }
  }
decimal-format.element =
  element decimal-format {
    extension.atts,
    attribute name { qname.datatype }?,
    attribute decimal-separator { char.datatype }?,
    attribute grouping-separator { char.datatype }?,
    attribute infinity { text }?,
    attribute minus-sign { char.datatype }?,
    attribute NaN { text }?,
    attribute percent { char.datatype }?,
    attribute per-mille { char.datatype }?,
    attribute zero-digit { char.datatype }?,
    attribute digit { char.datatype }?,
    attribute pattern-separator { char.datatype }?
  }
message.element =
  element message {
    extension.atts,
    attribute terminate { xsd:string "yes" | xsd:string "no" }?,
    template.model
  }
fallback.element = element fallback { extension.atts, template.model }
output.element =
  element output {
    extension.atts,
    attribute method {
      xsd:string "xml"
      | xsd:string "html"
      | xsd:string "text"
      | qname-but-not-ncname.datatype
    }?,
    attribute version { xsd:NMTOKEN }?,
    attribute encoding { text }?,
    attribute omit-xml-declaration {
      xsd:string "yes" | xsd:string "no"
    }?,
    attribute standalone { xsd:string "yes" | xsd:string "no" }?,
    attribute doctype-public { text }?,
    attribute doctype-system { text }?,
    attribute cdata-section-elements { qnames.datatype }?,
    attribute indent { xsd:string "yes" | xsd:string "no" }?,
    attribute media-type { text }?
  }
prefixes.datatype = list { (xsd:NCName | "#default")* }
prefix.datatype = xsd:NCName | "#default"
wildcards.datatype =
  list {
    (xsd:QName
     | xsd:token { pattern = "\*|\i\c*:\*" })*
  }
qname.datatype = xsd:QName
qnames.datatype = list { xsd:QName* }
char.datatype = xsd:string { length = "1" }
number.datatype = xsd:decimal
expression.datatype = text
pattern.datatype = text
qname-but-not-ncname.datatype = xsd:QName { pattern = ".*:.*" }
# An AVT containing at least one expression.
expr-avt.datatype =
  xsd:string {
    pattern =
      """([^\{\}]|\{\{|\}\})*\{([^"'\{\}]|"[^"]*"|'[^']*')+\}([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
  }
# An AVT containing at least one brace; ie where instantiated AVT
# is not the same as the literal AVT.
brace-avt.datatype =
  xsd:string {
    pattern =
      """[^\{\}]*(\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
  }
avt.datatype =
  xsd:string {
    pattern =
      """([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
  }