calc.bnf 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <start> = assignment | expr | comment | directive
  2. expr = add-sub [comment]
  3. comment = <#'\s*(#.*$)?'>
  4. <add-sub> = pow-term | mul-div | add | sub | variable
  5. add = add-sub <'+'> mul-div
  6. sub = add-sub <'-'> mul-div
  7. <mul-div> = pow-term | mul | div | mod
  8. mul = mul-div <'*'> pow-term
  9. div = mul-div <'/'> pow-term
  10. mod = mul-div <'mod'> pow-term
  11. <pow-term> = pow | factorial | term
  12. pow = posterm <'^'> pow-term
  13. factorial = posterm <'!'> <#'\s*'>
  14. <function> = log | ln | exp | sqrt | abs | sin | cos | tan | acos | asin | atan
  15. log = <#'\s*'> <'log('> expr <')'> <#'\s*'>
  16. ln = <#'\s*'> <'ln('> expr <')'> <#'\s*'>
  17. exp = <#'\s*'> <'exp('> expr <')'> <#'\s*'>
  18. sqrt = <#'\s*'> <'sqrt('> expr <')'> <#'\s*'>
  19. abs = <#'\s*'> <'abs('> expr <')'> <#'\s*'>
  20. sin = <#'\s*'> <'sin('> expr <')'> <#'\s*'>
  21. cos = <#'\s*'> <'cos('> expr <')'> <#'\s*'>
  22. tan = <#'\s*'> <'tan('> expr <')'> <#'\s*'>
  23. atan = <#'\s*'> <'atan('> expr <')'> <#'\s*'>
  24. acos = <#'\s*'> <'acos('> expr <')'> <#'\s*'>
  25. asin = <#'\s*'> <'asin('> expr <')'> <#'\s*'>
  26. <posterm> = function | percent | scientific | number | mixed-number | variable | <#'\s*'> <'('> expr <')'> <#'\s*'>
  27. negterm = <#'\s*'> <'-'> ( posterm | pow | factorial )
  28. <term> = negterm | posterm
  29. scientific = #'\s*[0-9]*\.?[0-9]+(e|E)[\-\+]?[0-9]+()\s*'
  30. number = decimal-number | hexadecimal-number | octal-number | binary-number
  31. <decimal-number> = #'\s*(\d+(,\d+)*(\.\d*)?|\d*\.\d+)\s*'
  32. <hexadecimal-number> = #'\s*0x([0-9a-fA-F]+(,[0-9a-fA-F]+)*(\.[0-9a-fA-F]*)?|[0-9a-fA-F]*\.[0-9a-fA-F]+)\s*'
  33. <octal-number> = #'\s*0o([0-7]+(,[0-7]+)*(\.[0-7]*)?|[0-7]*\.[0-7]+)\s*'
  34. <binary-number> = #'\s*0b([01]+(,[01]+)*(\.[01]*)?|[01]*\.[01]+)\s*'
  35. mixed-number = <#'\s*'> digits <#'\s+'> digits <'/'> digits <#'\s*'>
  36. percent = number <'%'> <#'\s*'>
  37. variable = #'\s*_*[a-zA-Z]+[_a-zA-Z0-9]*\s*'
  38. toassign = #'\s*_*[a-zA-Z]+[_a-zA-Z0-9]*\s*'
  39. assignment = toassign <#'\s*'> <'='> <#'\s*'> expr
  40. <directive> = <#'\s*\:'> (format | base) <#'\s*'> [comment]
  41. <format> = <#'(format|fmt)\s+'> ( format-fix | format-sci | format-norm | format-frac | format-impf )
  42. format-fix = <#'(?i)fix(ed)?\s*'> digits
  43. format-sci = <#'(?i)sci(entific)?\s*'> [digits]
  44. format-norm = <#'(?i)norm(al)?\s*'> [digits]
  45. format-frac = <#'(?i)frac(tions?)?\s*'> [digits]
  46. format-impf = <#'(?i)imp(roper)?\s*'> [digits]
  47. base = base-hex | base-dec | base-oct | base-bin
  48. <base-hex> = #'(?i)hex' <#'(?i)(adecimal)?'>
  49. <base-dec> = #'(?i)dec' <#'(?i)(imal)?'>
  50. <base-oct> = #'(?i)oct' <#'(?i)(al)?'>
  51. <base-bin> = #'(?i)bin' <#'(?i)(ary)?'>
  52. digits = #'\d+'