// file: math-grm-standard.def
// version: 1.0
//
// Provides a rather open grammar that can be used to recognize math
// expressions.
// _____________________________________________________________________________

/*
quick reminder about the syntax supported by MkMathGrammar

  . comments:
    . whole line comments starting with //, # or " sign (up to end of line)
    . block comments delimited by /* */ (can be nested)
    . inline comments are not supported

  . terminal symbol definitions:
    . terminal_name = terminal_str
      . terminal_name is defined as: [-a-zA-Z_][-a-zA-Z_0-9]*
      . terminal_str is defined as: ( ( !EOL . )+ | EOL space+ )+
        . space is defined as ' ' | '\t'
        . EOL is defined as '\r\n' | '\n' | '\r'
    . terminal_ str is allowed to span multiple lines provided a "continuation
      line" starts with a space, which allows you to pretty format long terminal
      symbol definitions

  . rule definitions:
    . non_terminal_name ::= rule (| rule)?
      . non_terminal_name is defined as: [-a-zA-Z_][-a-zA-Z_0-9]*
      . supported rules are:
        . identity(source)
        . hpair(left, right)
        . fence(source, left, right)
        . fraction(numerator, denominator)
        . sqrt(source)
        . subscript(source, index)
        . superscript(source, exponent)
        . subsuperscript(source, index, exponent)
        . underscript(source, bottom)
        . overscript(source, top)
        . underoverscript(source, bottom, top)
        . presuperscript(source, exponent)
        . vpair(top, bottom)
        . leftfence(source, left)
        . vlist(source)
        . columnaroperation(digit, carry, decimal_separator_flags, cancel_flags, operation_flags)
          . decimal_separator_flags are defined as 'none' | 'dot' | 'comma'
          . cancel_flags are defined as 'none' | 'cancel' | 'bcancel' | 'xcancel'
          . operation_flags are defined as 'addition' | 'subtraction' | 'multiplication' | 'division english' | 'division french' | 'division dutch' | 'division indian' | 'division german'
      . rule continuations allow you to pretty format rule definitions by
        avoiding repeating target non_terminal_name

  . start symbol definition:
    . start(non_terminal_name)

apart from continuation lines, everything is pretty much space insensitive

*/

// terminal symbol definitions
symbol1 = 0 1 2 3 4 5 6 7 8 9
          A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
          a b c d e f g h i j k l m n o p q r s t u v w x y z
          Γ Δ Θ Λ Ξ Π Σ Υ Φ Ω α β γ δ ε η ζ θ ι κ λ ν ξ π ρ σ τ υ φ χ ψ ω ϕ µ Ψ
          ℂ ℕ ℚ ℝ ℤ 𝔻 ℑ ℜ ℓ
          € $ £ ¥ ₩ ¢
          ( ) < > [ ] { } ⟨ ⟩ ⌈ ⌉ ⌊ ⌋ ⟦ ⟧
          ! # % & ? @ / \ | ∥ © ∂ ∅ ∇ ∞ ℏ ‰ ⊥ ∦ ⫻
          □ △
          km hm dam dm cm mm µm
          ha
          hl dal dl cl ml µl
          kg hg dag dg cg mg µg
          ms µs
          GHz MHz kHz Hz
          dx dy dz dt
          sin cos tan sinh cosh tanh arcsin arccos arctan cot coth
          min max arg argmin argmax
          inf sup lim liminf limsup
          ln log
          card Im Re
          µA µC µF µHz µJ µN µPa µS µT µV µW µWb µWh µbar µcd µeV µlm µlx

symbol2 = + - ± × ÷ * ∘ · = ' , . … : ; _ ⋮
          ← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↼ ⇀ ↽ ⇁
          ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇋ ⇌
          ∃ ∄ ∈ ∉ ∋ ∌
          ∩ ∪ ⊂ ⊃ ⊄ ⊅ ⊆ ⊈ ⊇ ⊉
          ∼ ≃ ≠ ≡ ≢ ≒ ≈ ≄ ≅ ≆ ≇ ≈ ≉
          ≤ ≥ ≪ ≫ ≮ ≯ ≰ ≱
          ∀ ∝ ∠ ∧ ∨ ⦞
          ⊕ ⊗ ⊖ ⊙ ⋉ ⋊
          ¬

symbol3 = ∏ ∑ ∫ ∮ ∬ ∭ ∯ ∰ ∐

symbol4 = ∏ ∑ ∫ ∮ ∬ ∭ ∯ ∰ ∐
              min max arg argmin argmax
              inf sup lim liminf limsup

symbol5 = - ∧ ← → ↔

symbol6 = ( [ { | ∥ ⟨ ⌈ ⌊ ⟦
symbol7 = ) ] } | ∥ ⟩ ⌉ ⌋ ⟧
symbol8 = {

// rule definitions

sqrtTerm ::= sqrt(term)

vectorTerm ::= vpair(term, term)
             | vpair(vectorTerm, term)

system ::= leftfence(vectorTerm, symbol8)

exponentiable ::= identity(symbol1)
                | identity(sqrtTerm)
                | presuperscript(sqrtTerm, term)
                | overscript(term, symbol5)
                | fence(term, symbol6, symbol7)
                | fence(vectorTerm, symbol6, symbol7)

term ::= identity(exponentiable)
       | identity(symbol2)
       | identity(symbol3)
       | hpair(term, term)
       | fraction(term, term)
       | subscript(exponentiable, term)
       | superscript(exponentiable, term)
       | subsuperscript(exponentiable, term, term)
       | underscript(symbol4, term)
       | overscript(symbol3, term)
       | underoverscript(symbol3, term, term)

expression ::= identity(term)
             | identity(system)
             | hpair(term, system)

vlist ::= vlist(expression)

// start symbol
start(vlist)
