Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #1
19.03.2008 15:29

Eten
Участник (+9, -307)
Откуда: Балаково, Санкт-Петербург.
Зарегистрирован: 21.05.2007
Сообщений: 1416
Вебсайт

---

Базовый класс не прямого анализатора

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

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

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

Нужно учитывать некоторые ньюансы.

Во-первых, перед запуском лексического анализатора (именно для него и создан данный класс), присвоить текущей строке ноль, а столбцу -1 и не трогать в процессе лексического разбора переменную тек. поз., т.о. устанавливается начальная позиция пера для считывания первого символа.

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

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

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

Данного объяснения на мой взгляд достаточно для тех, кто уже имел дело с анализатора вх.кода или хотя бы читал о них.

Неактивен

0    0    #2
19.03.2008 15:56

Gesperid
Участник
Зарегистрирован: 25.02.2005
Сообщений: 106

Re: Базовый класс не прямого анализатора

Eten написал:

...Много букофф...

А не проще выложить интерфейс класса?

Отредактировано Gesperid (19.03.2008 15:56)

Неактивен

Powered by PunBB
© copyright 2001–2026 iFiction.Ru