#lang racket ; Grammar: ; Terminals = {+, -, *, /, ^, (, )} U letters U digits ; Non-Terminals = {quantity, additive, product, multiplicative, power, primary, ; number, unit, exponent} ; Start symbol = quantity ; Rules: ; quantity -> product additive ; ; additive -> + product additive ; | - product additive ; | empty ; ; product -> power multiplicative ; ; multiplicative -> * power multiplicative ; | / power multiplicative ; | space power multiplicative ; | empty ; ; power -> primary ^ exponent ; | primary ; ; primary -> number ; | unit ; | ( quantity ) ; ; exponent -> number ; ; number -> digit number ; | digit ; ; unit -> letter unit ; | letter ; ; Eventually we will want to differentiate between exponent and number ; as exponent will always be an integers, whereas number can have a fraction. ; ; empty designates the empty string. ; space designates a space character. ; Whitespace is omitted for clarity, but it can optionally precede any item ; on the right-hand side, except for digit and letter.