2.5.2 Formula ABNF and Full Grammar Definition

A formula expression MUST conform to the following ABNF [RFC4234] grammar.

val = expression

expression = sp (operand / function-call)

operand = token

token = PtgAcre / PtgAngDD / PtgAngDft / PtgAngDMS / PtgAngRad / PtgBool / PtgColorRGB / PtgCy / PtgDataBinding / PtgDate / PtgEDay / PtgEHour / PtgEMin / PtgErr / PtgESec / PtgEWeek / PtgFunc / PtgFuncVar / PtgHectare / PtgJmp / PtgJmpF / PtgJmpLabel / PtgJmpT / PtgMissArg / PtgNoOp / PtgNum / PtgNumCM / PtgNumDft / PtgNumF / PtgNumFI / PtgNumI / PtgNumKM / PtgNumM / PtgNumMI / PtgNumMM / PtgNumMultiDim / PtgNumNM / PtgNumPct / PtgNumYards / PtgPageDft / PtgPop / PtgPnt / PtgPushTop / PtgRecalcRef / PtgStr1 / PtgTDurDft / PtgTypCD / PtgTypCi / PtgTypDft / PtgTypDi / PtgTypPi / PtgTypPP / PtgTypPt / PtgUnsWord

function-call = if-expression / fixed-func / variable-func

if-expression = expression sp (PtgJmpF / PtgJmpT) sp expression sp PtgJmp sp PtgJmpLabel sp PtgPop sp expression PtgJmpLabel

fixed-func = Abs / ACos / Add / Ang360 / ASin / ATan / ATan2 / BitAnd / BitNot / BitOr / BitXor / Blend / CellIsThemed / Char / Cos / Cat / CosH / CY / Date / Deg / Div / EEQ / EGE / EGT / ELE / ELT / ENE / FEQ / FGE / FGT / FLE / FLT / FNE / FormatEx / HSL / Hue / HueDiff / Int / IntersectX / IntersectY / Intup / IsErr / IsErrNA / IsError / IsErrValue / Len / Ln / Log10 / Lower / Lum / LumDiff / Magnitude / Mid / Modulus / MsoShade / MsoTint / Mul / Not / Now / Pct / Pi / Pow / Pnt / Rad / Rand / Replace / RGB / Round / Sat / SatDiff / SetAtRefEval / Shade / Sin / SinH / Sqrt / StrSameEx / Sub / Tan / TanH / TextHeight / Time / Tint / Tone / Trim / Trunc / UMinus / UPlus / Upper

variable-func = And / Bound / Ceiling / DateTime / DateValue / Day / DayOfYear / Find / Floor / Hour / Index / Left / Lookup / Max / Min / Minute / Month / Or / Right / Second / SetAtRef / SetAtRefExpr / ShapeText / Sign / StrSame / Substitute / Sum / TimeValue / WeekDay / Year

fixed-func-name = "ABS" / "ACOS" / "_ADD" / "ANG360" / "ASIN" / "ATAN" / "ATAN2" / "BITAND" / "BITNOT" / "BITOR" / "BITXOR" / "BLEND" / "CHAR" / "COS" / "_CAT" / "COSH" / "CY" / "DATE" / "DEG" / "_DIV" / "_EEQ" / "_EGE" / "_EGT" / "_ELE" / "_ELT" / "_ENE" / "_FEQ" / "_FGE" / "_FGT" / "_FLE" / "_FLT" / "_FNE" / "FORMATEX" / "HSL" / "HUE" / "HUEDIFF" / "INT" / "INTERSECTX" / "INTERSECTY" / "INTUP" / "ISERR" / "ISERRNA" / "ISERROR" / "ISERRVALUE" / "LEN" / "LN" / "LOG10" / "LOWER" / "LUM" / "LUMDIFF" / "MAGNITUDE" / "MID" / "MODULUS" / "MSOSHADE" / "MSOTINT" / "_MUL" / "NOT" / "NOW" / "_PCT" / "PI" / "POW" / "RAD" / "RAND / "REPLACE" / "RGB" / "ROUND" / "SAT" / "SATDIFF" / "SETATREFEVAL" / "SHADE" / "SIN" / "SINH" / "SQRT" / "STRSAMEEX" / "_SUB" / "TAN" / "TANH" / "TEXTHEIGHT" / "TIME" / "TINT" / "TONE" / "TRIM" / "TRUNC" / "_UMINUS" / "_UPLUS" / "UPPER"

var-func-name = "AND" / "BOUND" / "CEILING" / "DATETIME" / "DATEVALUE" / "DAY" / "DAYOFYEAR" / "FIND" / "FLOOR" / "HOUR" / "INDEX" / "LEFT" / "LOOKUP" / "MAX" / "MIN" / "MINUTE" / "MONTH" / "OR" / "RIGHT" / "SECOND" / "SETATREF" / "SETATREFEXPR" / "SIGN" / "STRSAME" / "SUBSTITUTE" / "SUM" / "TIMEVALUE" / "WEEDKAY" / "YEAR"

color-value = xsd-int

currency = xsd-unsignedInt

date-time-value = xsd-double

unit = xsd-unsignedInt

shape-name = string-value

shape-data = string-value

shape-data-type = xsd-unsignedInt

dimension = xsd-unsignedInt

num-args = xsd-unsignedInt

empty-value = ""

string-value = xsd-string

double-value = xsd-double

unsigned-integer-value = xsd-unsignedInt

bool-value = true-value / false-value

true-value = %x54/%x74 %x52/%x72 %x55/%x75 %x45/%x65

false-value = %x46/%x66 %x41/%x61 %x4C/%x6C %x53/%x73 %x45/%x65

xsd-double = ["+" / "-"] *digit ["." 1*digit] [("e" / "E") ["+" / "-"] 1*digit]

xsd-int = ["+" / "-"] 1*digit

xsd-unsignedInt = 1*digit

xsd-string = *(%x20-7E)

token-separator = %x3A           ; colon

sp = %x20                        ; space

digit = %x30-39                  ; Decimal digits (0-9)