2010-12-18 96 views
2

我有一種語言與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沒有操作)來解決歧義。如果解析器會報告語法錯誤,那將會更好。也許這可以在合併替代作品時完成。真正的問題是它們重疊而不是合併:如果發生這種情況,程序解析可能會爆炸。

回答

1

我最近有一個頂級短語的類似問題,其中一些需要在前一個短語中終止;;,而其他的(不是以短語介紹關鍵字開頭)。我通過將短語的句法範疇分成兩部分來解決我的問題,並對錶達此行爲的短語序列給予了很好的規則。但是這導致了分裂語法的重複。

在你的情況下,它會是這樣的:

sequence: 
    | (s00 | s10) sequence_closed 
    | (s01 | s11) sequence_open 
    | ε 

sequence_closed: 
    | s10 sequence_closed 
    | s11 sequence_open 
    | ';' sequence_open 
    | ε 

sequence_open: 
    | s00 sequence_closed 
    | s01 sequence_open 
    | ε 

,如果你想允許多餘的分隔符(和你最想)這是一個比較複雜一點,但是這是想法。

+0

啊..嗯..除了醜陋的事實,我有頂級列表與內部列表相同的語法,所以我不得不復制重複..這實際上看起來相當不錯。我不想爲語言中的每個「列表像結構」這樣做,但真正的關注點是使語句級語法看起來更清晰:純粹是美學或嫉妒(如果Haskell和Ocaml可以離開,而沒有我想要的分隔符以及:) – Yttrill 2010-12-18 22:25:28

+0

BTW:「;;」事情表明你是MLing,所以考慮到頂級文本不能提升到你必須使用單個「;」的功能相反:在Ocaml這很糟糕!支持「;;」的唯一理由是爲了REPL強制執行「;」不會。 – Yttrill 2010-12-18 22:28:26