2013-08-01 31 views
0

我一直試圖解析連接字符串,以便表達式也可以連接起來形成字符串。也就是,用於字符串連接的LALR語法

"No, " + 4*(6+5)/(8-4) + " is not equal to " + 75*1.3 + "." 

上面應該正確解析。問題是+導致轉換減少衝突。我一直在使用下面的語法;

<S> ::= <A> '+' <S> 
     | <A> 
<A> ::= <E> 
     |QUOT 
<E> ::= <T> '+' <E> 
     | <T> '-' <E> 
     | <T> 
<T> ::= <F> '*' <T> 
     | <F> '/' <T> 
     | <F> 
<F> ::= NUM 
     | '(' <E> ')' 

我還沒有在試圖找到一個語法其中+不會造成移位減少衝突的任何成功。我希望有一種方法來製作這種語法LALR,我真的很感謝一些幫助,試圖找到它。

回答

1

如果:

  1. 你不關心如何既+操作(添加或串聯)相連;和
  2. 你並不需要能夠使用左右字符串表達式括號,

然後有一個解決方案。我認爲這更像是一個智力活動,而不是一個實際的解決方案,部分原因是上述要求是高度限制性的,部分原因是我認爲你不應該使用具有兩種不同優先級的相同運營商。 (事實上​​,我沒有使用+進行連結的一大支持者。這足以不同,它值得自己的符號。)

以下解決方案的工作非常努力,以確保該字符串表達式是從算術表達式區分,這要求字符串表達式不能以(開頭。爲了避免過早減少級聯,它會使+的級聯版本與右側相關聯,而加法版本與常規左側關聯。

S : E '+' A 
    | E 
    | A 
    ; 

A : QUOT '+' S 
    | QUOT 
    ; 

E : E '+' T 
    | E '-' T 
    | T 
    ; 

T : T '*' F 
    | T '/' F 
    | F 
    ; 

F : NUM 
    | '(' E ')' 
    ; 
+0

是的,從實際的角度來看,我已經在考慮使用'。'或空字符串。但是我很好奇,如果語法中的某些內容可以被修改以允許使用LALR解析器進行解析。這個解決方案非常好,但我仍然很好奇;像JavaScript這樣的語言使用類似的字符串連接限制自己使用類似的LALR語法或他們使用別的東西嗎?謝謝你的幫助! – Rikonator

+0

@Rikonator:Javascript(據我所知,所有其他使用'+ +進行連接的語言)都使用與'+'相同的優先級,無論類型如何。因此,'「a」+ 2 + 2 +「b」'將評估爲「a22b」而不是「a4b」。特定的實現可以使用或不使用LALR(1)解析器,但是這樣的解析器相對容易構建。正如我所說的,試圖讓相同的操作符有兩個不同的綁定優先級,這很困難,而且可能是不明智的。 'awk'風格級聯(無操作符)可能也是不明智的。請參閱http://comments.gmane.org/gmane.comp.gnu.utils.bugs/17162。 – rici

+0

我明白了。謝謝你解釋得這麼好! – Rikonator