For simple grammars without GrammarTokens, you can make a recursive decent parser. Mathematica's pattern matching helps a lot, often making writing the simple parser trivial when compared to languages without it.
GrammarRules and GrammarApply use GrammarTokens. GrammarTokens are like Interpreters built into the grammar and have to be specially handled. Most GrammarTokens connect to Wolfram|Alpha, just like most Interpreters do.
Because these GrammarTokens query a server, parsing a string is more difficult. You want to minimize how many times you query the server and you want the queries to happen fast. Parsing on a server configured for this purpose seems like the ideal solution. I'm not aware of another piece of software or library in a similar situation.