joe/syntax/json.jsf
2024-10-16 10:58:52 +08:00

310 lines
4.1 KiB
Plaintext

# JSON highlighter per json.org
# Written by Rebecca Turner (@ReBecaOrg)
# Define colors
=Idle
=Comma
=PairSep
=Bracket +Brace
=Brace +Control +Operator
=Constant
=Number +Constant
=Boolean +Constant
=Null +Constant
=String +Constant
=Key +Attr +Type +String
=Escape
=StringEscape +Escape +String
=Bad
=ERROR +Bad
:json Idle
* end noeat call=.value()
" \t\n" json
:end Idle
* endBAD noeat
" \t\n" end
:endBAD Bad
* end
.subr value
:value Idle
* valueBAD noeat
"\"" end noeat call=.string()
"-0-9" end noeat call=.number()
"tfn" end noeat call=.bareword()
"{" end noeat call=.object()
"[" end noeat call=.array()
:valueBAD Bad
* value
:end Idle
* NULL noeat return
.end
.subr object
:object Brace
* objectBAD noeat
"{" maybeempty
:objectBAD ERROR
* end
:maybeempty Brace
* key noeat
" \t\n" maybeempty
"}" end recolor=-1
:key Idle
* keyBAD noeat
"\"" pairsep noeat call=.keystring()
" \t\n" key
:keyBAD Bad
* key
:pairsep PairSep
* pairsepBAD noeat
":" value
" \t\n" pairsep
:pairsepBAD Bad
* pairsep
:value Idle
* nextpair noeat call=.value()
" \t\n" value
:nextpair Comma
* nextpairBAD noeat
"}" end recolor=-1
"," key
" \t\n" nextpair
:nextpairBAD Bad
* nextpair
:end Brace
* NULL noeat return
.end
.subr array
:array Bracket
* arrayBAD noeat
"[" maybeempty
:arrayBAD ERROR
* end
:maybeempty Bracket
* value noeat
" \t\n" maybeempty
"]" end recolor=-1
:value Idle
* nextvalue noeat call=.value()
" \t\n" value
:nextvalue Comma
* nextvalueBAD noeat
"]" end recolor=-1
"," value
" \t\n" nextvalue
:nextvalueBAD Bad
* nextvalue
:end Bracket
* NULL noeat return
.end
.subr string
:string String string
* stringBAD noeat
"\"" body
:body String string
* body
"\"" end
"\\" escape recolor=-1
:stringBAD ERROR
* end
:escape StringEscape string
* escapeBAD recolor=-2 noeat
"\"/bfnrt\\" body
"u" unicode1
:escapeBAD Bad
* body
:unicode1 StringEscape string
* unicodeBAD recolor=-3 noeat
"0-9a-fA-F" unicode2
:unicode2 StringEscape string
* unicodeBAD recolor=-4 noeat
"0-9a-fA-F" unicode3
:unicode3 StringEscape string
* unicodeBAD recolor=-5 noeat
"0-9a-fA-F" unicode4
:unicode4 StringEscape string
* unicodeBAD recolor=-6 noeat
"0-9a-fA-F" body
:unicodeBAD Bad
* body
:end Idle
* NULL noeat return
.end
.subr keystring
:string Key
* stringBAD noeat
"\"" body
:body Key
* body
"\"" end
"\\" escape recolor=-1
:stringBAD ERROR
* end
:escape Escape
* escapeBAD recolor=-2 noeat
"\"/bfnrt\\" body
"u" unicode1
:escapeBAD Bad
* body
:unicode1 Escape
* unicodeBAD recolor=-3 noeat
"0-9a-fA-F" unicode2
:unicode2 Escape
* unicodeBAD recolor=-4 noeat
"0-9a-fA-F" unicode3
:unicode3 Escape
* unicodeBAD recolor=-5 noeat
"0-9a-fA-F" unicode4
:unicode4 Escape
* unicodeBAD recolor=-6 noeat
"0-9a-fA-F" body
:unicodeBAD Bad
* body
:end Idle
* NULL noeat return
.end
.subr bareword
:bareword Idle
* body noeat mark buffer
:body Bad
* end noeat markend strings
"true" boolean
"false" boolean
"null" null
done
"truefalsn" body
:boolean Boolean
* end noeat
:null Null
* end noeat
:end Idle
* NULL noeat return
.end
.subr number
:number Number
* numberBAD
"0-9" numberA noeat
"-" numberA
:numberBAD ERROR
* end
:numberA Number
"0" decimalpoint
"1-9" integer
:integer Number
* end noeat
"0-9" integer
"." decimalpart
"eE" exponentpart
:decimalpoint Number
* end noeat
"0-9" decimalpointBAD
"eE" exponentpart
"." decimalpart
:decimalpointBAD Bad
* end
:decimalpart Number
* decimalpartBAD
"0-9" decimalpartA
:decimalpartBAD Bad
* end
:decimalpartA Number
* end noeat
"0-9" decimalpartA
"eE" exponentpart
:exponentpart Number
* exponentpartBAD
"-+" exponentpartA
"0-9" exponentpartB
:exponentpartBAD Bad
* end
:exponentpartA Number
* exponentpartBAD
"0-9" exponentpartB
:exponentpartB Number
* end noeat
"0-9" exponentpartB
:end Idle
* NULL noeat return
.end