Поделиться через


Макросы значения GDL

Макросы значений используются для представления всего значения или его части. Они определяются в конструкции *Макросы. В одной конструкции можно определить несколько макросов.

Каждая запись в конструкции *Macros является отдельным макросом. Ключевое слово записи становится именем макроса значения, а значение записи — содержимым этого макроса значения. Имя макроса должно быть типом имени символа. Содержимое макроса значения может быть любым, что соответствует допустимому синтаксису GDL для значения.

Макросы значений могут ссылаться на другие макросы значений. Имя экземпляра конструкции *Macros может содержать тег, за которым следует формальный список аргументов, заключенный в круглые скобки. Любая ссылка на любой формальный аргумент в любом из определений макросов в конструкции *Macros символически заменяется соответствующим параметром, который передается при фактической ссылке на макрос значения.

Примечание Объявления и ссылки на аргументы, которые будут использоваться для передачи ссылок на макрос значения, имеют префикс со знаком равенства (=), чтобы означать, что тип аргумента является макросом значения. Все ссылки на макросы значений также имеют префикс со знаком равенства (=), чтобы обозначить ссылку на макрос значения, а не блок. Знак равенства должен сразу же следовать за именем макроса со значением, а промежуточные пробелы не допускаются. Ссылки на макросы значений могут вложить списки параметров на произвольную глубину.

Примеры макросов

Все определения макросов значений должны быть распознаны как полные, допустимые сущности значений.

В следующем примере кода показано, как использовать макросы значений.

*Macros:
{
    InvalidMacro: "First Half of a string
}

InvalidMacro недопустим, так как контекст строки в кавычках должен быть завершен двойными кавычками. Эта неуправляемая строка не является полным значением.

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

*Macros:
{
    FirstHalf: <BeginValue:Q>"This is the first half <EndValue:Q>
    SecondHalf:  <BeginValue:Q>of the string."<EndValue:Q>
}
*FullString: =FirstHalf=SecondHalf
*%  *FullString now expands to generate the complete string:
*FullString: "This is the first half of the string."

В следующем коде показано, как использовать аргументы макроса.

*Macros: FormalArgs(=arg1, =arg2)
{
result1: disappointed
result2: pleased
result3: impressed
result4: awestruck
result5: restrained


adverb1: very =arg1 and =arg2
   adverb2: while remaining =arg1
   String1:  The audience was =arg1 with today's performance.
}

В следующем коде показано, как использовать ссылки на макросы с параметрами.

*BadOutput: =String1(=result1)
*GoodOutput: =String1(=adverb1(=adverb1(=result2, =result3), =adverb2(=result5)))

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

*BadOutput: The audience was disappointed with today's performance.
*GoodOutput: The audience was very, very pleased and impressed and while remaining restrained with today's performance.

Ссылки на макросы значений распознаются не во всех контекстах значений. Например, макросы значений не распознаются в контекстах произвольного значения или строки в кавычках. Но макросы значений распознаются в контекстах шестнадцатеричной строки, которые могут находиться в контексте строки в кавычках.

Чтобы обеспечить обратную совместимость с GPD, знак процента (%) интерпретируется как то, что он вводит контекст параметра команды, когда знак процента используется в контексте значения не литерального пробела в содержимом определения макроса значения значения. Иными словами, избегайте использования знака процента в определении макроса значения, если только вы не определяете параметр команды или знак процента не содержится в контексте литерального пробела, например <Begin/EndValue>.

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

Средство синтаксического анализа должно думать о том, что он действует в одном входном потоке. При обнаружении ссылки на макрос вне определения макроса ссылка на макрос удаляется из входного потока и заменяется ее содержимым, а анализ входного потока продолжается с содержимым макроса.

Рассмотрим следующий макрос.

*Macros:
{
quote: <BeginValue:x>"<EndValue:x>
first_half: =quote This is enclosed
second_half:  by quotes.=quote
whole_string: =first_half <not a hex string!> =second_half
}
*Print1: =quote
*Print2: =first_half
*Print3: =second_half
*Print4: =whole_string

Предыдущий макрос будет развернут до следующего кода.

*Print1:  "
*Print2:  " This is enclosed
*Print3:  by quotes."
*Print4:  " This is enclosed <not a hex string!> by quotes."

Обратите внимание, что развернутый результат не является синтаксически законным GDL.