在Rascal中,爲什麼當在生產的可選部分的位置有佈局時,這會導致模糊性?例如。 "{ }"
模糊爲Start1
,而它從下面的語法中正確地解析爲Start2
,我希望它會完全相同。爲什麼圍繞生產的可選部分佈局造成歧義?
layout Layout = " "?;
start syntax Start1 = "{" "c"? "}";
start syntax Start2 = "{" "c" "}"
| "{" "}";
另外,我想知道是否有另一種方式來表示Start2
不重複比Start1
,不會導致同樣的不確定性。
很顯然這段代碼沒有大量的重複,Start2
在這裏是一個不錯的選擇,但這只是一個例子。我正在處理一個包含三個或四個可選部分的許多產品的語法,在最後一種情況下,顯示在Start2
中的符號已經需要複製產品的非可選部分2^4 = 16次,這在我的工作中真的很麻煩意見。
感謝您的詳細解答。當我看到語法如何擴展並且解決方案易於理解時,對我來說真的更有意義。儘管如此,我仍然覺得這有點奇怪。 當你不關心佈局的位置時,在問號(和星號)上有變體是否有用?我可以想象這會被使用很多。 –
是的,我們也考慮過這個問題。但渴望?或*很容易導致解析錯誤,這是非常意想不到的,很難調試。在這方面,解決歧義比分析錯誤更容易。聲明性的消歧也可能引入解析錯誤,但至少是明確可見的。不過,我們正在考慮在正則標記子語言的詞彙層面上引入渴望的語義,同時保持上下文無關的部分。未來的工作! – jurgenv