What is the difference between a top down and bottom up grammar? An example would be awesome.
相关问题
- How to parse nested function calls using Pyparsing
- Is there a BNF with arguments for non-terminal sym
-
How [“03C0”] match
's grammar in Annex P? - boolean and arithmetic expression grammar in ANTLR
- What is the best way to define grammars for a text
相关文章
- Why does the C++ compiler give errors after lines
- Parse tree and grammar information
- Understanding precedence of assignment and logical
- Is Python 3.5's grammar LL(1)?
- Algorithm for computing FIRST and FOLLOW sets for
- LL(2) language that is not LL(1)
- Differentiate a block from an object initializer
- Where can I find a formal grammar for the Perl pro
First of all, the grammar itself isn't top-down or bottom-up, the parser is (though there are grammars that can be parsed by one but not the other).
From a practical viewpoint, the main difference is that most hand-written parsers are top-down, while a much larger percentage of machine-generated parsers are bottom-up (though, of course, the reverse is certainly possible).
A top-down parser typically uses recursive descent, which typically means a structure something like this (using typical mathematical expressions as an example):
A bottom-up parser work in the reverse direction -- where a recursive descent parser starts from the full expression, and breaks it down into smaller and smaller pieces until it reaches the level of individual tokens, a bottom-up parser starts from the individual tokens, and uses tables of rules about how those tokens fit together into higher and higher levels of the expression hierarchy until it reaches the top level (what's represented as "expression" above).
Edit: To clarify, perhaps it would make sense to add a really trivial parser. In this case, I'll just do the old classic of converting a simplified version of a typical mathematical expression from infix to postfix:
Note that the lexing here is pretty stupid (it basically just accepts a single character as a token) and the expressions allowed are quite limited (only +-*/). OTOH, it's good enough to handle an input like:
1+2*(3+4*(5/6))
from which it does produce what I believe is correct output:
1 2 3 4 5 6 / * + * +
Afaik it doesn't make any difference for the grammar itself, but it does for the parser.
Wikipedia has a quite lengthy explanation of both bottom-up and top-down parsing.
Generally the (imho) more intuitive way is top-down. You start with the start symbol and apply the transformation rules that fit, while with bottom-up you need to apply transformation rules backwards (which usually created quite a headache for me).