我正在研究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"
;
問題是含糊不清。 「record」和「end」之間的整個文本可以在單個VisibilitySection中解析,但是每一行本身也可以是一個單獨的VisibilitySection。
我可以改變規則VisibilitySection到
syntax VisibilitySection = Visibility
| VisibilitySectionContent
;
然後語法不再是模糊的,但VisibilitySection變得平坦,沒有嵌套了一個可選的「私人」節點下的變線,我更喜歡。
有關如何解決此問題的任何建議?我想要做的是在VisibilitySection的VisibilitySectionContent +符號上請求最長/最貪婪的匹配。
但改變
syntax VisibilitySection = Visibility? VisibilitySectionContent+
到
syntax VisibilitySection = Visibility? VisibilitySectionContent+ !>> VisibilitySectionContent
似乎並沒有對這項工作。
我也在Rascal上運行了歧義報告工具,但它沒有提供任何見解。
有什麼想法?
感謝
嗨。由於語法不完整,我無法重現歧義。你有沒有提到完整的定義? – jurgenv
'!>>'表示法只適用於右側的終端,如'!>>「private」' – jurgenv
迄今爲止的語法位於:http://www.ilsmoija.nl/download/DelphiGrammar。 rsc – Martijn