;;; xml2ddml2.xom -- finish off the conversion (pass2)
;;; Copyright (C) 1999 Rick Jelliffe ricko@gate.sinica.edu.tw
;;; Permission granted to use granted under MPL or GPL
;;; We need two passes, because OmniMark Light edition only allows
;;; 200 "actions". If you have a full license, you can put merge
;;; the two files.
CROSS-TRANSLATE
GLOBAL STREAM theRealContentModel
GLOBAL STREAM r
GLOBAL STREAM g
GLOBAL COUNTER group
GLOBAL COUNTER level VARIABLE ;; a stack of indexes for the referents
GLOBAL SWITCH MIXED-CONTENT
FIND-START
CLEAR level ;; stack.size==0
NEW level
RESET level TO 999
RESET group TO 0
FIND "" ((LOOKAHEAD NOT "") ANY)+=theContentModel ""
DEACTIVATE MIXED-CONTENT
OUTPUT "%n%t"
SET theRealContentModel TO ""
DO SCAN PATTERN theContentModel
MATCH WHITE-SPACE* "" ((LOOKAHEAD NOT "") ANY)+=theMixedContentModel ""
OUTPUT "%n%t%t"
ACTIVATE MIXED-CONTENT
SET theRealContentModel TO PATTERN theMixedContentModel
MATCH WHITE-SPACE* ""
OUTPUT "%n%t%t"
MATCH WHITE-SPACE* ""
OUTPUT "%n%t%t"
MATCH WHITE-SPACE* ""
OUTPUT "%n%t%t"
ELSE
DEACTIVATE MIXED-CONTENT
SET theRealContentModel TO PATTERN theContentModel
DONE
;;; here is the regular expression factoring part
REPEAT SCAN theRealContentModel
MATCH "#PCDATA" WHITE-SPACE* ["|,"]
;; strip: mixed content already caught by another mechanism
MATCH "(" WHITE-SPACE* "#PCDATA" WHITE-SPACE* ")" ["?*+"]? WHITE-SPACE* ["|,"]?
;; strip this out too
MATCH WHITE-SPACE+ ; strip
MATCH "("
INCREMENT group
NEW level
RESET LEVEL TO "%d(group)"
; default value
OPEN g AS REFERENT "G%d(level)"
PUT g "Seq"
CLOSE g
; default value
OPEN r AS REFERENT "R%d(level)"
PUT r "Required"
CLOSE r
OUTPUT "%sn%t%t%t<"
OUTPUT REFERENT "G%d(level)"
OUTPUT " Frequency='"
OUTPUT REFERENT "R%d(level)"
OUTPUT "'>"
MATCH ")" (["+?*"])?=theOptSeq
WHITE-SPACE* [",|"]?=theOccur
OUTPUT "%n%t%t%t"
OUTPUT REFERENT "G%d(level)"
OUTPUT ">"
OPEN r AS REFERENT "R%d(level)"
DO SCAN PATTERN theOptSeq
MATCH "?" PUT r "Optional"
MATCH "+" PUT r "OneOrMore"
MATCH "*" PUT r "ZeroOrMore"
ELSE PUT r "Required"
DONE
CLOSE r
REMOVE level
MATCH ((LOOKAHEAD NOT (["+?*"])? WHITE-SPACE* [")|,"])
ANY)+=theToken (["+?*"])?=theOpt WHITE-SPACE*"|"
; or connector
OPEN g AS REFERENT "G%d(level)"
; USING level ITEM (NUMBER OF level - 1 )
PUT g "Choice"
CLOSE g
OUTPUT "%n%t%t%t%t"
MATCH ((LOOKAHEAD NOT (["+?*"])? WHITE-SPACE* [")|,"])
ANY)+=theTokenA (["+?*"])?=theOptA WHITE-SPACE* ","
; seq connector
OPEN g AS REFERENT "G%d(level)"
;USING level ITEM (NUMBER OF level - 1 )
PUT g "Seq"
CLOSE g
OUTPUT "%n%t%t%t%t"
MATCH ((LOOKAHEAD NOT (["+?*"])? WHITE-SPACE* [")|,"])
ANY)+=theTokenB (["+?*"])?=theOptB WHITE-SPACE* ")"
(["+?*"])?=theOptC
WHITE-SPACE* ["|,]"]?=theOccurB
; end group
OUTPUT "%n%t%t%t%t%n%t%t%t"
OUTPUT REFERENT "G%d(level)"
OUTPUT ">"
OPEN r AS REFERENT "R%d(level)"
DO SCAN PATTERN theOptC
MATCH "?" PUT r "Optional"
MATCH "+" PUT r "OneOrMore"
MATCH "*" PUT r "ZeroOrMore"
ELSE PUT r "Required"
DONE
CLOSE r
REMOVE level
MATCH WHITE-SPACE+
MATCH ANY=theChar OUTPUT ""
AGAIN
OUTPUT "%n%t%t" WHEN ACTIVE MIXED-CONTENT
OUTPUT "%n%t"