Grammar: difference between a top down and bottom up? (Example)

匿名 (未验证) 提交于 2019-12-03 08:42:37

问题:

This is a follow up question from Grammar: difference between a top down and bottom up?

I understand from that question that:

  • the grammar itself isn't top-down or bottom-up, the parser is
  • there are grammars that can be parsed by one but not the other
  • (thanks Jerry Coffin

So for this grammar (all possible mathematical formulas):

    E -> E T E     E -> (E)     E -> D      T -> + | - | * | /      D -> 0     D -> L G      G -> G G         G -> 0 | L      L -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9  

Would this be readable by a top down and bottom up parser?

Could you say that this is a top down grammar or a bottom up grammar (or neither)?


I am asking because I have a homework question that asks:

"Write top-down and bottom-up grammars for the language consisting of all ..." (different question)

I am not sure if this can be correct since it appears that there is no such thing as a top-down and bottom-up grammar. Could anyone clarify?

回答1:

That grammar is stupid, since it unites lexing and parsing as one. But ok, it's an academic example.

The thing with bottoms-up and top-down is that is has special corner cases that are difficult to implement with you normal 1 look ahead. I probably think that you should check if it has any problems and change the grammar.

To understand you grammar I wrote a proper EBNF

expr:     expr op expr |     '(' expr ')' |     number;  op:     '+' |     '-' |     '*' |     '/';  number:     '0' |     digit digits;  digits:     '0' |     digit |     digits digits;  digit:     '1' |      '2' |      '3' |      '4' |      '5' |      '6' |      '7' |      '8' |      '9';  

I especially don't like the rule digits: digits digits. It is unclear where the first digits starts and the second ends. I would implement the rule as

digits:     '0' |     digit |     digits digit; 

An other problem is number: '0' | digit digits; This conflicts with digits: '0' and digits: digit;. As a matter of fact that is duplicated. I would change the rules to (removing digits):

number:     '0' |     digit |     digit zero_digits;  zero_digits:     zero_digit |     zero_digits zero_digit;  zero_digit:     '0' |     digit; 

This makes the grammar LR1 (left recursive with one look ahead) and context free. This is what you would normally give to a parser generator such as bison. And since bison is bottoms up, this is a valid input for a bottoms-up parser.

For a top-down approach, at least for recursive decent, left recursive is a bit of a problem. You can use roll back, if you like but for these you want a RR1 (right recursive one look ahead) grammar. To do that swap the recursions:

zero_digits:     zero_digit |     zero_digit zero_digits; 

I am not sure if that answers you question. I think the question is badly formulated and misleading; and I write parsers for a living...



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!