The NeoFurrycode

Version: 1.0

Author: parchment

This code takes inspiration from many old codes, namely:

This document is for anyone wanting to precisely decode or encode a furcode. As it was written to be as clear as possible, this document may be a bit much. You may prefer this document, which goes through how to create a code step by step.

Any feedback welcome.

Basic Syntax

Whitespace is optional, and may be used to format the code to make it easier to read. Whitespace should have no semantic meaning, and thus can be ignored entirely.

Letter casing is important, i.e. “A” is not the same as “a”.

The code consists of several categories listed one after another. Categories may be followed by several characters to meet the category’s syntax.

Categories have a default syntax, however, some categories may use a custom syntax.

Several categories are defined by default. In the code, the order of categories does not matter, and categories may be left out entirely.

Categories

All categories begin with a capital letter indicating which category is defined. (ex C)

By default, a category may optionally be followed by a scale, then optionally, one or more subcategories.

Scale

A scale is how a user may quantitively indicate the magnitude of some meaning.

A scale may simply be a number from 0 to 9. This may be prefixed by either a - or + to indicate the sign of the number (ex “-3”, “+2”). The sign may be prefixed by a * to indicate that the number has an alternative meaning (ex “*0”, “*-1”).

Alternatively, a scale can be one or more +, -, or *s (ex “++”, “---”, “**”). They may not be mixed (ex “+-” is invalid). In this case, the associated number (starting at zero) is the amount of +, or the amount of - times -1, or the amount of *.

A scale’s value defaults to 0.

Subcategories

A subcategory, indicated by a lowercase letter, are used to specify sub-meanings under a category (ex “Ea”, “Eab”).

Instead of a single lowercase letter, a multi-character (which may have uppercase letters, though these are considered case-insensitive) subcategory may be indicated inside brackets. The scale is applied inside the brackets as well. Only one subcategory may be indicated inside brackets. (ex “E [ab2]”, “E [AB3] b4 [T2]”, “E[ab]”).

A subcategory may optionally be followed by a scale (ex “E a2 b5”, “E a b4 c”). Sometimes, the existence of a category is enough meaning for a category as well (ex “E” vs “Ea”).

Modifiers

  • / : Indicates that the user fits may alternate or fit in different values. The scale may specify that each value corresponds to a respective sona. In normal scales, this is placed between two values, and may be repeated (ex “2/3”, “++/+++”, “1/2/3”). This has precedence over >.

  • > : Indicates that the user fits one value, but hopes to change to another in the future. In normal scales, this is placed between two values, and may not be repeated (ex “2>3”, “++>+++”, “3>0”). This has precedence over ~.

  • () : Indicates a grouping. This is used to work around the precedence rules in / and >, where a scale like “2 > 3 / 4” is interpreted as “(2) > (3 / 4)” (the user is at 2 but wants to move to alternating between 3 and 4). Parenthesis may be used to group it differently if a different interpretation is wanted, like “(2 > 3) / 4” (the user sometimes is 2 but wants to move to 3, or is a 4).

  • ~ : Indicates an approximation. In normal scales, this is used before a normal value (ex “~2”, “~+++”).

  • $ : Indicates that the user makes a notable amount of money from the value. In normal scales, this is used after a normal value (ex “2$”, “+++$”).

  • ? : Indicates that the user is unsure or hasn’t decided what something should be. This is used in the place of a scale.

  • ! : Indicates a refusal to participate in a category or subcategory. This is used in the place of a category or subcategory value.

  • # : Indicates that the user considers the value to be private. This is used in the place of a category or subcategory value.

Additional Notes

Any defined categories or subcategories can be left out of the code entirely, by leaving out their indicators. When this is the case, their scale is considered to have a “none” value.

Categories and subcategories may be indicated in any order.

The code may start with some metadata. These are all completely optional, though order matters.

Version

A number may be used to indicate which version of the Fur Code the code uses. This will begin with an nf, then a number (which may be multiple digits long) to indicate the major version, then a ., then another number. (ex “nf1.0”, “nf10.29”)

The version of this document is noted at the beginning of this document.

Extending

The version header may optionally declare extensions, which add more categories to the code. The rules for extensions are discussed later.

An extension declaration follows a simple format: a short lowercase letter code, followed by a version (using the same syntax as the normal version). (ex “ex1.0”)

Each extension are separated by /. (ex “ex1.0/d1.0”)

All extensions are enclosed in parenthesis, and these parenthesis immediately follow the base version code. (ex “nf1.0(ex1.0/d1.0)”)

The entire version header, plus any extensions, must be followed by a :.

Name

The name of the user may be written. This can be wrapped in either " or brackets, and may be required to if the name contains : or spaces. (ex “violet:”, “[violet]:”, “"violet":”)

This must be followed by a :.

Gender

The gender of the user may be written.

The user may use one of the following options to indicate gender:

  • n : enby
  • m : male
  • f : female
  • o : other
  • x : n/a

Then the user may use one of the following options to indicate pronouns:

  • t : they/them
  • h : he/him
  • s : she/her
  • a : any
  • x : n/a

Instead of an option, the user may specify by encasing a name in brackets. (ex “[other]”)

In the case of pronouns, there should be a / in-between two pronouns. (ex “o[fae/faer]”)

For their associated meanings, ?, #, and ! may be used instead of any option. An option may be prefixed with ~. Options may be combined by separating them with +, or they may be shown to be alternating with /.

For this section only, you may specify another gender definition with ;. This has the same effect as adding genders together. (ex “oa;fs” == “o+f a+s”)

This must be followed with a :.

If this section is omitted, the user’s gender can be assumed later. See the F category’s gender section for more information.

Content

Each of the following sections specify a category. Remember that these may be found in any order.

F : Fursona

A category where the user declares their sonas. Uses a special syntax, noted here.

For their associated meanings, ! and # may be used to replace the normal content of this category.

Species

First, the species of the sona is declared. The user may use any one of the following codes to denote their species.

Note that entire families may be used instead of just species. (ex A for general avians, vs AD for a duck)

  • A : avians
    • AA : albatross
    • AD : duck
    • AE : eagle
    • AF : falcon
    • AG : seagull
    • AH : hawk
    • AK : kiwi
    • AO : owl
    • AR : raven
    • AS : sparrow
    • AW : wren
  • Ar : artiodactyla (two-toed hoofed animals)
    • ArA : antelope
    • ArB : buffalo
    • ArC : cattle
    • ArD : deer
    • ArE : camel
    • ArF : giraffe
    • ArG : goat
    • ArL : llama
    • ArM : moose
    • ArN : gnu
    • ArP : pig
    • ArR : reindeer
    • ArS : sheep
    • ArW : warthog
    • ArZ : gazelle
  • C : canidae (dog family)
    • CA : arctic fox
    • CC : coyote
    • CD : dingo
    • CF : fox
    • CJ : jackal
    • CM : domestic mutt
    • CW : wolf
    • CX : maned wolf
  • Ce : centaurs
    • CeH : common
    • CeZ : zebra-centaur
  • Ch : chiroptera (bat family)
    • ChF : fruit bat
    • ChV : vampire bat
  • Ct : cetacea (whale family)
    • CtD : dolphin
  • D : reptiles (+ dragons, dinosaurs)
    • DA : alligator / crocodile
    • DC : coelurosaur (velociraptor, etc)
    • DD : dragon
    • DK : carnosaur (tyrannosaurus, etc)
    • DL : lizard
    • DS : snake
    • DT : tortoise / turtle
  • E : equidae (horse family)
    • ED : donky
    • EH : horse
    • EZ : zebra
  • Ed : edentata
    • EdA : anteater
    • EdR : armadillo
    • EdS : sloth
  • F : felidae (cat family)
    • FB : bobcat
    • FC : clouded leopard
    • FD : domestic cat
    • FH : cheetah
    • FJ : jaguar
    • FL : lion
    • FM : puma / cougar / mountain lion
    • FO : ocelot
    • FP : leopard / panther
    • FS : snow leopard
    • FT : tiger
    • FV : serval
    • FW : wild cat
    • FX : lynx
  • G : generic
  • H : herpestidae (mongoose family)
    • HK : meerkat
    • HM : mongoose
  • I : insectivora
    • IH : hedgehog
    • IM : mole
  • L : lagomorpha (rabbit survey)
    • LH : hare
    • LJ : jackrabbit
    • LR : rabbit
  • M : mustelidae (weasel family)
    • MA : sable
    • MB : badger
    • ME : ermine / stoat
    • MF : ferret
    • MK : mink
    • MM : marten
    • MO : otter
    • MP : polecat
    • MR : ratel / honey badger
    • MS : skunk
    • MV : wolverine
    • MW : weasel
  • Ma : marsupialia
    • MaB : wombat
    • MaK : kangaroo
    • MaO : koala
    • MaP : possum
    • MaT : tasmanian devil
    • MaW : wallaby
  • Mo : monotremata
    • MoP : platypus
  • P : procyonidae (racoon family)
    • PR : racoon
  • Pi : pinnipedia (seal family)
    • PiL : sea lion
    • PiS : seal
    • PiW : walrus
  • Pr : primates
    • PrH : human
    • PrL : lemur
  • R : rodentia
    • RB : beaver
    • RG : grey squirrel
    • RM : mouse
    • RP : porcupine
    • RR : rat
    • RS : red squirrel
    • RU : muskrat
  • U : ursidae (bear family)
    • UA : polar bear
    • UB : black bear
    • UG : grizzly bear / brown bear / kodiak bear
    • UP : giant panda
  • V : viverridae (civet family)
    • VC : civet
  • X : mythical
    • XA : gargoyle
    • XC : manticore
    • XG : gryphon
    • XH : hippogriff
    • XM : mer-person
  • Xe : alien
  • Xa : “exotic”
    • XaS : slime-person
    • XaP : protogen
  • Z : polymorph

Instead of a species code, the user may specify a species by encasing the species’ name in brackets. (ex “[cat]”)

Hybrids may be noted by separating each species with a +. (ex “U+Hy”)

? may be used instead of a species, and can also be suffixed over a family (ex “Ma?” vs “MaO”). ~ may prefix a species.

This section should be followed by a ;, though this is optional.

Variation

Now the user denotes thematic or physical variations of the sona.

These options are available:

  • t : taur (ie: a torso that looks more “human-like” than the hips downward)
  • h : were-human
  • w : winged (if the species is not normally winged)
  • k : multi-tailed

Multiple may be used by using them one after another. (ex “tw” for a winged taur)

Anthro Scale

Next, the user indicates where the sona falls on the anthropomorphism scale.

  • 1 : Basically human, with minor furry features (eyes, nose, ears, claws, some fur, etc)
  • 2 : Humanoid, with significant furry features (muzzle, tail, etc)
  • 3 : Anthropomorphic animal (or taur)
  • 4 : Personified animal shape.
  • 5 : Normal animal shape

This is required.

Relationship

Next, the user indicates their relationship with this sona.

These options are available:

  • a : “me”
  • c : costume
  • d : subject of pictures
  • f : imaginary friend
  • r : RPG character
  • s : guardian spirit or totem
  • w : subject of stories

Like with variations, multiple of these may be used by using them one after another.

Gender

Finally, the user may indicate the gender of their sona.

First, a separating ; must be used between this and the last section. Then the syntax used in the “Gender” heading is used.

If this section is left out, the gender can be assumed to be the same as the heading. Further gender assumption rules are found in the next “Notes” section.

Notes

> and $ are not valid anywhere in this category.

Multiple sonas may be indicated by separating them with /. (ex “FHy;2a/D;4m”, where the two sonas are “Hy;2a” and “D;4m”)

If the “Gender” heading is present, and any indicated sona omits a gender specification, the sona’s gender can be assumed to be the same as the heading.

Otherwise, if the “Gender” heading is not present, the user and all other sona’s gender can be assumed to be the first specified sona’s gender. If that doesn’t work, meaning that no gender is indicated anywhere, assume all genders to be “;xt” (“a gender” with they/them pronouns).

A : Art

A category where the user notes their relationship with art. Uses the default syntax.

A scale applied to this category should be interpreted like so:

  • none : Default to -2.
  • -3 : The user actively hates doing art.
  • -2 : The user is uninterested in the arts.
  • -1 : The user doesn’t do art.
  • 0 : The user does art sometimes.
  • 1 : The user does art often.
  • 2 : The user does art as much as reasonable.

f : Furry Imagery

The existence of this subcategory indicates that the user creates furry images, and would then default to 1. Otherwise defaults to 0 as usual.

A scale applied to this category should be interpreted like so:

  • none : Default to -1.
  • -1 : The user doesn’t do this.
  • 0 : The user does this sometimes.
  • 1 : The user does this often.
  • 2 : The user does this very often.
  • 3 : The user does this almost exclusively.

These rules applies to the other subcategories of the Art category.

h : Human Imagery

The existence of this subcategory indicates that the user creates images of human.

o : Other Imagery

The existence of this subcategory indicates that the user creates other kinds of images.

m : Music

The existence of this subcategory indicates that the user creates music.

g : Games

The existence of this subcategory indicates that the user makes games.

a : Frames

The existence of this subcategory indicates that the user creates animations or film-likes.

w : Writing

The existence of this subcategory indicates that the user writes.

p : Physical

The existence of this subcategory indicates that the user creates physical arts - think pottery, knitting, etc.

D : Dress Up

A category to indicate the user’s thoughts on fursuits.

  • none : Default to -1
  • -2 : The user will never wear a fursuit
  • -1 : The user doesn’t care for fursuits
  • 0 : The user doesn’t wear fursuits
  • 1 : The user wears a fursuit if appropriate
  • 2 : The user wears a fursuit if when reasonable
  • 3 : The user is always wearing a fursuit

m : Make

A subcategory for if the user has constructed a piece of fursuit.

  • none : Default to -2.
  • -2 : The user hasn’t made anything.
  • -1 : The user has made cat ears (or equivalent size)
  • 0 : The user has made a simple set of ears, paws, tail
  • 1 : The user has made a simple full body costume
  • 2 : The user has made a classic fursuit
  • 3 : The fursuit can blink

R : Real Life Career

Used to indicate the user’s career and skills.

  • none : Nothing to assume.
  • -1 : The user is unemployed.
  • 0 : The user is employed.

a : Art

  • none : Default to -2.
  • -2 : The user doesn’t practice this.
  • -1 : The user is starting this.
  • 0 : The user is a consistent learner of this.
  • 1 : The user is an expert at this.

These interpretations apply to every other subcategory in this category. Note that the user may follow this with $ to indicate that they make money from it.

bm : Business/management

c : Craft

ci : Construction industry

ct : Computers/information technology

e : Engineering

et : Education/teaching

f : Farming

fb : Finance/banking

gp : Government/public service

l : Law

lw : Literature/writing

m : Music

ma : Military/armed forces

mc : Media/communications

mh : Medicine (human)

mv : Medicine (veterinary)

rb : Retail business

s : Science

th : Theatre

ti : Transport industry

at : All trades

Used when the user doesn’t have a specialization.

  • none : Nothing to assume.
  • 0 : The user doesn’t have a specialization.

u : Undecided

Used when the user hasn’t decided their specialization. This is more commonly used by undecided undergraduates.

  • none : The user isn’t undecided.
  • 0 : The user is undecided.

Extensions

Some people may want to add a category or two. For this reason, the NeoFurcode can be extended to add more categories. A code that has an extension may have included the extension in the header’s version.

If an extension is declared, but it is unknown what extension it refers to, it’s okay to ignore any categories from the extension.

Categories

An extension category is indicated by an underscore (_). Following this underscore will be an uppercase category indication. (ex _A refers to the extension’s A category)

Either optionally or if multiple extensions are present, the extension’s short lowercase code (the same one in the heading) will be before the category indication. (ex “_exA” refers to extension ex’s A category)

In the case that multiple extensions are declared, but the simple form is indicated (_A), the chosen extension is chosen by checking each extension in the order of declaration, and selecting the first extension that defines the category.

In the case that a matching category is not found, but it is indicated with the “_exA” format, then use the latest version of ex to parse the category.

Otherwise, or in the case that only an underscore or only an underscore and an extension code is indicated (ex “_++” or “_ex++”), the category should be ignored.

After this, normal category rules apply.

Error Correction

If a category or subcategory is indicated but doesn’t exist, parse the suffix and ignore its contents.

If an error is found while parsing a category (invalid character, unclosed bracket, etc), all information presented in the category should be discarded. The parser should then skip to the next uppercase letter and resume normal reading.

Backwards Compatibility

This section makes notes on backwards compatibility with the original Furcode.

As mentioned, Furcodes that use ! can’t be (correctly) read as a Neo Furcode. This is because in the original Furcode, ! is placed before a category (ex “!A”), while the Neo Furcode places it strictly after. In some cases, this will cause the code to be read incorrectly. For example, “A !B” in the original Furcode translates to [A = 0, B = Refuse]. In the Neo Furcode, it should translate to [A = Refuse, B = 0]. In some other cases, this will cause a syntax error. “A+ !B” in the original Furcode translates to [A = 1, B = Refuse]. In the Neo Furcode, it is syntactically invalid, as a ! in unexpected. In this case, the original meaning can be recovered. If an unexpected ! appears, and a category appears immediately after it, then the ! can be safely ignored. Additionally, if the category has nothing in it, then the category could be considered refused. This recovery option is completely optional, however.

Notes on Parsing

All whitespace can be removed entirely before any parsing.

Grammar

<code> ::= <header> <content>


<header> ::= <header_version>? <header_name>? <header_gender>?

<header_version> ::= "nf" <version> ("(" <header_extension_list> ")")? ":"
<header_extension_list> ::= <header_extension> ("/" <header_extension_list>)?
<header_extension> ::= [a-z]+ <version>
<version> ::= [0-9]+ "." [0-9]+

<header_name> ::= <header_name_item> ":"
<header_name_item> ::= [a-z]+ | "\"" [a-z]+ "\"" | "[" [a-z]+ "]"

<header_gender> ::= <gender> (";" <gender>)* ":"

<scale_mod> ::= <scale_mod_goal>

<scale_mod_goal> ::= <scale_mod_or> (">" <scale_mod_or>)?
<scale_mod_or> ::= <scale_mod_atom> ("/" <scale_mod_or>)?
<scale_mod_atom> ::= "~"? <scale> "$"? | ("(" <scale_mod> ")")

<scale> ::= <scale_number> | <scale_amount>
<scale_number> ::= "*"? ("+" | "-")? [0-9]
<scale_amount> ::= "+"+ | "-"+ | "*"+


<content> ::= <category>*

<category> ::= 
	"F" <category_Furry> |
	"A" <category_default> |
	"D" <category_default> |
	"R" <category_default> |
	"_" [A-Z] <category_default>

<category_define> ::= ("!" | "#" | "?" | <scale_mod>)

<category_default> ::= <category_define>? <default_subcategory>*
<default_subcategory> ::=
	([a-z] <category_define>?) |
	("[" ([a-z]+ | "'" [any]* "'") <category_define>? "]")


<category_furry> ::= ("!" | "#") | <furry>

<furry> ::= <furry_sona> ("/" <furry_sona>)*
<furry_sona> ::=
    <furry_species_hybrid> ";"? 
    <furry_variation>? 
    <furry_scale> 
    <furry_relationship>?
    (";" <furry_gender>)?

<furry_species_hybrid> ::= <furry_species> ("+" <furry_species_hybrid>)?
<furry_species> ::= "~"? [A-Z] [a-z]? ([A-Z] | "?")? | "?"

<furry_variation> ::= [a-z]+

<furry_scale> ::= <scale>

<furry_relationship> ::= [a-z]+

<furry_gender> ::= <gender>


<gender> ::= 
	(<gender_g_or> | "!" | "#" | "?") 
    (<gender_p_or> | "!" | "#" | "?")

<gender_g_or> ::= <gender_g> (("+" | "/") <gender_g>)+
<gender_p_or> ::= <gender_p> (("+" | "/") <gender_p>)+

<gender_g> ::= <gender_x_option> | ("[" [a-z]* "]")
<gender_p> ::= <gender_x_option> | ("[" [a-z]* "/" [a-z]* "]")
<gender_x_option> ::= "~"? [a-z]