Я пытаюсь написать интерпретатор «игрушек» с использованием Flex + Lemon, который поддерживает очень простой синтаксис let, где переменная X временно привязана к выражению. Например, «Пусть X 3 + 4 в х + 8» следует оценивать до 15.Использование правил смежности в Lemon для интерпретации выражения «let»
В сущности, то, что я «как» правило сказать:
expr(E) ::= LETX expr(N) IN expr(O). {
environment->X = N;
E = O;
}
Но это не будет работа с O
оценивается до назначения X = N
.
Я понимаю, что обычное решение для этого было бы действием среднего правила. Lemon явно не поддерживает это, но я читал в другом месте, что в любом случае будет syntactic sugar.
Так что я попытался собрать в середине правила действий, которые могли бы сделать мое назначение X = N
перед интерпретацией O
:
midruleaction ::= /* mid rule */. { environment->X = N; }
expr(E) ::= LETX expr(N) IN midruleaction expr(O). { E = O; }
Но это не будет работать, потому что нет никакого способа для midruleaction
правила к доступ N
, или, по крайней мере, нет, я вижу в лимонных документах/примерах.
Я думаю, что мне что-то не хватает. Я знаю, что смогу построить дерево, а затем пройти его через второй проход. И я мог бы это сделать, но я хотел бы понять, как решить эту проблему сначала.
Любые предложения?
Спасибо! И я определенно ценю вашу точку в АСТ. –
Поскольку ссылка в OP ведет к одному из моих ответов, и я не согласен с этим ответом в этом ответе, я теперь пересмотрел свой первоначальный ответ. Я боюсь, что, если быть более точным, это становится более запутанным, но такова жизнь. – rici