На входе: перфокарты с текстом (ваариант: строки текст. файла)
На выходе: т н лексемы в виде их кодов.
При этом что называть "термминальными символами" я так и не понял:)
в той школе, что на мехмате (это какой-то вар-т (переосмысленной?) школы Вирта)
сканер - это Nextchr()
вход - текстовый файл со всякими переводами строк, табуляторами и иже с ними
выход: очередной символ ASCII curchar. Не "терминальный символ" , а ASCII
При этом как правило неск пробелов или пробел-табулятор-чтотоещётипа того преобразуются в ОДИН пробел ибо он в энтих всех языках синтаксически значимый.
То есть это НЕ для фортрана, где оператор кончается пустым концом перфокарты (или скажем CR LF), а типа алголов, где оператор кончается (или отделяется) ;
хотя переделать нет проблем, т к по трудоемкости Nextchr всего лишь как синт анализатор:)
Лексический анализатор - это NextLex()
на входе у него вызовы Nextchr() и получаемые от него curchar
на выходе ЛЕКСЕМЫ, иногда наз терминальными символами (не уверен, что это я назыв правильно) но неважно
Пример:
Из curchar-ов набралось слово ELSE или Else или еLse и т п
На выходе выдаем (curlex типа число) равное константе с именем ELSEW
(слово word Else)
На входе пусть набралось символами ASCII 200.5 далее не цифра и не E
На выходе тогда curlex принимает сначение FLOATW, а дополнительная переменная valueF принимает значение float 200.5 т е лекс. анализатор также и преобразовал текст в число.
и т п
и со значениямb соотв констант переменную curLex потом сравнивает синт анализатор
Синт анализатор - это механически переписанный на алголе синтаксис записанный в чем-то вроде бнф, как я уже посылал примеры.
Синт ан. требует след порцию текста программы (след лексему), вызывая Nextlex()
и в соотв местах если поступило НЕ то, чт нужно,
он выдает ошибку и например пролистывает NextLex()ом всё до ближайшей лексемы SEMICOLONW
если же форма оператора языка соблюдается, то в каждом месте оператора после прихода соотв лексемы (в т ч числа или строки или имени), в соотв точке программы (себя самого) он знает, что с ним делать (куда засунуть, например, в список или дерево) на выход.
На выходе у него список или дерево разобранной программы, от которой исх текста уже не осталось, а имеем какой-то полугенерерированный смысловой вид сотв интерпретации входного языка, как он задуман, и всё в кодах максимально удобно.
Спраш в задаче, а разбор числа, скажем -0.005E-12 - это задача лексич анализатора, или синтаксического? алгоритм разбора такой же, как в синт. анализаторе, т е по БНФ числа. Но это удобно опустить на уровень лекс. ан.
Также спрашивается, а если пришла лексема "IDENTW", то где проверять, переменая соотв идентификатору уже определена, м б ему дана память(!), прямо тут, в синт анализаторе, и например, если это неописанная переменная, то выдавать ошибку (синтаксическую? или какую?),
либо совать всё как есть в вых список, а разбираться потом.
либо тут где она возникла, её и создавать в теблице
Так вот, PASCAL придуман Виртом именно так, чтобы этот кусок (вообще-то генератора) совместить с синт анализатором, т е описания переменых строго предшеств их использованию, и не кто иной как синт. анализатор уже ЗАПИСАЛ этот идентификатор в соотв таблицу или что0то подобное и при повт появлении ищет там.
В этом смысле входной язык "однопроходный"
т е вых дерево (список) строится за один проход
если язык не столь удобен писателю транслятора, то и х с ним, можно доразобрать дерево потом
всё, что здесь описано, никаких концепций кроме взять такой-то ключ на 17, не содержит и с т зр програмирования тривиально, и даже занятно. Какой хошь язык, такой и разобрали.
что делать с разобранной программой, вопрос отдельный, куда её.
но это тоже вопрос чисто технический.
никакой науки здесь вообще нигде нет. это сантехника.
и всякий бред насчет языков которрые возможны без сканера или невозможны - бред тоже. не видел таких во вс сл на перфокартах совр смартфонов :)
Весь смысл в том, ЧТО ИМЕННО нам удобно на входе,
чтоб получить то, что нужно на выходе после генерации
и именно это и НУЖНО обсуждать и обдумывать, чтоб очертя голову не программировать всяку хрень.