2012-03-24 86 views
3

我正在閱讀F#規範 - 我找到的最新規範 - 找到了here - 努力學習可以說是艱難方式的語言。在部分「3.6符號關鍵字」的規範規定:F#規範符號運算符VS符號關鍵字

下列符號或部分符號字符序列被作爲關鍵字處理:

token symbolic-keyword = 
    let! use! do! yield! return! 
    | -> <- . : () [ ] [< >] [| |] { } 
    ' # :?> :? :> .. :: := ;; ; = 
    _ ? ?? (*) <@ @> <@@ @@> 

在下一節中,「3.7符號算,它表示:

用戶定義的和庫定義的符號運算符是如下所示的字符序列,除非字符序列是ymbolic關鍵字(§3.6)。

regexp first-op-char = !%&*+-./<=>@^|~ 
regexp op-char = first-op-char | ? 
token quote-op-left = 
    | <@ <@@ 
token quote-op-right = 
    | @> @@> 
token symbolic-op = 
    | ? 
    | ?<- 
    | first-op-char op-char* 
    | quote-op-left 
    | quote-op-right 

我可能會丟失一些東西很明顯,但在我看來,該規範指出,運營商/關鍵字?@>@@><@<@@都是象徵性的關鍵字和符號運算符。那麼......他們是哪一個?我如何知道天氣使用符號關鍵詞標記或符號運算符標記?

由於提前, 布蘭登

編輯要清楚,我想知道爲什麼說明書陳述象徵性的運營商可以說明,他們不能被後立即這些符號。

+0

你想知道/做什麼?知道文檔中的確切定義本身沒有用處。 – Brian 2012-03-24 05:22:15

+0

@Brian:我發現,編程一個解析器是一種很好的方式來獲得編程語言的親密知識,當我用C#嘗試它。然而,我開始後悔與F#一樣,它的規範使C#版本看起來清晰明瞭。 – aboveyou00 2012-03-24 15:26:10

回答

3

幫助回答這個問題的概念是keyword。關鍵字是reserved word。同時檢查你的龍書。

保留的字基本上是不能由程序員被用作標識符的字,在這種情況下,例如如果一個字,或操作員如- >。換句話說,如果您嘗試使用「let(if)=」或「let(- >)=」,您將因爲使用保留字而出現錯誤。

對於這個問題解釋3.6節,這些是F#使用的關鍵字。 3.7節的規定,你可以創建自己的操作符,只要它們遵循這些規則,並且與3.6節中的一個保留關鍵字不一樣。

所以,如果你想創建操作- >你可以,但你不能創建操作- 「?那麼......哪一個是他們」>

要回答你的問題它們是關鍵字,它們是由系統定義的運算符,它們不能用作用戶定義的運算符。

EDIT

讓我們來在此從不同的方向。所有詞法分析器規則都由分析器規則調用。很容易找到符號操作規則的用法,即操作名稱,但查找符號關鍵字,您會發現「例如34 ..後過濾到兩個令牌:一個int和一個符號關鍵字, - ..‖。「很有幫助,但它並沒有回答你的問題,現在你想知道爲什麼有一個解析器規則沒有調用的詞法分析器規則,我不知道這是規範而不是正式的語法定義。在F# source你可能會發現規範和語法不匹配,換句話說,規範是爲了幫助你理解語言,我不會將它用作建立編譯器的一組權威規則

把規範放在汽車上,規格告訴你你可以期望從汽車中獲得什麼,汽車應該如何運作,或者參數的限制如何,它不會告訴你如何製造汽車

如果我正在編寫一個編譯器,我會解釋34 ..的情況,不要爲sy創建令牌首次傳遞mbolic-keywords,但是使用後期處理將其過濾爲適當的標記。換句話說,第二遍重寫令牌流。如果是我,我會在使用它構建編譯器之前驗證規範是完整的語法。但是如果你想要按下,那麼我可能會跳過第一遍中尋找符號關鍵字,並且在第一遍中創建令牌流後使用流重寫。

如果您想了解有關F#中令牌過濾的更多信息,請參閱規範第15部分「詞法過濾」;它通過重寫標記流給出了light語法如何轉換爲常規語法的下降說明。

+0

@GuyCoder,這不是問題中的語法所說的,至少如果我讀得對的話。 – svick 2012-03-24 19:20:36

+0

有了這個新的編輯,我相信這足以讓我回答我的問題。謝謝你的答案。 – aboveyou00 2012-03-25 21:45:43