Я хочу проанализировать-пропустить Forth-стиль, если из ввода, Forth-стиль означает, что каждый if начинается с if
и заканчивается then
, предполагая, что все входные данные правильные, обработка несоответствий не требуется.
Проблема в том, что каждая часть if
может рекурсивно содержать любое количество других if
.
Вот мое лучшее решение с тестовыми примерами:
Red []
skip-nested-ifs: [skip to ['if | 'then] skip-nested-ifs-helper]
skip-nested-ifs-helper: ['then | skip-nested-ifs skip-nested-ifs-helper ]
rules: skip-nested-ifs
test-cases: [
[if a then]
[if a else b then]
[if a if b then then]
[if a if b then 5 then]
[if a if b then 5 if c then then]
[if a else if b then then]
[if a else if b then 5 then]
[if a else if b then if c then then]
[if a if b if c then if d then then then]
]
forall test-cases [
prin [mold test-cases/1 ""]
print either parse test-cases/1 rules [ "OK" ] [ "FAIL" ]
]
Результат:
[if a then] OK
[if a else b then] OK
[if a if b then then] OK
[if a if b then 5 then] FAIL
[if a if b then 5 if c then then] FAIL
[if a else if b then then] OK
[if a else if b then 5 then] FAIL
[if a else if b then if c then then] OK
[if a if b if c then if d then then then] OK
Таким образом, три из них терпят неудачу, потому что они содержат что-то (в данном случае 5
) между одним then
и другим.
Вероятно, исправление очень простое и очевидное, но я не вижу его прямо сейчас. Не могли бы вы помочь мне исправить правило выше, если это возможно, или показать другое, которое проходит все тесты?
to
в первом правиле намеренно, или вы действительно хотелиthru
? - person DocKimbel   schedule 12.02.2017parse-trace
полезен для отладки синтаксического анализа - person Geeky I   schedule 12.02.2017to
намеренно, чтобы сопоставитьthen
после, потому что, еслиthen
найдено первым, это означает, что текущийif
завершен, иначе мы нажмем вложенный. - person user3033648   schedule 12.02.2017to
не использует правило аргумента, а просто останавливается перед (в данном случае['if | 'then]
). - person DocKimbel   schedule 12.02.2017