Как да напиша 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