2009-11-30 2 views
3

Я строй своего собственного языка с помощью Flex, но я хочу знать некоторые вещи:Зачем использовать Lexical Analyzers?

  • Почему я должен использовать лексические анализаторы?
  • Они что-то помогут мне?
  • Обязательны ли они?
+1

Домашнее задание вопрос? –

+0

Конечно, нет, я не занимаюсь занятиями. –

+0

+1 Por ser brasileiro como eu **;) ** –

ответ

5

Лексический анализ помогает упростить синтаксический анализ, поскольку лексемы можно рассматривать как абстрактные сущности, а не конкретные последовательности символов.

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

+0

Можете ли вы показать пример кода без простоты Flex? –

1

Вы должны использовать лексический анализатор, потому что вы можете использовать BNF (или EBNF) для описания вашего языка (грамматики) декларативно, а затем просто использовать парсер для анализа программы, написанной на вашем языке, и получить ее в структуре в памяти, а затем свободно манипулировать им.

Это не обязательно, и вы можете, конечно, написать свое собственное, но это зависит от того, насколько сложным является язык и сколько времени вы должны изобретать заново.

Кроме того, тот факт, что вы можете использовать язык (BNF) для описания вашего языка без изменения самого лексического анализатора, позволяет сделать много экспериментов и изменить грамматику вашего языка, пока у вас не будет именно то, что оно работает для вас ,

+2

Вы можете написать свой собственный лексер, да. Однако, чтобы сделать это * правильно *, как flex, быстро и эффективно, вы должны проверять каждого персонажа на каждом персонаже в этой позиции маркера в своей грамматике один за другим, пока не будет признан один (и только один). Реализация такого конечного автомата наиболее эффективно выполняется при широком использовании gotos. Это может быть хорошо для тех, кто знает, что они делают на простой грамматике, но в целом такие вещи лучше всего оставлять на инструментах. –

+0

@ T.E.D. Согласен. Вот почему я сказал: «... сколько времени вам нужно изобретать за руль». Во всяком случае, я, конечно, не призываю кого-то написать что-то подобное с нуля. – Petros

3

Каждый раз, когда вы преобразовываете входную строку в строки, разделенные пробелами и/или числовые значения, вы выполняете лексический анализ. Запись каскадных рядов операторов else if (strcmp (..)==0) ... считается лексическим анализом. Даже такие неприятные инструменты, как sscanf и strtok, - это инструменты лексического анализа.

Вы хотели бы использовать такой инструмент, как гибкий вместо одного из выше для одной из нескольких причин:

  • Обработка ошибок может быть сделано намного лучше.
  • Вы можете быть более гибкими в том, что разные вещи вы узнаете с помощью flex. Например, трудно правильно разобрать значение в шестнадцатеричном формате C с помощью подпрограмм scanf. scanf в значительной степени должен знать значение шестнадцатеричного значения. Лекс может понять это для вас.
  • Сканеры Lex быстрее. Если вы разбираете большое количество файлов и/или больших, это может стать важным.
Смежные вопросы