Skip to content

Commit

Permalink
Актуализация документации: нет лексера среди компонентов (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mazdaywik committed Oct 19, 2019
1 parent 6d63342 commit 35f395f
Showing 1 changed file with 0 additions and 145 deletions.
145 changes: 0 additions & 145 deletions docs/4-libraryex-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,6 @@
Компиляция синтаксического дерева в код на Си — компонент `R05-Generator`
-------------------------------------------------------------------------

**Компонент зависит от `LibraryEx`, `Refal5-AST` и `Refal5-Plainer`.**

В этом компоненте всего две похожие функции

<R05-Generate-ToFile (e.OutputFile) e.Tree> == пусто
Expand All @@ -100,152 +98,9 @@
вторая возвращает сгенерированный текст как последовательность строк.


Лексический анализ Рефала-05 — компонент `R05-Lexer`
----------------------------------------------------

**Компонент зависит от `LibraryEx`.**

### Функции `R05-LexScan-File` и `R05-LexScan-String`

<R05-LexScan-File e.SourceName>
== e.Tokens
e.Tokens ::= (s.TokType t.SrcPos e.Info)*
t.SrcPos ::= (s.Row s.Col)

(использует LoadFile → файл № 39)

<R05-LexScan-String e.String> == e.Tokens

e.String ::= s.CHAR*

Обе функции выполняют синтаксический анализ. Функция `R05-LexScan-File`
загружает сканируемый текст из файла, функция `R05-LexScan-String` анализирует
указанную строку.

Функция `R05-LexScan-File` читает файл при помощи `LoadFile`, а значит,
использует файл № 39. Позиции токенов соответствуют актуальным позициям в файле.

Функция `R05-LexScan-String` устанавливает позиции токенов такими, какими они
были бы, если бы текст был сохранён в файле.

Позиция записывается как пара чисел — номер строки и номер колонки. Табуляция
считается за одну колонку.

### Типы токенов

s.TokType e.Info ::=
TkChar s.CHAR
| TkClose s.Bracket
| TkCloseBlock
| TkComma
| TkEEnum
| TkEOF
| TkEntry
| TkEnum
| TkError e.Message
| TkExtern
| TkName e.Name
| TkNumber s.NUMBER
| TkOpen s.Bracket
| TkOpenBlock
| TkReplace
| TkSemicolon
| TkUnexpected e.BadCharacters
| TkVariable s.Mode e.Index

s.Bracket ::= Bracket | CallBracket
e.Message, e.Name, e.SourceName, e.BadCharacters, e.Index ::= s.CHAR+
s.LineNo ::= s.NUMBER
s.Mode ::= 's' | 't' | 'e'

<Mu s.TokType e.Info> == s.CHAR*

*$EENUM Bracket, CallBracket

Каждый токен записывается как скобочный терм, содержащий имя функции — тип
токена, его позицию и атрибут токена (для большинства он пустой).

Каждый токен может быть вызван как функция — в результате он вернёт своё
текстовое представление (с одним исключением).

Лексическая структура Рефала-05 описана в [приложении B][B], здесь мы только
опишем, чему соответствуют имена функций `Tk…`. Итак

* ключевые слова:
* `$EXTERN` — `TkExtern`,
* `$ENTRY` — `TkEntry`,
* `$ENUM` — `TkEnum`,
* `$EENUM` — `TkEEum`,
* открывающая скобка — `TkOpen`, атрибут указывает на тип скобки:
* `Bracket` — `(`,
* `CallBracket` — `<`,
* закрывающая скобка — `TkClose`, атрибут указывает на тип скобки:
* `Bracket` — `)`,
* `CallBracket` — `>`,
* остальные знаки пунктуации `,`, `;`, `=`, `{`, `}` это соответственно
`TkComma`, `TkSemicolon`, `TkReplace`, `TkOpenBlock`, `TkCloseBlock`,
* имя — `TkName`, атрибут — имя функции как последовательность литер,
* целое число — `TkNumber`, атрибут — его значение как число,
* литера — `TkChar`, атрибут — литера,
* переменная — `TkVariable`, атрибут — тип и индекс переменной,
* служебные токены `TkEOF`, `TkError`, `TkUnexpected`.

`TkEOF` атрибута не имеет, возвращается лексером при достижении конца ввода
(конца файла для `R05-LexScan-File` или конца строки `R05-LexScan-String`).
Вызов `TkEOF` порождает комментарий `/* end of file */`.

`TkError` возвращается лексером при обнаружении лексической ошибки (после неё
восстанавливается и продолжает разбор). Атрибут — сообщение об ошибке. Вызов
`<TkError e.Message>` порождает строку `'[LEXER ERROR: ' e.Message ']'`.

`TkUnexpected` возвращается при обнаружении неожиданных символов во входном
потоке. Если неожиданных символов несколько, соседние токены `TkUnexpected`
склеиваются в один. Атрибут — неожиданные символы. Вызов токена как функции
`<TkUnexpected e.BadCharacters>` просто вернёт эти символы — так сделано для
получения взаимно-обратного конвертирования исходного файла (см. функцию
`R05-LexDump` ниже).

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

### Функция `StrFromToken`

<StrFromToken s.TokType e.Info> ::= e.HumanReadableRep
e.HumanReadableRep ::= s.CHAR*

Функция возвращает человекочитаемое представление токена, которое можно
использовать, например, в сообщениях об ошибке. В текущей реализации она
вызывает сам токен, как функцию, за исключением `TkUnexpected` — она
форматирует его как сообщение об ошибке.

### Функция `R05-LexDump`

<R05-LexDump e.Tokens> == s.CHAR*

Функция преобразует последовательность токенов в исходный текст на Рефале-05.

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

Если исходная последовательность токенов была корректной — в ней не встречались
`TkError` и `TkUnexpected`, результат преобразования также будет корректной
программой на Рефале-05 (но не на общем подмножестве). Если в ней встречались
только `TkUnexpected`, то в дампе некорректные символы восстановятся на «своих
местах». `TkError` распечатываются в некорректную строчку с сообщением
об ошибке `[LEXER ERROR: message]`, из-за чего результат преобразования тоже
останется некорректным.


Синтаксический анализ Рефала-05 — компонент `R05-Parser`
--------------------------------------------------------

**Компонент зависит от `LibraryEx`, `Refal5-AST` и `R05-Lexer`.**

В этом компоненте три похожие функции:

<R05-Parse-File e.SourceFile>
Expand Down

0 comments on commit 35f395f

Please sign in to comment.