3

私はF#仕様(ここで見つけた最新のもの)を読んでいて、間違いなく難しい方法で言語を学ぶ努力をしています。「3.6シンボリックキーワード」のセクションでは、仕様に次のように記載されています。

次のシンボリックまたは部分的にシンボリックな文字シーケンスは、キーワードとして扱われます。

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

次のセクション「3.7シンボリック演算子」では、次のように述べています。

ユーザー定義およびライブラリ定義のシンボリック演算子は、文字のシーケンスがシンボリックキーワード(§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

明らかな何かが欠けているかもしれませんが、仕様には、演算子/キーワード、、、、、およびが?両方とも記号キーワードであり、記号演算子であると記載されているようです。それで...彼らはどれですか?シンボリックキーワードトークンまたはシンボリック演算子トークンを使用する天気を知るにはどうすればよいですか?@>@@><@<@@

よろしくお願いします、ブランドン

編集明確にするために、シンボリック演算子がこれらのシンボルになることができないと述べた直後に、シンボリック演算子がこれらのシンボルになることができると仕様が述べている理由を知りたいです。

4

1 に答える 1

3

この質問に答えるのに役立つ概念はキーワードです。キーワードは予約語です。ドラゴンの本もチェックしてください。

予約語は基本的に、プログラマーが識別子として使用できない単語です。この場合は、ifなどの単語、または->などの演算子です。つまり、「let(if)=」または「let(->)=」を使用しようとすると、予約語を使用しているため、エラーが発生します。

この質問では、セクション3.6を次のように解釈します。これらはF#で使用するために予約されているキーワードです。セクション3.7として、これらのルールに従い、セクション3.6の予約済みキーワードの1つと同じでない限り、独自の演算子を作成できます。

したがって、演算子を作成する場合は->できますが、演算子を作成することはできません->

あなたの質問に答えるために「それで...彼らはどれですか?」これらはキーワードであり、システムによって定義された演算子であり、ユーザー定義の演算子として使用することはできません。

編集

これを別の方向から見てみましょう。すべてのレクサールールはパーサールールによって呼び出されます。symbolic-opルール、つまりop-nameの使用法を見つけるのは簡単ですが、symbolic-keywordを探すと、「34..などが2つのトークンにポストフィルタリングされます。1つはint、もう1つはsymbolic-keywordです。 ..‖。」役に立ちましたが、それはあなたの質問に答えません。そして今、あなたはなぜパーサールールによって呼び出されないレクサールールがあるのか​​疑問に思っています。わかりません。これは仕様であり、正式な文法定義ではありません。F#ソースを見ると、仕様と文法が希望どおりに一致していないことがわかります。言い換えれば、仕様は言語を理解するのに役立つことを意図しており、コンパイラを構築するための決定的なルールのセットとしては使用しません。

スペックを用語または車で表すと、スペックは、車に何を期待できるか、車がどのように機能するか、またはパラメーターの制限を示しますが、車の製造方法は示しません。

コンパイラーを作成している場合、34 ..の場合を解釈します。つまり、最初のパスでシンボリックキーワードのトークンを作成せず、後処理を使用して適切なトークンにフィルターで除外します。つまり、2回目のパスでトークンストリームを書き換えます。私の場合は、コンパイラを構築するために使用する前に、仕様が完全な文法であることを確認します。ただし、押し続けたい場合は、最初のパスでシンボリックキーワードの検索をスキップし、最初のパスでトークンストリームが作成された後にストリームの書き換えを使用します。

F#でのトークンフィルタリングについて詳しく知りたい場合は、仕様のセクション15「字句フィルタリング」を参照してください。トークンストリームを書き換えることにより、ライト構文が通常の構文にどのように変換されるかについての詳細な説明を提供します。

于 2012-03-24T12:27:01.020 に答える