F # Спецификация Символический оператор VS Символическое ключевое слово - PullRequest
3 голосов
/ 24 марта 2012

Я читаю в спецификации 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

Возможно, я упускаю что-то очевидное, но мне кажется, что в спецификации говорится, что операторы / ключевые слова ?, @>, @@>, <@ и <@@ являются как символическими ключевыми словами, так и символическими операторами.Итак ... кто они?Как узнать погоду, чтобы использовать токен символьного ключевого слова или токен символического оператора?

Заранее спасибо, Брэндон

РЕДАКТИРОВАТЬ Чтобы было ясно, я хочу знатьпочему в спецификации говорится, что символические операторы могут быть этими символами сразу после заявления о том, что они не могут быть.

1 Ответ

3 голосов
/ 24 марта 2012

Концепция, которая помогает ответить на этот вопрос - ключевое слово . Ключевым словом является зарезервированное слово . Также проверьте свою книгу Дракона.

Зарезервированное слово - это слово, которое программист не может использовать в качестве идентификатора, в данном случае это слово, например , если , или оператор, такой как -> . Другими словами, если вы попытаетесь использовать «let ( if ) =» или «let ( -> ) =», вы получите ошибку, потому что вы используете зарезервированное слово.

Для этого вопроса следует интерпретировать Раздел 3.6 как, это ключевые слова, зарезервированные для использования F #. Раздел 3.7 as, вы можете создавать свои собственные операторы, если они следуют этим правилам и не совпадают с одним из зарезервированных ключевых слов в разделе 3.6.

То есть, если вы хотите создать оператор -> , вы можете, но вы не можете создать оператор ->

Чтобы ответить на ваш вопрос "Так ... кто они?" Они являются ключевыми словами и являются операторами, определенными системой, их нельзя использовать как определяемые пользователем операторы.

EDIT

Давайте посмотрим на это с другой стороны. Все правила лексера вызываются правилами парсера. Легко найти использование правила symbolic-op, то есть op-name, но ищите символическое ключевое слово, и вы обнаружите, что «например, 34 .. постфильтрованы по двум токенам: одному int и одному symbolic-ключевому слову, - ..‖ «. Полезно, но оно не отвечает на ваш вопрос, и теперь вы задаетесь вопросом, почему существует правило лексера, которое не вызывается правилом синтаксического анализатора. Я не знаю, это спецификация, а не формальное определение грамматики. Если вы посмотрите на F # источник , вы можете обнаружить, что спецификация и грамматика не совпадают, как вы хотели бы. Другими словами, спецификация предназначена для того, чтобы помочь вам понять язык, я бы не стал использовать его в качестве окончательного набора правил для построения компилятора.

Если указать спецификацию в терминах или автомобилях, спецификации скажут вам, что вы можете ожидать от машины, как должен функционировать автомобиль, или ограничения для параметра, в нем не сказано, как построить машину.

Если бы я писал компилятор, я бы интерпретировал случай 34 .. чтобы не создавать токены для символических ключевых слов при первом проходе, а использовать постобработку, чтобы отфильтровать их в соответствующие токены. Другими словами, переписать поток токенов за второй проход. Если бы это был я, я бы проверил, что спецификация является полной грамматикой, прежде чем использовать ее для построения компилятора. Однако, если вы хотите нажать на, то я бы, вероятно, пропустил поиск символических ключевых слов на первом проходе и использовал бы перезапись потока после того, как поток токенов был создан на первом проходе.

Если вы хотите больше узнать о фильтрации токенов в F #, см. Раздел 15 спецификации «Лексическая фильтрация»; он дает поясняющее объяснение того, как легкий синтаксис преобразуется в обычный синтаксис путем перезаписи потока токенов.

...