Как использовать символы / знаки препинания в дискриминируемых союзах

Я пытаюсь создать размеченное объединение для части речевых тегов и других меток, возвращаемых анализатором естественного языка.

В C # / Java для них обычно используются строки или перечисления, но размеченные объединения кажутся более подходящими в F #, потому что это отдельные значения, доступные только для чтения.

В справочнике по языку я обнаружил, что этот символ ``...`` можно использовать для разграничения ключевых слов / зарезервированных слов. Это работает для

type ArgumentType =
| A0 // subject
| A1 // indirect object
| A2 // direct object
| A3 //
| A4 //
| A5 //
| AA //
| ``AM-ADV``

Однако теги содержат символы вроде $, например.

type PosTag =
| CC // Coordinating conjunction
| CD // Cardinal Number
| DT // Determiner
| EX // Existential there
| FW // Foreign Word
| IN // Preposision or subordinating conjunction
| JJ // Adjective
| JJR // Adjective, comparative
| JJS // Adjective, superlative
| LS // List Item Marker
| MD // Modal
| NN // Noun, singular or mass
| NNP // Proper Noun, singular
| NNPS // Proper Noun, plural
| NNS // Noun, plural
| PDT // Predeterminer
| POS // Possessive Ending
| PRP // Personal Pronoun
| PRP$ //$ Possessive Pronoun
| RB // Adverb
| RBR // Adverb, comparative
| RBS // Adverb, superlative
| RP // Particle
| SYM // Symbol
| TO // to
| UH // Interjection
| VB // Verb, base form
| VBD // Verb, past tense
| VBG // Verb, gerund or persent participle
| VBN // Verb, past participle
| VBP // Verb, non-3rd person singular present
| VBZ // Verb, 3rd person singular present
| WDT // Wh-determiner
| WP // Wh-pronoun
| WP$ //$ Possessive wh-pronoun
| WRB // Wh-adverb
| ``#``
| ``$``
| ``''``
| ``(``
| ``)``
| ``,``
| ``.``
| ``:``
| `` //not sure how to escape/delimit this

``...`` не работает для WP $ или символов вроде (

Кроме того, у меня есть интересная проблема, заключающаяся в том, что синтаксический анализатор возвращает `` как значимый символ, поэтому мне также нужно его избежать.

Есть ли другой способ сделать это, или это просто невозможно с дискриминированным объединением?

Прямо сейчас я получаю такие ошибки, как

  • Недопустимое пространство имен, модуль, тип или имя случая объединения
  • Дискриминированные случаи объединения и метки исключений должны быть идентификаторами в верхнем регистре.

Полагаю, я мог бы как-то переопределить toString для этих глупых случаев и заменить символы каким-нибудь буквенно-цифровым эквивалентом?


person Andrew Olney    schedule 16.06.2010    source источник
comment
Почему бы вам просто не использовать подходящее соглашение об именах, а не использовать литерал из парсера?   -  person Rune FS    schedule 19.06.2010


Ответы (2)


Спецификация не кажется ясной относительно того, какие символы могут быть экранированы двойным обратным апострофом в каком контексте.

Я думаю, что лучше всего использовать стандартные идентификаторы для случаев DU и переопределить ToString, как вы предлагаете.

person Brian    schedule 16.06.2010

По моему опыту, идентификаторы меток с двойным обратным апострофом полностью поддерживаются только в let Bindings или элементах типа. Это означает, что вы можете указать любую последовательность символов внутри (кроме символа @, который зарезервирован для кодогенерации F #).

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

Например. ., /, *, +, $, [, ], \ или & генерируют ошибку «Недопустимое пространство имен, модуль, тип или имя случая объединения».

person Stringer    schedule 17.06.2010