У меня есть задание в школе, которая говорит нам, чтобы создать Нисходящий Parser в Java, который следует этой грамматике:Top-Down Синтаксического с рекурсивной грамматикой
assign = id , '=' , expr , ';' ;
expr = term , [ (’+’ | ’-’) , expr ] ;
term = factor , [ (’*’ | ’/’) , term] ;
factor = int | ’(’ , expr , ’)’ ;
Я думаю, что я понял основы концепции разбора , например, «если у нас есть идентификатор, проверьте, является ли следующий токен« = », а следующий - expr, а следующий после этого -«; ». Верный?
Теперь, если я хочу, чтобы проверить, является ли входящий вход выражение:
проверить маркеры, чтобы увидеть, если термин существует, то, если «+ маркер» ИЛИ «- маркер» есть, и, наконец, если есть «expr». Но если я проверю, есть ли там «expr», он будет зацикливаться и, в конце концов, проверит , если есть «expr», и снова и снова.
Я не понимаю, как я могу это сделать? Может кто-нибудь мне помочь?
С наилучшими пожеланиями,
Что вы попробовали? – nafas
Я создал сканер, чтобы прочитать входной поток и вернуть каждый токен, который он прочитал в синтаксический анализатор. Затем синтаксический анализатор проверяет, вернёт ли маркер в грамматике и продолжает синтаксический анализ, анализируя следующий токен, возвращаемый, чтобы увидеть, постоянно ли он следует правилам грамматики. Когда я попадаю в чек, если есть выражение, в грамматике говорится, что выражение нуждается в выражении в конце. Таким образом, «проверка выражения» будет зацикливаться на себе, чтобы увидеть, является ли это выражением, и этот цикл будет бесконечным в моих глазах. Понять проблему? Трудно объяснить .. :) – Murmeel
То же самое с «проверкой термина»! – Murmeel