Определение контекстно-свободной грамматики для подписи функции - PullRequest
2 голосов
/ 07 марта 2011

Я изучаю контекстно-свободные грамматики для курса по компиляторам, который посещаю. Я пытался определить грамматику для сигнатур функций. Примеры будут:

int a
int b, int c
Object a, Object d
...

Самое близкое, чего я мог достичь к чему-то подобному, было:

Params -> Params, Param
       |  Param
       |  lambda

Param -> paramType paramName

Но это не то, что я хочу. Эта грамматика допускает неверную строку как , int a. Я был здесь некоторое время, и я не могу придумать лучшего способа найти правильную грамматику.

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

В основном мы хотим получить (Param,)* Param | lambda, так как это сделать в правилах производства?Ну, мы можем ввести другое правило для (Param,)*, например:

ParamCommas -> Param, ParamCommas
            |  lambda

Затем мы можем использовать его в Params следующим образом:

Params -> ParamCommas Param
       |  lambda

Обратите внимание, что мы не делаемнужно дополнительное правило для одного Param, поскольку ParamCommas уже может быть lambda.

0 голосов
/ 12 ноября 2013

Как насчет этого:

Param-> AB|lambda
A-> param
B->','paramB|lambda
...