#special-characters #quotation-marks #gf
#специальные символы #кавычки-знаки #gf
Вопрос:
Я пытаюсь разрешить двойные кавычки в функциях моей грамматики. Я надеялся, что смогу использовать соглашения Haskell для создания чего-то вроде:
> mkSentence "This is "just" a sentence"
> This is "just" a sentence
Однако, когда я пытаюсь использовать это в своей грамматике, я сталкиваюсь с ошибками, подобными приведенному ниже примеру с использованием английского RGL:
> cc -table ss "This is "just" a sentence"
constant not found: just
given Predef, Predef, CatEng, ResEng, MorphoEng, Prelude,
ParadigmsEng
A function type is expected for ss "This is " instead of type {s : Str}
0 msec
> cc -table ss "This is "just a sentence"
lexical error
0 msec
Я вижу, что src/common/ExtendFunctor.gf
в RGL есть реализация quoted
:
oper
quoted : Str -> Str = s -> """ s """ ; ---- TODO bind ; move to Prelude?
Я пытался реализовать что-то подобное, но "
может использоваться в разных частях моей грамматики, поэтому в идеале двойные кавычки можно было бы избежать без специальных привязок. Я рассматриваю возможность использования по умолчанию ”
, чтобы избежать проблем "
, но, может быть, есть способ избежать двойных кавычек «везде» (как в этих документах)?
Любые советы или ссылки на другие документы были бы очень признательны!
Ответ №1:
Насколько я знаю, нет функции API для обработки кавычек. Вы можете просто сделать что-то подобное самостоятельно:
oper
qmark : Str = """ ;
quote : Str -> Str = s -> qmark s qmark ;
И назовите это так:
> cc -one ss ("This is" quote "just" "a sentence")
This is "just" a sentence
Пока вы обрабатываете только строки, которые не являются токенами времени выполнения, все работает нормально.
Конечно, немного неуклюже писать это так, но вы всегда можете написать sed oneliner из вашего предпочтительного синтаксиса. Это работает только для одной «заключенной в кавычки» части, настраивайте по своему усмотрению.
$ sed -E 's/(.*) \"(.*)\" (.*)/("1" quote "2" "3")/'
this is "just" a sentence
("this is" quote "just" "a sentence")
this is "just" a sentence with "two" quoted words
("this is "just" a sentence with" quote "two" "quoted words")