Productions
program = cls*;
cls = clsdef name openbrace clsdata closingbrace;
clsdata = (clsfield|clsmethod)*;
clsfield = [variabletype]:name [variablename]:name semi;
clsmethod = [returntype]:name [methodname]:name openmethodbrace closingmethodbrace openbrace closingbrace;
Проблема заключается в
clsdata = (clsfield|clsmethod)*;
Если я установлю clsdata
на
clsdata = clsfield*;
или на
clsdata = clsmethod*;
, она будет работать нормально,хотя, как вы можете себе представить, это не означает то же, что и я.Я хочу, чтобы класс допускал как методы, так и поля (в произвольном порядке!).
Так что мой вопрос в том, как мне определить clsdata
, чтобы я не получал ошибок.Я могу думать о рекурсивных альтернативах, но я бы хотел сохранить это как можно более чистым!
Спасибо