diff --git a/basis/xmode/catalog/catalog.factor b/basis/xmode/catalog/catalog.factor index 4e3af0af56..3a87d71d58 100644 --- a/basis/xmode/catalog/catalog.factor +++ b/basis/xmode/catalog/catalog.factor @@ -1,13 +1,14 @@ USING: xmode.loader xmode.utilities xmode.rules namespaces strings splitting assocs sequences kernel io.files xml memoize -words globs combinators io.encodings.utf8 sorting accessors xml.data ; +words globs combinators io.encodings.utf8 sorting accessors xml.data +xml.traversal ; IN: xmode.catalog TUPLE: mode file file-name-glob first-line-glob ; ->file) } @@ -17,11 +18,9 @@ TAG: MODE ] dip rot set-at ; -TAGS> - : parse-modes-tag ( tag -- modes ) H{ } clone [ - swap child-tags [ parse-mode-tag ] with each + swap children-tags [ parse-mode-tag ] with each ] keep ; MEMO: modes ( -- modes ) diff --git a/basis/xmode/loader/loader.factor b/basis/xmode/loader/loader.factor index 70466913a0..61b60b5292 100644 --- a/basis/xmode/loader/loader.factor +++ b/basis/xmode/loader/loader.factor @@ -1,56 +1,54 @@ USING: xmode.loader.syntax xmode.tokens xmode.rules xmode.keyword-map xml.data xml.traversal xml assocs kernel combinators sequences math.parser namespaces parser -xmode.utilities parser-combinators.regexp io.files accessors ; +xmode.utilities regexp io.files accessors ; IN: xmode.loader ! Based on org.gjt.sp.jedit.XModeHandler ! RULES and its children ->props drop ; -TAG: IMPORT +TAG: IMPORT parse-rule-tag "DELEGATE" attr swap import-rule-set ; -TAG: TERMINATE +TAG: TERMINATE parse-rule-tag "AT_CHAR" attr string>number >>terminate-char drop ; -RULE: SEQ seq-rule +RULE: SEQ seq-rule parse-rule-tag shared-tag-attrs delegate-attr literal-start ; -RULE: SEQ_REGEXP seq-rule +RULE: SEQ_REGEXP seq-rule parse-rule-tag shared-tag-attrs delegate-attr regexp-attr regexp-start ; -RULE: SPAN span-rule +RULE: SPAN span-rule parse-rule-tag shared-tag-attrs delegate-attr match-type-attr span-attrs parse-begin/end-tags init-span-tag ; -RULE: SPAN_REGEXP span-rule +RULE: SPAN_REGEXP span-rule parse-rule-tag shared-tag-attrs delegate-attr match-type-attr span-attrs regexp-attr parse-begin/end-tags init-span-tag ; -RULE: EOL_SPAN eol-span-rule +RULE: EOL_SPAN eol-span-rule parse-rule-tag shared-tag-attrs delegate-attr match-type-attr literal-start init-eol-span-tag ; -RULE: EOL_SPAN_REGEXP eol-span-rule +RULE: EOL_SPAN_REGEXP eol-span-rule parse-rule-tag shared-tag-attrs delegate-attr match-type-attr regexp-attr regexp-start init-eol-span-tag ; -RULE: MARK_FOLLOWING mark-following-rule +RULE: MARK_FOLLOWING mark-following-rule parse-rule-tag shared-tag-attrs match-type-attr literal-start ; -RULE: MARK_PREVIOUS mark-previous-rule +RULE: MARK_PREVIOUS mark-previous-rule parse-rule-tag shared-tag-attrs match-type-attr literal-start ; -TAG: KEYWORDS ( rule-set tag -- key value ) +TAG: KEYWORDS parse-rule-tag rule-set get ignore-case?>> - swap child-tags [ over parse-keyword-tag ] each + swap children-tags [ over parse-keyword-tag ] each swap (>>keywords) ; -TAGS> - : ? ( string/f -- regexp/f ) - dup [ rule-set get ignore-case?>> ] when ; + dup [ rule-set get ignore-case?>> drop ] when ; : (parse-rules-tag) ( tag -- rule-set ) dup rule-set set @@ -66,7 +64,7 @@ TAGS> : parse-rules-tag ( tag -- rule-set ) [ - [ (parse-rules-tag) ] [ child-tags ] bi + [ (parse-rules-tag) ] [ children-tags ] bi [ parse-rule-tag ] with each rule-set get ] with-scope ; diff --git a/basis/xmode/loader/syntax/syntax.factor b/basis/xmode/loader/syntax/syntax.factor index 0e7293da97..88ff7b919b 100644 --- a/basis/xmode/loader/syntax/syntax.factor +++ b/basis/xmode/loader/syntax/syntax.factor @@ -3,7 +3,7 @@ USING: accessors xmode.tokens xmode.rules xmode.keyword-map xml.data xml.traversal xml assocs kernel combinators sequences math.parser namespaces make parser lexer xmode.utilities -parser-combinators.regexp io.files splitting arrays ; +regexp io.files splitting arrays xml.syntax.private ; IN: xmode.loader.syntax ! Rule tag parsing utilities @@ -11,9 +11,10 @@ IN: xmode.loader.syntax new swap init-from-tag swap add-rule ; inline : RULE: - scan scan-word + scan scan-word scan-word parse-definition { } make - swap [ (parse-rule-tag) ] 2curry (TAG:) ; parsing + [ swap [ (parse-rule-tag) ] 2curry ] dip + swap define-tag ; parsing ! Attribute utilities : string>boolean ( string -- ? ) "TRUE" = ; @@ -32,7 +33,7 @@ IN: xmode.loader.syntax [ "NAME" attr ] [ "VALUE" attr ] bi ; : parse-props-tag ( tag -- assoc ) - child-tags + children-tags [ parse-prop-tag ] H{ } map>assoc ; : position-attrs ( tag -- at-line-start? at-whitespace-end? at-word-start? ) @@ -46,7 +47,7 @@ IN: xmode.loader.syntax swap position-attrs ; : parse-regexp-matcher ( tag -- matcher ) - dup children>string rule-set get ignore-case?>> + dup children>string rule-set get ignore-case?>> drop swap position-attrs ; : shared-tag-attrs ( -- ) @@ -79,22 +80,20 @@ IN: xmode.loader.syntax [ parse-literal-matcher >>end drop ] , ; ! SPAN's children ->start drop ; -TAG: END +TAG: END parse-begin/end-tag ! XXX parse-literal-matcher >>end drop ; -TAGS> - : parse-begin/end-tags ( -- ) [ ! XXX: handle position attrs on span tag itself - child-tags [ parse-begin/end-tag ] with each + children-tags [ parse-begin/end-tag ] with each ] , ; : init-span-tag ( -- ) [ drop init-span ] , ; diff --git a/basis/xmode/marker/marker.factor b/basis/xmode/marker/marker.factor index cff0af2a98..5cbd9e1e9c 100755 --- a/basis/xmode/marker/marker.factor +++ b/basis/xmode/marker/marker.factor @@ -4,8 +4,10 @@ IN: xmode.marker USING: kernel namespaces make xmode.rules xmode.tokens xmode.marker.state xmode.marker.context xmode.utilities xmode.catalog sequences math assocs combinators strings -parser-combinators.regexp splitting parser-combinators ascii +regexp splitting ascii parser-combinators regexp.backend ascii combinators.short-circuit accessors ; +! parser-combinators is for the string-head? word +! regexp.backend is for the regexp class ! Based on org.gjt.sp.jedit.syntax.TokenMarker @@ -150,7 +152,7 @@ M: escape-rule handle-rule-start process-escape? get [ escaped? [ not ] change position [ + ] change - ] [ 2drop ] if ; + ] [ drop ] if ; M: seq-rule handle-rule-start ?end-rule diff --git a/basis/xmode/rules/rules.factor b/basis/xmode/rules/rules.factor index adc43d7bb6..99364fe7cd 100644 --- a/basis/xmode/rules/rules.factor +++ b/basis/xmode/rules/rules.factor @@ -1,6 +1,6 @@ USING: accessors xmode.tokens xmode.keyword-map kernel sequences vectors assocs strings memoize unicode.case -parser-combinators.regexp ; +regexp regexp.backend ; ! regexp.backend has the regexp class IN: xmode.rules TUPLE: string-matcher string ignore-case? ; diff --git a/basis/xmode/utilities/utilities.factor b/basis/xmode/utilities/utilities.factor index 2423fb0d86..22db69de3f 100644 --- a/basis/xmode/utilities/utilities.factor +++ b/basis/xmode/utilities/utilities.factor @@ -4,8 +4,6 @@ IN: xmode.utilities : implies ( x y -- z ) [ not ] dip or ; inline -: child-tags ( tag -- seq ) children>> [ tag? ] filter ; - : map-find ( seq quot -- result elt ) [ f ] 2dip '[ nip @ dup ] find @@ -37,21 +35,3 @@ MACRO: (init-from-tag) ( specs -- ) : init-from-tag ( tag tuple specs -- tuple ) over [ (init-from-tag) ] dip ; inline - -SYMBOL: tag-handlers -SYMBOL: tag-handler-word - -: - tag-handler-word get - tag-handlers get >alist [ [ dup main>> ] dip case ] curry - define ; parsing