2015-11-12 15 views
1

У меня есть задание в школе, которая говорит нам, чтобы создать Нисходящий Parser в Java, который следует этой грамматике:Top-Down Синтаксического с рекурсивной грамматикой

assign = id , '=' , expr , ';' ; 
    expr = term , [ (’+’ | ’-’) , expr ] ; 
    term = factor , [ (’*’ | ’/’) , term] ; 
    factor = int | ’(’ , expr , ’)’ ; 

Я думаю, что я понял основы концепции разбора , например, «если у нас есть идентификатор, проверьте, является ли следующий токен« = », а следующий - expr, а следующий после этого -«; ». Верный?

Теперь, если я хочу, чтобы проверить, является ли входящий вход выражение:

проверить маркеры, чтобы увидеть, если термин существует, то, если «+ маркер» ИЛИ «- маркер» есть, и, наконец, если есть «expr». Но если я проверю, есть ли там «expr», он будет зацикливаться и, в конце концов, проверит , если есть «expr», и снова и снова.

Я не понимаю, как я могу это сделать? Может кто-нибудь мне помочь?

С наилучшими пожеланиями,

+0

Что вы попробовали? – nafas

+0

Я создал сканер, чтобы прочитать входной поток и вернуть каждый токен, который он прочитал в синтаксический анализатор. Затем синтаксический анализатор проверяет, вернёт ли маркер в грамматике и продолжает синтаксический анализ, анализируя следующий токен, возвращаемый, чтобы увидеть, постоянно ли он следует правилам грамматики. Когда я попадаю в чек, если есть выражение, в грамматике говорится, что выражение нуждается в выражении в конце. Таким образом, «проверка выражения» будет зацикливаться на себе, чтобы увидеть, является ли это выражением, и этот цикл будет бесконечным в моих глазах. Понять проблему? Трудно объяснить .. :) – Murmeel

+0

То же самое с «проверкой термина»! – Murmeel

ответ

0

OP кажется беспокоилось, что если его код правила ехрга вызывает правило синтаксического анализа для выража, это будет увязнуть в бесконечном цикле.

Ему не нужно беспокоиться!

Требуется немного подумать, но что на самом деле происходит, когда этот вызов C1 сделан, заключается в том, что вызываемые правила expr тестов на срок. Если это последний член в наборе слагаемых, который содержит expr, не будет следующего плюса/минуса, и вызов C1 завершится и вернется к процедуре синтаксического анализа родителя, которая затем будет завершена. Нет петли.

Если это не последний термин, термин будет разобран, плюс/минус будет видно, а экземпляр C1 сделает другой вызов C2 обратно в выражение. Эта рекурсия действует как одна итерация цикла и обрабатывается, как мы описали.

Должно работать нормально.

+0

Ты, сэр, получил мой мозг. Я прибил это. Спасибо. – Murmeel

 Смежные вопросы

  • Нет связанных вопросов^_^