2010-08-24 40 views
1

可能是我很想念的東西很簡單,但是有一個字符串在多行中出現什麼問題?爲什麼多行字符串有這樣奇怪的語法? (當他們這樣做)

舉例來說,Ruby是:

text = <<END 
    Some 
    text 
    END 

和Python是:

text = """ 
    Some 
    text 
""" 

和C#是:

string text = @" 
    Some 
    Text"; 

哪個更接近,但仍然需要@字符。

這有什麼錯用一行這樣的:

text = " 
    Some 
    text 
    " 

我覺得在這種情況下,字符串字面量可能結束,其中(「)單獨出現,這樣一來,如果引號中發現這樣,他們將被忽略。

text = " 
    He said "This is cool" 
    But it wasn't , until " 
" //<-- quote mark alone 

什麼原因(S)是爲了避免單引號多線串在許多編程語言,即Java的,JavaScript的,C#,C++,C,紅寶石,Python的文字?

+4

我不想爲最後一個例子寫一個解析器... – delnan 2010-08-24 20:56:06

+0

@delnan看起來像是有人做了它http://jashkenas.github.com/coffee-script/#heredocs – OscarRyz 2010-09-09 21:01:26

回答

2

我能想到一個特定的語法需要的唯一原因是因爲那麼你不必擔心逃逸角色。我不確定這是什麼原因,但它肯定是這個語法的一個優點。

當你必須定義你的語法時,最後一個例子有點問題,因爲你使用單個標記"做多個東西,這對於標準LALR(1)來說並不容易,在輸入中需要更多標記預測正確的使用規則。

有關LALR parser的更多信息。

+0

這甚至不是工作的解析器。字符串已經在掃描儀中處理得更好了。在實踐中,你永遠不會使用解析器來處理字符串。 – 2011-08-12 12:16:34

0

我懷疑這部分是爲了讓體面格式化。

在C或C++中,你總是可以將一個長字符串寫成一個長字符串,但是這會向右延伸,如果它繞過它會變得很難看。允許將其分解,可以更輕鬆地保持程序的格式不變。通常,C和C++程序不會大量使用多行字符串,以便更改語言以使其更加方便。

在字符串中明確顯示行尾等,並允許其保留周圍程序的格式通常很有用。能夠按照您想要的方式編寫文本字符串也是有用的,Ruby,Python和C#示例顯示了按照您希望的方式編寫文本多行字符串的方法。

您的建議侵入格式,很像Ruby和Python示例,並且看起來確實不是更好的解決方案。將這些字符串與普通字符串混淆起來會很容易,而Ruby和Perl HERE文檔和Python三重引用恰恰顯示了這些字符串的含義。

3

首先,這是一個令人恐懼的解析 - 這取決於語法的其餘部分有多簡單,這個單一的「便利功能」可能會使前端的數量級更加複雜。有關詳細信息,請參閱迪爾的答案。

另一個原因是,這樣的語法可能是危險的 - 忘記closung報價,你已經有了一個龐大的字符串和一個更小的方案;)

第三,不需要多行字符串常(特別是在跨越多行(如C和Python)連接相鄰字符串的語言中)。與上述缺點相比,它並沒有得到回報。

相關問題