Skip to content

Instantly share code, notes, and snippets.

@Bibliofile
Created January 23, 2019 02:40
Show Gist options
  • Save Bibliofile/d76299d71f8be80da5cb944d6d7fa179 to your computer and use it in GitHub Desktop.
Save Bibliofile/d76299d71f8be80da5cb944d6d7fa179 to your computer and use it in GitHub Desktop.
# Paste this into https://omrelli.ug/nearley-playground/
main -> expression {% id %}
expression ->
mult_term {% id %}
| expression _ ("+"|"-") _ mult_term {% d => d[2][0] === '+' ? d[0] + d[4] : d[0] - d[4] %}
mult_term ->
exp_term {% id %}
| mult_term _ ("*"|"/") _ exp_term {% d => d[2][0] === '*' ? d[0] * d[4] : d[0] / d[4] %}
exp_term ->
number_or_fn {% id %}
| exp_term _ ("^"|"**") _ number_or_fn {% d => Math.pow(d[0], d[4]) %}
number_or_fn ->
number {% id %}
| "pi" {% () => Math.PI %}
| "e" {% () => Math.E %}
| "ln" _ "(" _ number_or_fn _ ")" {% d => Math.log(d[4]) %}
| "pow" _ "(" _ number_or_fn _ "," _ number_or_fn _ ")" {% d => Math.pow(d[4], d[8]) %}
number ->
("-"|"+") _ number {% d => d[0][0] === '-' ? -d[2] : d[2] %}
| unsigned_number {% id %}
unsigned_number ->
unsigned_decimal {% id %} # 123, 1.5
| hex_number {% id %} # 0xff
| octal_number {% id %} # 0o77
unsigned_decimal ->
unsigned_int {% id %} # 123
| unsigned_int "." unsigned_int {% d => +`${d[0]}.${d[2]}` %} # 1.2
hex_number ->
"0x" [a-f0-9]:+ {% d => parseInt(d[1].join(''), 16) %}
| "0x" [a-f0-9]:+ "." [a-f0-9]:+ {% d => parseInt(d[1].join(''), 16) %}
octal_number -> "0o" [0-7]:+ {% d => parseInt(d[1].join(''), 8) %}
unsigned_int -> [0-9]:+ {% d => +d[0].join('') %}
# Optional whitespace
_ -> [\s]:* {% () => null %}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment