Хорошо, я подумал, что здесь будет достаточно специалистов по CS, чтобы проверить мой псевдокод для моего парсера рекурсивного спуска. Я разработал его из этого BNF
EXP ::= EXP + TERM | EXP - TERM | TERM
TERM ::= TERM * FACTOR | TERM/FACTOR | FACTOR
FACTOR ::= (EXP) | DIGIT
DIGIT ::= 0|1|2|3
Вот псевдокод:
procedure exp()
term()
if token == ‘+’
match(‘+’)
term()
elseif token == ‘-‘
match(‘-‘)
term()
else
break
procedure term()
factor()
if token == ‘*’
match(‘*’)
factor()
elseif token == ‘/’
match(‘/’)
factor()
else
break
procedure factor()
if token == ‘(‘
match(‘(‘)
exp()
match(‘)’)
else
digit()
procedure digit()
if token == ‘0’
match(‘0’)
elseif token == ‘1’
match(‘1’)
elseif token == ‘2’
match(‘2’)
else
match(‘3’)
match(t)
if token == t
advancetokenpointer
else
error
Это правильно? Я думал, что мне может понадобиться возврат в каждой процедуре, и я тоже не уверен в правильности своей процедуры. Может быть, включить процедуру завершения? В любом случае, большое спасибо! :-)