Написание компиляторов, лексический анализ? - PullRequest
4 голосов
/ 09 декабря 2010

Я совершенно новичок в написании компиляторов. Итак, я сейчас начинаю проект (написан на Java), и прежде чем писать код, я хотел бы узнать больше о лексическом анализе. Я исследовал в Интернете, я обнаружил, что большинство из них используют токенизаторы.

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

Ответы [ 2 ]

1 голос
/ 15 декабря 2010

Сопоставление регулярных выражений может быть простым и быстрым Расс Кокс - отличное введение в создание распознавателей с конечными автоматами. Он показывает, как перейти от регулярного выражения к недетерминированным конечным автоматам к детерминированным конечным автоматам. Его эталонная реализация использует направленный граф (аналогично связанному списку, но каждый узел может иметь более одной ссылки «вне» и может ссылаться на любой другой узел, включая себя) по сравнению со связанным списком. Есть и другие способы моделирования конечного автомата, включая:

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

  • идентификатор: [a-zA-Z] +
  • назначение: =
  • число: [0-9] +
  • ключевое слово: и

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

Примечание: эти шаги описывают лексер, который всегда возвращает максимально возможное совпадение. Вы также можете создать лексер, который возвращает токен, как только один из его компьютеров находится в состоянии принятия.

Результаты на входах образца:

  • a = 10: (идентификатор a) (присвоение =) (номер 10)
  • a = 10: неверно - пробелы в наших определениях токенов не принимаются
  • 25 = xyz: (номер 25) (присвоение) (идентификатор xyz)
  • 25and42: (число 25) (ключевое слово и) (число 42) - предполагается, что ключевое слово имеет приоритет над идентификатором
  • b = 1 + 2: неверно - '+' не принимается в наших определениях токенов
  • andx = 8: (идентификатор andx) (присваивание) (номер 8) - самое длинное совпадение дает нам (идентификатор andx) против (ключевое слово and) (идентификатор x)

Обратите внимание, что лексический анализ просто возвращает токены. Он не знает, правильно ли используются токены. «25 = xyz» может не иметь никакого смысла, но мы должны подождать до фазы анализа, чтобы знать наверняка.

В качестве дополнительного ресурса Дик Грун предлагает первое издание Методы синтаксического анализа - практическое руководство в виде Postscript и Pdf.

1 голос
/ 09 декабря 2010

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

Существует множество совпадений Google для " лексического анализа с использованием автоматов конечного состояния ". Чего не хватает?

У вас есть проблемы с пониманием того, как автоматы конечного состояния могут использоваться для лексического анализа? Или сам пишешь автомат? Это может помочь узнать, что они также известны как конечные автоматы (FSM)

Токенизатор вполне может использовать FSM во внутренних органах, поэтому я не понимаю, почему вы говорите, что должны использовать FSM, а не токенизатор - означает ли это, что вы не можете использовать написанный вами токенизатор и писать один сам?

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

lex (и его более недавнее соотношение flex ) - это лексические анализаторы, для которых доступен источник. Вы можете посмотреть на них за идеи

...