Syntax of Unicode encoding of Ancient Egyptian

Characters

vertical, horizontal, grouping

U+13430𓐰EGYPTIAN HIEROGLYPH VERTICAL JOINER
U+13431𓐱EGYPTIAN HIEROGLYPH HORIZONTAL JOINER
U+13437𓐷EGYPTIAN HIEROGLYPH BEGIN SEGMENT
U+13438𓐸EGYPTIAN HIEROGLYPH END SEGMENT

insertion and overlay

U+13432𓐲EGYPTIAN HIEROGLYPH INSERT AT TOP START
U+13433𓐳EGYPTIAN HIEROGLYPH INSERT AT BOTTOM START
U+13434𓐴EGYPTIAN HIEROGLYPH INSERT AT TOP END
U+13435𓐵EGYPTIAN HIEROGLYPH INSERT AT BOTTOM END
U+13439𓐹EGYPTIAN HIEROGLYPH INSERT AT MIDDLE
U+1343A𓐺EGYPTIAN HIEROGLYPH INSERT AT TOP
U+1343B𓐻EGYPTIAN HIEROGLYPH INSERT AT BOTTOM
U+13436𓐶EGYPTIAN HIEROGLYPH OVERLAY MIDDLE

enclosures

U+1343C𓐼EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE
U+1343D𓐽EGYPTIAN HIEROGLYPH END ENCLOSURE
U+1343E𓐾EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE
U+1343F𓐿EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
U+13258𓉘EGYPTIAN HIEROGLYPH O006A
U+13259𓉙EGYPTIAN HIEROGLYPH O006B
U+1325A𓉚EGYPTIAN HIEROGLYPH O006C
U+13379𓍹EGYPTIAN HIEROGLYPH V011A
U+1342F𓐯EGYPTIAN HIEROGLYPH V011D
U+1325B𓉛EGYPTIAN HIEROGLYPH O006D
U+1325C𓉜EGYPTIAN HIEROGLYPH O006E
U+1325D𓉝EGYPTIAN HIEROGLYPH O006F
U+13282𓊂EGYPTIAN HIEROGLYPH O033A
U+1337A𓍺EGYPTIAN HIEROGLYPH V011B
U+1337B𓍻EGYPTIAN HIEROGLYPH V011C
U+13286𓊆EGYPTIAN HIEROGLYPH O036A
U+13288𓊈EGYPTIAN HIEROGLYPH O036C
U+13287𓊇EGYPTIAN HIEROGLYPH O036B
U+13289𓊉EGYPTIAN HIEROGLYPH O036D

mirroring and rotation

U+13440𓑀EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
U+FE00 ︀VARIATION SELECTOR-190° rotation and expanding lost
U+FE01 ︁VARIATION SELECTOR-2180° rotation
U+FE02 ︂VARIATION SELECTOR-3270° rotation
U+FE03 ︃VARIATION SELECTOR-4(around) 45° rotation
U+FE04 ︄VARIATION SELECTOR-5(around) 135° rotation
U+FE05 ︅VARIATION SELECTOR-6(around) 225° rotation
U+FE06 ︆VARIATION SELECTOR-7(around) 315° rotation

blank and lost signs

U+13441𓑁EGYPTIAN HIEROGLYPH FULL BLANK
U+13442𓑂EGYPTIAN HIEROGLYPH HALF BLANK
U+13443𓑃EGYPTIAN HIEROGLYPH LOST SIGN
U+13444𓑄EGYPTIAN HIEROGLYPH HALF LOST SIGN
U+13445𓑅EGYPTIAN HIEROGLYPH TALL LOST SIGN
U+13446𓑆EGYPTIAN HIEROGLYPH WIDE LOST SIGN

damage

U+13447𓑇EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START
U+13448𓑈EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START
U+13449𓑉EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START
U+1344A𓑊EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END
U+1344B𓑋EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP
U+1344C𓑌EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END
U+1344D𓑍EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP
U+1344E𓑎EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END
U+1344F𓑏EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END
U+13450𓑐EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM
U+13451𓑑EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM
U+13452𓑒EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END
U+13453𓑓EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END
U+13454𓑔EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END
U+13455𓑕EGYPTIAN HIEROGLYPH MODIFIER DAMAGED

brackets

U+005B[LEFT SQUARE BRACKET
U+005D]RIGHT SQUARE BRACKET
U+007B{LEFT CURLY BRACKET
U+007D}RIGHT CURLY BRACKET
U+27E6MATHEMATICAL LEFT WHITE SQUARE BRACKET
U+27E7MATHEMATICAL RIGHT WHITE SQUARE BRACKET
U+27E8MATHEMATICAL LEFT ANGLE BRACKET
U+27E9MATHEMATICAL RIGHT ANGLE BRACKET
U+2E22TOP LEFT HALF BRACKET
U+2E23TOP RIGHT HALF BRACKET

Grammar

fragment ::= ( top-group )*
top-group ::= group | singleton
group ::= vertical-group | horizontal-group | basic-group
vertical-group ::= vertical-subgroup ( 𓐰 vertical-subgroup )+
vertical-subgroup ::= horizontal-group | basic-group
horizontal-group ::= 
    open-bracket horizontal-subgroup [ close-bracket ] ( 𓐱 [ open-bracket ] horizontal-subgroup [ close-bracket ] )* |
    horizontal-subgroup close-bracket ( 𓐱 [ open-bracket ] horizontal-subgroup [ close-bracket ] )* |
    horizontal-subgroup ( 𓐱 [ open-bracket ] horizontal-subgroup [ close-bracket ] )+ 
horizontal-subgroup ::= 𓐷 vertical-group 𓐸 | basic-group
open-bracket ::= [ | { |  |  | 
close-bracket ::= ] | } |  |  | 
basic-group ::= core-group | insert-group | placeholder | enclosure
insert-group ::= core-group insertion
insertion ::= 
    𓐲 in-group [ 𓐳 in-group ] [ 𓐴 in-group ] [ 𓐵 in-group ] [ 𓐹 in-group ] [ 𓐺 in-group ] [ 𓐻 in-group ] |
    𓐳 in-group [ 𓐴 in-group ] [ 𓐵 in-group ] [ 𓐹 in-group ] [ 𓐺 in-group ] [ 𓐻 in-group ] |
    𓐴 in-group [ 𓐵 in-group ] [ 𓐹 in-group ] [ 𓐺 in-group ] [ 𓐻 in-group ] |
    𓐵 in-group [ 𓐹 in-group ] [ 𓐺 in-group ] [ 𓐻 in-group ] |
    𓐹 in-group [ 𓐺 in-group ] [ 𓐻 in-group ] |
    𓐺 in-group [ 𓐻 in-group ] |
    𓐻 in-group 
in-group ::= 𓐷 vertical-group 𓐸 | 𓐷 horizontal-group 𓐸 | 𓐷 insert-group 𓐸 | core-group | placeholder | enclosure
core-group ::= flat-horizontal-group 𓐶 flat-vertical-group | literal
flat-horizontal-group ::= 𓐷 literal ( 𓐱 literal )+ 𓐸 | literal
flat-vertical-group ::= 𓐷 literal ( 𓐰 literal )+ 𓐸 | literal
literal ::= sign [  ︀ |  ︁ |  ︂ |  ︃ |  ︄ |  ︅ |  ︆ ] [ 𓑀 ] [ damaged ]
sign ::= 𓀀 | etc.
placeholder ::= 𓑁 | 𓑂 | ( 𓑃 | 𓑄 | 𓑅 | 𓑆 ) [  ︀ ]
enclosure ::= 
    [ plain-opening ] 𓐼 ( group )* 𓐽 [ plain-closing ] | 
    [ walled-opening ] 𓐾 ( group )* 𓐿 [ walled-closing ]
singleton ::= plain-opening | plain-closing | walled-opening | walled-closing
plain-opening ::= plain-opening-delimiter [ damaged ]
plain-closing ::= plain-closing-delimiter [ damaged ]
walled-opening ::= walled-opening-delimiter [ damaged ]
walled-closing ::= walled-closing-delimiter [ damaged ]
plain-opening-delimiter ::= 𓉘 | 𓉙 | 𓉚 | 𓍹 | 𓐯
plain-closing-delimiter ::= 𓉛 | 𓉜 | 𓉝 | 𓊂 | 𓍺 | 𓍻
walled-opening-delimiter ::= 𓊆 | 𓊈
walled-closing-delimiter ::= 𓊇 | 𓊉
damaged ::= 𓑇 | 𓑈 | 𓑉 | 𓑊 | 𓑋 | 𓑌 | 𓑍 | 𓑎 | 𓑏 | 𓑐 | 𓑑 | 𓑒 | 𓑓 | 𓑔 | 𓑕

Ambiguity in the grammar is resolved as follows:

This can be achieved by lexical analysis with a longest-match strategy.

LALR(1) Grammar

An alternative formulation of the same syntax is given as LALR(1) grammar below, for use with parser generators.

fragment ::= top-groups
top-groups ::= ε | group top-groups | singleton top-groups 
groups ::= ε | group groups
group ::= vertical-group | horizontal-group | basic-group | literal
vertical-group ::= vertical-subgroup rest-vertical-group
opt-rest-vertical-group ::= ε | rest-vertical-group
rest-vertical-group :: 𓐰 vertical-subgroup opt-rest-vertical-group
bracketed-vertical-group :: 𓐷 vertical-subgroup rest-bracketed-vertical-group
opt-rest-bracketed-vertical-group ::= ε | rest-bracketed-vertical-group
rest-bracketed-vertical-group :: 𓐰 vertical-subgroup opt-rest-bracketed-vertical-group
bracketed-flat-vertical-group :: 𓐷 literal rest-bracketed-flat-vertical-group
rest-bracketed-flat-vertical-group :: 𓐰 literal rest-bracketed-flat-vertical-group | 𓐰 literal 𓐸
vertical-subgroup ::= horizontal-group | basic-group | literal
horizontal-group ::= 
    horizontal-subgroup rest-horizontal-group |
    literal rest-horizontal-group |
    open-bracket horizontal-subgroup opt-close-bracket opt-rest-horizontal-group |
    open-bracket literal opt-close-bracket opt-rest-horizontal-group |
    horizontal-subgroup close-bracket opt-rest-horizontal-group |
    literal close-bracket opt-rest-horizontal-group
opt-rest-horizontal-group ::= ε | rest-horizontal-group
rest-horizontal-group ::= 
    𓐱 horizontal-subgroup opt-rest-horizontal-group | 
    𓐱 literal opt-rest-horizontal-group | 
    𓐱 open-bracket horizontal-subgroup opt-close-bracket opt-rest-horizontal-group | 
    𓐱 open-bracket literal opt-close-bracket opt-rest-horizontal-group | 
    𓐱 horizontal-subgroup close-bracket opt-rest-horizontal-group | 
    𓐱 literal close-bracket opt-rest-horizontal-group
bracketed-horizontal-group ::= 
    𓐷 horizontal-subgroup rest-bracketed-horizontal-group |
    𓐷 literal rest-bracketed-horizontal-group |
    𓐷 open-bracket horizontal-subgroup opt-close-bracket opt-rest-bracketed-horizontal-group |
    𓐷 open-bracket literal opt-close-bracket opt-rest-bracketed-horizontal-group |
    𓐷 horizontal-subgroup close-bracket opt-rest-bracketed-horizontal-group |
    𓐷 literal close-bracket opt-rest-bracketed-horizontal-group
opt-rest-bracketed-horizontal-group ::= 𓐸 | rest-bracketed-horizontal-group
rest-bracketed-horizontal-group ::= 
    𓐱 horizontal-subgroup opt-rest-bracketed-horizontal-group | 
    𓐱 literal opt-rest-bracketed-horizontal-group | 
    𓐱 open-bracket horizontal-subgroup opt-close-bracket opt-rest-bracketed-horizontal-group | 
    𓐱 open-bracket literal opt-close-bracket opt-rest-bracketed-horizontal-group | 
    𓐱 horizontal-subgroup close-bracket opt-rest-bracketed-horizontal-group | 
    𓐱 literal close-bracket opt-rest-bracketed-horizontal-group
bracketed-flat-horizontal-group ::= 𓐷 literal rest-bracketed-flat-horizontal-group
rest-bracketed-flat-horizontal-group :: 𓐱 literal rest-bracketed-flat-horizontal-group | 𓐱 literal 𓐸
horizontal-subgroup ::= bracketed-vertical-group | basic-group
basic-group ::= core-group | insert-group | placeholder | enclosure
insert-group ::= core-group insertion | literal insertion
bracketed-insert-group ::= 𓐷 core-group insertion 𓐸 | 𓐷 literal insertion 𓐸
insertion ::= 
    𓐲 in-group opt-bs-ins opt-te-ins opt-be-ins opt-m-ins opt-t-ins opt-b-ins |
    𓐳 in-group opt-te-ins opt-be-ins opt-m-ins opt-t-ins opt-b-ins |
    𓐴 in-group opt-be-ins opt-m-ins opt-t-ins opt-b-ins |
    𓐵 in-group opt-m-ins opt-t-ins opt-b-ins |
    𓐹 in-group opt-t-ins opt-b-ins |
    𓐺 in-group opt-b-ins |
    𓐻 in-group 
opt-bs-ins ::= ε | 𓐳 in-group
opt-te-ins ::= ε | 𓐴 in-group
opt-be-ins ::= ε | 𓐵 in-group
opt-m-ins ::= ε | 𓐹 in-group
opt-t-ins ::= ε | 𓐺 in-group
opt-b-ins ::= ε | 𓐻 in-group
in-group ::= bracketed-vertical-group | bracketed-horizontal-group | bracketed-insert-group | core-group | literal | placeholder | enclosure
core-group ::= flat-horizontal-group 𓐶 flat-vertical-group
flat-horizontal-group ::= bracketed-flat-horizontal-group | literal
flat-vertical-group ::= bracketed-flat-vertical-group | literal
opt-close-bracket ::= ε | close-bracket
literal ::= sign opt-vs opt-mirror opt-damaged
opt-vs ::= ε | vs 
opt-mirror ::= ε | 𓑀 
opt-damaged ::= ε | damaged 
placeholder ::= 𓑁 | 𓑂 | 𓑃 opt-vs | 𓑄 opt-vs | 𓑅 opt-vs | 𓑆 opt-vs
enclosure ::= plain-open groups plain-close | walled-open groups walled-close

If there is a variation selector in a placeholder, then this must be  ︀. This could be checked following initial lexical and syntactic analysis.

The following would typically be implemented by the lexical analyzer, again with a longest-match strategy to disambiguate between a part of an enclosure and a singleton.

open-bracket ::= [ | { |  |  | 
close-bracket ::= ] | } |  |  | 
sign ::= 𓀀 | etc.
vs ::=  ︀ |  ︁ |  ︂ |  ︃ |  ︄ |  ︅ |  ︆
plain-open ::= [ plain-opening-delimiter [ damaged ] ] 𓐼 
plain-close ::= 𓐽 [ plain-closing-delimiter [ damaged ] ] 
walled-open ::= [ walled-opening-delimiter [ damaged ] ] 𓐾 
walled-close ::= 𓐿 [ walled-closing-delimiter [ damaged ] ]
singleton ::= 
    plain-opening-delimiter [ damaged ] |
    plain-closing-delimiter [ damaged ] |
    walled-opening-delimiter [ damaged ] |
    walled-closing-delimiter [ damaged ]
plain-opening-delimiter ::= 𓉘 | 𓉙 | 𓉚 | 𓍹 | 𓐯
plain-closing-delimiter ::= 𓉛 | 𓉜 | 𓉝 | 𓊂 | 𓍺 | 𓍻
walled-opening-delimiter ::= 𓊆 | 𓊈
walled-closing-delimiter ::= 𓊇 | 𓊉
damaged ::= 𓑇 | 𓑈 | 𓑉 | 𓑊 | 𓑋 | 𓑌 | 𓑍 | 𓑎 | 𓑏 | 𓑐 | 𓑑 | 𓑒 | 𓑓 | 𓑔 | 𓑕

Links