lexor(1) FreeBSD General Commands Manual lexor(1) NAME lexor -- Готовит задание для оценки слова по списку слов со значениями. SYNOPSIS lexor [-fqvvv...] -o -выходной_файл [параметры_для_СС] входной_файл DESCRIPTION lexor предназначен для трансляции списка слов со значениями в структуру babolo_lexor в формате .c или .h файла. Входной файл состоит из: - секции заголовков, возможно пустой, для промежуточной трансляции. Текст этой секции не попадает в выходной файл. - необязательной строки `# LEXOR INCLUDE', где в качестве пробелов может быть произвольное количество пробелов и табуляций. - секции заголовков, возможно пустой. Текст отсюда попадает в резуль- тат трансляции и используется в промежуточной трансляции. - обязательной строки `# LEXOR BEGIN' где в качестве пробелов может быть произвольное количество пробелов и табуляций. - строки параметров создаваемой структуры. Эта строка должна непосред- ственно следовать за строкой `# LEXOR BEGIN'. В этой строке должны быть разделенные запятой 2 значения: - слова к типу создаваемой структуры babolo_lexor. Последнее из этих слов - имя создаваемой переменной, остальные слова - уточне- ния типа, такие, как static, const и т.п. - необязательное начальное значение флагов структуры. Если этого элемента нет, то и запятая не нужна. - строки (в смысле C) из 256 символов для перекодировки, может в файле занимать несколько строк, может отсутствовать. Обязательно следует непосредственно за предыдущей строкой без пустых строк между ними. - пустой строки - области описаний слов. В этой области могут быть комментарии (первый символ в строке `#') и пустые строки. Остальные строки состоят из 3х колонок: - флаг - 1 символ `0', может быть только в первой позиции строки, обозначает, что слово состоит из текста в третьей колонке строки, к которой в конец добавлен нулевой символ. Может отсутствовать - обязательное значение слова. - необязательное слово. Если нет, то это эквивалентно пустой строке, которая может быть дополнена флагом, если есть. Вполне возможно, что задание не определит все значения. Так, если есть в задании 2 слова с общим началом и нет в задании слова, совпадающего с этой общей частью, то образуется непредусмотренное значение. lexor при- писывает всем непредусмотренным словам значение 0. Это же значение при- писывается всем неопознанным словам, потому его имеет смысл использовать в качестве признака ошибки. Первый аргумент принимает сам lexor, если он состоит из минуса, за кото- рым есть по крайней мере одна буква. Буквы могут быть: - `q' - произвольное количество - `v' - произвольное количество - `f' - не более одной В regex это выглядит так: ^-([qv]*f?[qv]+|[qv]+f?[qv]*)$ Если первый аргумент не соответствует этому образцу, и если он не -o, то он передается транслятору в числе прочих аргументов. Наличие `f' в этих флагах обозначает, что форсируется Bpars_AABS независимо от того, что указано в файле задания. Остальные символы обрабатываются слева направо, `q' сбрасывает уровень болтливости до 0, `v' повышает этот уровень на 1. По умолчанию уровнь болтливасти 1, что обозначает выдачу сообщения по ошибке, которая приводит к прекращению исполнения только. На болтливость транслятора это не влияет, надо задавать аргументами транслятору. IMPLEMENTATION NOTES Во входном файле могут использоваться макросы и выражения C, потому из него делается файл, который отправляется на промежуточную трансляцию и сборку для определения конкретных значений всех выражений. В качестве транслятора используется `cc'. Результат трансляции содержит задание из входного файла в бинарном виде, из которого уже и строится дерево оценки. Все параметры запуска lexor, кроме -o и первого флага, если он состоит только из возможных символов `q', `v' и, возможно, одного `f', передаются транслятору. EXAMPLES Пример задания для создания .h файла: #include #include # LEXOR INCLUDE #define Eerr 0x00 #define E1 0x01 #define E2 0x02 #define E3 0x03 #define E4 0x04 #define E5 0x05 #define E6 0x06 #define E7 0x07 # LEXOR BEGIN const qvv, Bpars_CEND | Bpars_AABS 0 Eerr 0 E2 eeeee E3 eeeer E4 eer E5 eereeb #ebdghn E6 eereed E7 eereep В месте использования файла-результата перед ним должны стоять те же инклуды, что и здесь. Если результат должен быть самостоятельным .c фай- лом, то строка `# LEXOR INCLUDE' не нужна, и в результате будут необходи- мые инклуды. Пример вызова lexor: lexor -qf -Wall -pipe -I/usr/local/include -I. -o выход вход В качестве примера можно также посмотреть тест в дистрибутиве. DIAGNOSTICS По умолчанию при невозможности продолжать работу выводится сообщение об ошибке в stderr и возвращается ненулевой код завершения. Можно, повысив уровень болтливости, получить много больше. SEE ALSO babolo_testchar(3), babolo_testword(3), babolo_goword(3), babolo_getparm(3), sysexits(3), cc(1). AUTHOR Aleksandr A. Babaylov (aka @BABOLO) .@babolo.ru http://www.babolo.ru/ BUGS Взаимодействие с транслятором (какой в системе окажется) таит массу неожиданностей. Проверено со штатным транслятором в FreeBSD 4.11 Параметры для транслятора никак не проверяются ни сами по себе, ни на противоречие тем, что добавляются для получения результата трансляции в нужном виде. Не предусмотрен выбор транслятора с C, всегда берется `cc'. Нумерация строк через #line хорошо работает в преамбуле, но что делать в сгенеренной части? Поскольку промежуточный файл создается во временном каталоге, который, как правило, не совпадает с текущим, то совершенно естественный оператор #include "...h", если предполагается, что включаемый файл находится в текущем каталоге, работать как ожидается не будет, приходится -I. добав- лять. Документация ни к черту. 18 July 2007