Создание лексического анализатора в Java - PullRequest
0 голосов
/ 23 июня 2010

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

Входными данными для лексического анализатора является файл .tex следующего формата.

\begin{document}

    \chapter{Introduction}

    \section{Scope}

    Arbitrary text.

    \section{Relevance}

    Arbitrary text.

    \subsection{Advantages}

    Arbitrary text.

    \subsubsection{In Real life}

    \subsection{Disadvantages}

    \end{document}

Выходными данными лексера должно быть оглавление, возможно, с номерами страниц в другомфайл.

1. Introduction   1
  1.1 Scope         1 
  1.2 Relevance     2  
    1.2.1 Advantages  2
       1.2.1.1 In Real Life  2
     1.2.2 Disadvantages   3 

Я надеюсь, что эта проблема в рамках лексического анализа .

Мой лексер прочитал бы файл .tex и проверил бы наличие '\', а при поиске продолжит чтение, чтобы проверить, действительно ли это одна из команд секционирования.Переменная flag установлена ​​для указания типа секционирования.Слово в фигурных скобках, следующее за командой секционирования, читается и записывается с префиксом с числом (например, 1.2.1) в зависимости от типа и глубины.

Я надеюсь, что вышеупомянутый подход будет работать для построения лексера.Как мне добавить номера страниц в оглавление, если это возможно в рамках лексера?

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

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

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

Это действительно зависит от вас. Поскольку это учебное упражнение, постарайтесь создать его так, как если бы кто-то другой использовал его. Насколько это удобно для пользователя? Создание чего-то, что только вы можете использовать, все еще хорошо для изучения концепции, но может привести к грязной практике, если вы когда-либо будете использовать это в реальном мире!

0 голосов
/ 24 июня 2010

То, что вы описываете, на самом деле представляет собой лексер плюс парсер.Задача лексического анализатора здесь - возвращать токены и игнорировать пробелы.Токенами здесь являются различные ключевые слова, введенные символом '\', строковые литералы внутри '{', '}' и произвольный текст в другом месте.Все остальное, что вы написали, это разбор и сборка деревьев.

...