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;
문제는프로덕션 규칙 prod = (expr | expr ') * 형식의 sablecc에 대한 문제
clsdata = (clsfield|clsmethod)*;
clsdata = clsfield*;
clsdata = clsmethod*;
로 설정하면 잘 작동하지만, 상상할 수 있듯이, 내가 의도 한 것과 같은 의미입니다. 클래스가 메소드와 필드를 모두 허용하도록하고 싶습니다 (특정 순서없이!).
그래서 내 질문에 오류가 발생하지 않도록 clsdata
정의해야합니다. 재귀적인 대안을 생각할 수도 있지만, 가능한 한 깨끗하게 유지하고 싶습니다!
감사