Как написать 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.


person Varun Gattu    schedule 31.10.2015    source источник


Ответы (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.

person Patrick87    schedule 23.11.2015