Я работаю над грамматикой Delphi в Rascal, и у меня возникают проблемы с разбором своего типа записи. Соответствующий раздел Delphi код может выглядеть следующим образом:Как удалить неоднозначность из этого фрагмента грамматики Delphi
record
private
a,b,c : Integer;
x : Cardinal;
end
Где «частный» может быть необязательным, и переменные строки декларации также могут быть необязательными.
Я попытался интерпретировать этот раздел, используя правила ниже:
syntax FieldDecl = IdentList ":" Type
| IdentList ":" Type ";"
;
syntax FieldSection = FieldDecl
| "var" FieldDecl
| "class" "var" FieldDecl
;
syntax Visibility = "private" | "protected" | "public"| "published" ;
syntax VisibilitySectionContent = FieldSection
| MethodOrProperty
| ConstSection
| TypeSection
;
syntax VisibilitySection = Visibility? VisibilitySectionContent+
;
syntax RecordType = "record" "end"
| "record" VisibilitySection+ "end"
;
Проблема неоднозначности. Весь текст между «записью» и «концом» можно разобрать в одном окне VisibilitySection, но каждая строка сама по себе также может быть отдельной визуализацией.
Я не могу изменить правила VisibilitySection к
syntax VisibilitySection = Visibility
| VisibilitySectionContent
;
Тогда грамматика больше не неоднозначная, но VisibilitySection становится плоская, нет вложенности больше вариабельных линий под необязательным «частным» узлом, который я бы предпочел.
Любые предложения по решению этой проблемы? То, что я хотел бы сделать, - потребовать самый длинный/жадный матч на символе VisibilitySectionContent + VisibilitySection.
Но изменение
syntax VisibilitySection = Visibility? VisibilitySectionContent+
в
syntax VisibilitySection = Visibility? VisibilitySectionContent+ !>> VisibilitySectionContent
не похоже на работу для этого.
Я также запустил инструмент отчета о неоднозначности на Rascal, но он не дает мне никаких сведений.
Любые мысли?
Благодаря
привет. Я не могу воспроизвести двусмысленность, потому что грамматика неполна. есть ли у вас ссылка на полное определение? – jurgenv
Обозначение '! >>' работает только с терминалами с правой стороны, например '! >>« private »' – jurgenv
Грамматика до сих пор находится по адресу: http://www.ilsmoija.nl/download/DelphiGrammar. rsc – Martijn