Определение контекстно-свободной грамматики для сигнатуры функции

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

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

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

Params -> Params, Param
       |  Param
       |  lambda

Param -> paramType paramName

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

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


person devoured elysium    schedule 06.03.2011    source источник


Ответы (2)


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

ParamCommas -> Param, ParamCommas
            |  lambda

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

Params -> ParamCommas Param
       |  lambda

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

person sepp2k    schedule 06.03.2011
comment
Хорошая попытка. Тем не менее, он страдает от проблемы. Он принимает строки типа int a int b. Это происходит, когда ParamCommas является лямбдой. Проблема в том, что ParamCommas может быть лямбдой. - person devoured elysium; 07.03.2011
comment
@devoured: я этого не вижу. Какие производные вы используете, чтобы получить int a int b? ParamCommas будет либо лямбда, либо последовательность параметров, разделенных и заканчивающихся запятой. Таким образом, правило ParamCommas Param дает либо только Param (если ParamCommas — это лямбда), либо несколько параметров, разделенных запятыми. - person sepp2k; 07.03.2011

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

Param-> AB|lambda
A-> param
B->','paramB|lambda
person user2981413    schedule 12.11.2013