Грамматика: разница между сверху вниз и снизу вверх? (Образец)
Это вопрос из грамматика: разница между сверху вниз и снизу вверх?
Я понимаю из этого вопроса, что:
- сама грамматика не сверху-вниз или снизу-вверх, парсер
- есть грамматики, которые могут быть проанализированы одним, но не другим
- (спасибо Джерри Гроб
Итак, для этой грамматики (все возможные математические формулы):
    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 
будет ли это читаться парсером сверху вниз и снизу вверх?
могли бы вы сказать, что это грамматика сверху вниз или грамматика снизу вверх (или ни то, ни другое)?
Я спрашиваю, потому что у меня есть домашнее задание вопрос, который спрашивает:
"пишем сверху-вниз и снизу-вверх грамматики для языка, состоящего из всех ..."(вопрос)
Я не уверен, что это может быть правильно, так как кажется, что нет такой вещи, как грамматика сверху вниз и снизу вверх. Кто-нибудь может уточнить?
1 ответов
эта грамматика глупа, так как она объединяет лексику и синтаксический анализ как один. Но ладно, это академический пример.
вещь с дном-вверх и сверху вниз-это то, что имеет специальные угловые случаи, которые трудно реализовать с вами нормальный 1 взгляд вперед. Я, вероятно, думаю, что вы должны проверить, есть ли у него какие-либо проблемы и изменить грамматику.
чтобы понять вас грамматику, я написал правильный 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'; 
мне особенно не нравится правило digits: digits digits. Это непонятно, где начинаются первые цифры и заканчиваются вторые. Я бы реализовал правило как 
digits:
    '0' |
    digit |
    digits digit;
другая проблема number: '0' | digit digits; это противоречит digits: '0' и digits: digit;. На самом деле это дублируется. Я бы изменил правила на (удаление цифр):
number:
    '0' |
    digit |
    digit zero_digits;
zero_digits:
    zero_digit |
    zero_digits zero_digit;
zero_digit:
    '0' |
    digit;
это делает грамматику LR1 (левую рекурсивную с одним взглядом вперед) и контекст свободной. Это то, что вы обычно даете генератору парсера, такому как bison. И так как Зубр пьет до дна, это допустимый вход для парсера bottoms-up.
для подхода сверху вниз, по крайней мере для рекурсивного приличного, левый рекурсивный-это немного проблема. Вы можете использовать откат, если хотите, но для них вам нужна грамматика RR1(правая рекурсивная). Для этого замените рекурсии:
zero_digits:
    zero_digit |
    zero_digit zero_digits;
Я не уверен, что это ответ на ваш вопрос. Я думаю, что вопрос плохо сформулирован и вводит в заблуждение; и я пишу Парсеры на жизнь...
