Исходный текст программ на Java состоит из совокупности пробелов,
идентификаторов, литералов, комментариев, операторов, разделителей и ключевых
слов.
Что происходит в компиляторе с каждым из выделенных понятий? Что-то отсеивается или как-то видоизменяется?
Ответ
Обычная практика при написании компилятора — разделение его на части. Традиционно, первая часть — лексический анализ, деление исходного текста на лексемы. Это означает, что код читается как последовательность символов, и представляется в виде последовательности токенов
Токен состоит из типа токена и значения (упакованы в один класс).
При этом обычно пробелы (не являющиеся частью символьных/строковых литералов) отбрасываются, идентификаторы превращаются в токен типа «Идентификатор» со значением, равным строке с именем идентификатора. Литералы также превращаются в токены. Комментарии стадию лексического анализа обычно не проходят и просто отбрасываются. Разделители, наподобие скобок и знаков препинания, образуют каждый собственный тип токена. Ну и для ключевых слов тоже обычно выделяют по отдельному типу токена.
Пример:
Исходный текст
public class Example { // пример
public static void main(String[] args) {
System.out.println(/* этот текст будет напечатан*/"hello world");
}
}
производит такую последовательность лексических токенов:
[public-keyword] [class-keyword] [ident "Example"] [separator-left-brace] [public-keyword]
[static-keyword] [void-keyword] [ident "main"] [separator-left-paren] [ident "String"]
[separator-left-brack] [separator-right-brack] [ident "args"] [separator-right-paren]
[separator-left-brace] [ident "System"] [separator-dot] [ident "out"] [separator-dot]
[ident "println"] [separator-left-paren] [string-literal "hello world"]
[separator-right-paren] [separator-semicolon] [separator-right-brace] [separator-right-brace]
Дальнейшие фазы компиляции разобьют это на определения классов, функций, и операции, проверят соответствие имён, привяжут имена к объектам, проверят на осмысленность, проведут оптимизацию и скомпилируют в байт-код.
Лексический анализ — самая простая фаза компиляции.
Да, теоретически можно (а иногда и приходится) строить компиляторы, в которых лексический анализ по сути совмещён с последующими фазами компиляции. В принципе, ничто не заставляет выделять авторов компилятора отдельную фазу лексического анализа, но всё же это общепринятая практика.
Комментариев нет:
Отправить комментарий