我有一種語言與4種語句:s00,s01,s10,s11其中領先的1意味着初始關鍵字,尾隨1意味着終止,我有一個分隔符「;」。我可以用「;」來終止任何陳述。我想解析一個允許最少使用「;」的語句列表。解析器是Dypgen,它是GLR +。解析列表與最小分隔符
例子:
{ x=1 fun f(){} x=1; x=1 var x=1 var x=1; x=1 }
是否有可能做到這一點呢?如果是這樣,怎麼樣?如果不是,爲什麼?
我相信不能這樣做,主要是因爲我想不起如何去做:) 但是它看起來似乎是上下文敏感的:規則是你必須插入一個「;」在A和B之間如果A沒有終止並且B沒有被啓動,則對於B和C同樣意味着B被使用兩次。
但是因爲解析器是GLR +很是誘人,只需使用
(s00|s01|s10|s11}*
的規則,如果它misparses在拋出「;」 (這是一個s11沒有操作)來解決歧義。如果解析器會報告語法錯誤,那將會更好。也許這可以在合併替代作品時完成。真正的問題是它們重疊而不是合併:如果發生這種情況,程序解析可能會爆炸。
啊..嗯..除了醜陋的事實,我有頂級列表與內部列表相同的語法,所以我不得不復制重複..這實際上看起來相當不錯。我不想爲語言中的每個「列表像結構」這樣做,但真正的關注點是使語句級語法看起來更清晰:純粹是美學或嫉妒(如果Haskell和Ocaml可以離開,而沒有我想要的分隔符以及:) – Yttrill 2010-12-18 22:25:28
BTW:「;;」事情表明你是MLing,所以考慮到頂級文本不能提升到你必須使用單個「;」的功能相反:在Ocaml這很糟糕!支持「;;」的唯一理由是爲了REPL強制執行「;」不會。 – Yttrill 2010-12-18 22:28:26