Как написать CFG с функциями?
В задании меня попросили написать CFG для таких функций, как:
def f (x, y): вернуть x + y
def g (x, y): вернуть x - y
def h (x, y, z): вернуть x + y % z
def w (x, y, z): вернуть x * y - z
а также
def h1(x, y, z): возврат (x + y)% z
def h2 (x, y, z): вернуть x + y % z
Я попытался обработать его как обычный CFG, но я не смог сделать это для определений функций и функциональных тел. Я не совсем уверен, как начать с такого рода CFG.
1 ответ
Это плохой вопрос - вы не можете вообще закодировать правило "только параметры используются в теле функции" в CFG. Игнорируя эту небольшую проблему, мы можем попробовать:
S := def F (L): return E
F := CN
C := f | g | h | w
N := (empty string) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
L := X | XY
X := x | y | z
Y := , L
E := X | E + E | E - E | E / E | E % E | E * E | (E)
S
обеспечивает общую структуру функции. F
определяет, как создаются имена функций. L
определяет, как составляется список переменных. E
определяет, как создается выражение, включающее переменные и операторы. Обратите внимание, что это позволило бы такие вещи, как def f(x): return y
, но вы не можете предотвратить это в CFG.