Starting to switch xmode to regexp; getting rid of <TAGS
parent
ccfd9f9c52
commit
d0d615fb2b
|
@ -1,13 +1,14 @@
|
||||||
USING: xmode.loader xmode.utilities xmode.rules namespaces
|
USING: xmode.loader xmode.utilities xmode.rules namespaces
|
||||||
strings splitting assocs sequences kernel io.files xml memoize
|
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
|
IN: xmode.catalog
|
||||||
|
|
||||||
TUPLE: mode file file-name-glob first-line-glob ;
|
TUPLE: mode file file-name-glob first-line-glob ;
|
||||||
|
|
||||||
<TAGS: parse-mode-tag ( modes tag -- )
|
TAGS: parse-mode-tag ( modes tag -- )
|
||||||
|
|
||||||
TAG: MODE
|
TAG: MODE parse-mode-tag
|
||||||
dup "NAME" attr [
|
dup "NAME" attr [
|
||||||
mode new {
|
mode new {
|
||||||
{ "FILE" f (>>file) }
|
{ "FILE" f (>>file) }
|
||||||
|
@ -17,11 +18,9 @@ TAG: MODE
|
||||||
] dip
|
] dip
|
||||||
rot set-at ;
|
rot set-at ;
|
||||||
|
|
||||||
TAGS>
|
|
||||||
|
|
||||||
: parse-modes-tag ( tag -- modes )
|
: parse-modes-tag ( tag -- modes )
|
||||||
H{ } clone [
|
H{ } clone [
|
||||||
swap child-tags [ parse-mode-tag ] with each
|
swap children-tags [ parse-mode-tag ] with each
|
||||||
] keep ;
|
] keep ;
|
||||||
|
|
||||||
MEMO: modes ( -- modes )
|
MEMO: modes ( -- modes )
|
||||||
|
|
|
@ -1,56 +1,54 @@
|
||||||
USING: xmode.loader.syntax xmode.tokens xmode.rules
|
USING: xmode.loader.syntax xmode.tokens xmode.rules
|
||||||
xmode.keyword-map xml.data xml.traversal xml assocs kernel
|
xmode.keyword-map xml.data xml.traversal xml assocs kernel
|
||||||
combinators sequences math.parser namespaces parser
|
combinators sequences math.parser namespaces parser
|
||||||
xmode.utilities parser-combinators.regexp io.files accessors ;
|
xmode.utilities regexp io.files accessors ;
|
||||||
IN: xmode.loader
|
IN: xmode.loader
|
||||||
|
|
||||||
! Based on org.gjt.sp.jedit.XModeHandler
|
! Based on org.gjt.sp.jedit.XModeHandler
|
||||||
|
|
||||||
! RULES and its children
|
! RULES and its children
|
||||||
<TAGS: parse-rule-tag ( rule-set tag -- )
|
TAGS: parse-rule-tag ( rule-set tag -- )
|
||||||
|
|
||||||
TAG: PROPS
|
TAG: PROPS parse-rule-tag
|
||||||
parse-props-tag >>props drop ;
|
parse-props-tag >>props drop ;
|
||||||
|
|
||||||
TAG: IMPORT
|
TAG: IMPORT parse-rule-tag
|
||||||
"DELEGATE" attr swap import-rule-set ;
|
"DELEGATE" attr swap import-rule-set ;
|
||||||
|
|
||||||
TAG: TERMINATE
|
TAG: TERMINATE parse-rule-tag
|
||||||
"AT_CHAR" attr string>number >>terminate-char drop ;
|
"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 ;
|
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 ;
|
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 ;
|
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 ;
|
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 ;
|
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 ;
|
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 ;
|
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 ;
|
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?>> <keyword-map>
|
rule-set get ignore-case?>> <keyword-map>
|
||||||
swap child-tags [ over parse-keyword-tag ] each
|
swap children-tags [ over parse-keyword-tag ] each
|
||||||
swap (>>keywords) ;
|
swap (>>keywords) ;
|
||||||
|
|
||||||
TAGS>
|
|
||||||
|
|
||||||
: ?<regexp> ( string/f -- regexp/f )
|
: ?<regexp> ( string/f -- regexp/f )
|
||||||
dup [ rule-set get ignore-case?>> <regexp> ] when ;
|
dup [ rule-set get ignore-case?>> drop <regexp> ] when ;
|
||||||
|
|
||||||
: (parse-rules-tag) ( tag -- rule-set )
|
: (parse-rules-tag) ( tag -- rule-set )
|
||||||
<rule-set> dup rule-set set
|
<rule-set> dup rule-set set
|
||||||
|
@ -66,7 +64,7 @@ TAGS>
|
||||||
|
|
||||||
: parse-rules-tag ( tag -- rule-set )
|
: parse-rules-tag ( tag -- rule-set )
|
||||||
[
|
[
|
||||||
[ (parse-rules-tag) ] [ child-tags ] bi
|
[ (parse-rules-tag) ] [ children-tags ] bi
|
||||||
[ parse-rule-tag ] with each
|
[ parse-rule-tag ] with each
|
||||||
rule-set get
|
rule-set get
|
||||||
] with-scope ;
|
] with-scope ;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
USING: accessors xmode.tokens xmode.rules xmode.keyword-map
|
USING: accessors xmode.tokens xmode.rules xmode.keyword-map
|
||||||
xml.data xml.traversal xml assocs kernel combinators sequences
|
xml.data xml.traversal xml assocs kernel combinators sequences
|
||||||
math.parser namespaces make parser lexer xmode.utilities
|
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
|
IN: xmode.loader.syntax
|
||||||
|
|
||||||
! Rule tag parsing utilities
|
! Rule tag parsing utilities
|
||||||
|
@ -11,9 +11,10 @@ IN: xmode.loader.syntax
|
||||||
new swap init-from-tag swap add-rule ; inline
|
new swap init-from-tag swap add-rule ; inline
|
||||||
|
|
||||||
: RULE:
|
: RULE:
|
||||||
scan scan-word
|
scan scan-word scan-word
|
||||||
parse-definition { } make
|
parse-definition { } make
|
||||||
swap [ (parse-rule-tag) ] 2curry (TAG:) ; parsing
|
[ swap [ (parse-rule-tag) ] 2curry ] dip
|
||||||
|
swap define-tag ; parsing
|
||||||
|
|
||||||
! Attribute utilities
|
! Attribute utilities
|
||||||
: string>boolean ( string -- ? ) "TRUE" = ;
|
: string>boolean ( string -- ? ) "TRUE" = ;
|
||||||
|
@ -32,7 +33,7 @@ IN: xmode.loader.syntax
|
||||||
[ "NAME" attr ] [ "VALUE" attr ] bi ;
|
[ "NAME" attr ] [ "VALUE" attr ] bi ;
|
||||||
|
|
||||||
: parse-props-tag ( tag -- assoc )
|
: parse-props-tag ( tag -- assoc )
|
||||||
child-tags
|
children-tags
|
||||||
[ parse-prop-tag ] H{ } map>assoc ;
|
[ parse-prop-tag ] H{ } map>assoc ;
|
||||||
|
|
||||||
: position-attrs ( tag -- at-line-start? at-whitespace-end? at-word-start? )
|
: position-attrs ( tag -- at-line-start? at-whitespace-end? at-word-start? )
|
||||||
|
@ -46,7 +47,7 @@ IN: xmode.loader.syntax
|
||||||
swap position-attrs <matcher> ;
|
swap position-attrs <matcher> ;
|
||||||
|
|
||||||
: parse-regexp-matcher ( tag -- matcher )
|
: parse-regexp-matcher ( tag -- matcher )
|
||||||
dup children>string rule-set get ignore-case?>> <regexp>
|
dup children>string rule-set get ignore-case?>> drop <regexp>
|
||||||
swap position-attrs <matcher> ;
|
swap position-attrs <matcher> ;
|
||||||
|
|
||||||
: shared-tag-attrs ( -- )
|
: shared-tag-attrs ( -- )
|
||||||
|
@ -79,22 +80,20 @@ IN: xmode.loader.syntax
|
||||||
[ parse-literal-matcher >>end drop ] , ;
|
[ parse-literal-matcher >>end drop ] , ;
|
||||||
|
|
||||||
! SPAN's children
|
! SPAN's children
|
||||||
<TAGS: parse-begin/end-tag ( rule tag -- )
|
TAGS: parse-begin/end-tag ( rule tag -- )
|
||||||
|
|
||||||
TAG: BEGIN
|
TAG: BEGIN parse-begin/end-tag
|
||||||
! XXX
|
! XXX
|
||||||
parse-literal-matcher >>start drop ;
|
parse-literal-matcher >>start drop ;
|
||||||
|
|
||||||
TAG: END
|
TAG: END parse-begin/end-tag
|
||||||
! XXX
|
! XXX
|
||||||
parse-literal-matcher >>end drop ;
|
parse-literal-matcher >>end drop ;
|
||||||
|
|
||||||
TAGS>
|
|
||||||
|
|
||||||
: parse-begin/end-tags ( -- )
|
: parse-begin/end-tags ( -- )
|
||||||
[
|
[
|
||||||
! XXX: handle position attrs on span tag itself
|
! 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 ] , ;
|
: init-span-tag ( -- ) [ drop init-span ] , ;
|
||||||
|
|
|
@ -4,8 +4,10 @@ IN: xmode.marker
|
||||||
USING: kernel namespaces make xmode.rules xmode.tokens
|
USING: kernel namespaces make xmode.rules xmode.tokens
|
||||||
xmode.marker.state xmode.marker.context xmode.utilities
|
xmode.marker.state xmode.marker.context xmode.utilities
|
||||||
xmode.catalog sequences math assocs combinators strings
|
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 ;
|
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
|
! Based on org.gjt.sp.jedit.syntax.TokenMarker
|
||||||
|
|
||||||
|
@ -150,7 +152,7 @@ M: escape-rule handle-rule-start
|
||||||
process-escape? get [
|
process-escape? get [
|
||||||
escaped? [ not ] change
|
escaped? [ not ] change
|
||||||
position [ + ] change
|
position [ + ] change
|
||||||
] [ 2drop ] if ;
|
] [ drop ] if ;
|
||||||
|
|
||||||
M: seq-rule handle-rule-start
|
M: seq-rule handle-rule-start
|
||||||
?end-rule
|
?end-rule
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
USING: accessors xmode.tokens xmode.keyword-map kernel
|
USING: accessors xmode.tokens xmode.keyword-map kernel
|
||||||
sequences vectors assocs strings memoize unicode.case
|
sequences vectors assocs strings memoize unicode.case
|
||||||
parser-combinators.regexp ;
|
regexp regexp.backend ; ! regexp.backend has the regexp class
|
||||||
IN: xmode.rules
|
IN: xmode.rules
|
||||||
|
|
||||||
TUPLE: string-matcher string ignore-case? ;
|
TUPLE: string-matcher string ignore-case? ;
|
||||||
|
|
|
@ -4,8 +4,6 @@ IN: xmode.utilities
|
||||||
|
|
||||||
: implies ( x y -- z ) [ not ] dip or ; inline
|
: implies ( x y -- z ) [ not ] dip or ; inline
|
||||||
|
|
||||||
: child-tags ( tag -- seq ) children>> [ tag? ] filter ;
|
|
||||||
|
|
||||||
: map-find ( seq quot -- result elt )
|
: map-find ( seq quot -- result elt )
|
||||||
[ f ] 2dip
|
[ f ] 2dip
|
||||||
'[ nip @ dup ] find
|
'[ nip @ dup ] find
|
||||||
|
@ -37,21 +35,3 @@ MACRO: (init-from-tag) ( specs -- )
|
||||||
|
|
||||||
: init-from-tag ( tag tuple specs -- tuple )
|
: init-from-tag ( tag tuple specs -- tuple )
|
||||||
over [ (init-from-tag) ] dip ; inline
|
over [ (init-from-tag) ] dip ; inline
|
||||||
|
|
||||||
SYMBOL: tag-handlers
|
|
||||||
SYMBOL: tag-handler-word
|
|
||||||
|
|
||||||
: <TAGS:
|
|
||||||
CREATE tag-handler-word set
|
|
||||||
H{ } clone tag-handlers set ; parsing
|
|
||||||
|
|
||||||
: (TAG:) ( name quot -- ) swap tag-handlers get set-at ;
|
|
||||||
|
|
||||||
: TAG:
|
|
||||||
scan parse-definition
|
|
||||||
(TAG:) ; parsing
|
|
||||||
|
|
||||||
: TAGS>
|
|
||||||
tag-handler-word get
|
|
||||||
tag-handlers get >alist [ [ dup main>> ] dip case ] curry
|
|
||||||
define ; parsing
|
|
||||||
|
|
Loading…
Reference in New Issue