Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Лексический анализатор 
:(
    Опции темы
Alexandr507
Дата 9.3.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.7.2009

Репутация: нет
Всего: -1



Доброго времени суток.

в университете задали такую задачку написать

Цитата

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

Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, констант 0 и 1, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.

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

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

Цитата

bool y = true || false;
bool z = true ^ false ^ true;

int x = false; 



нажимаю enter  и запускается код который обрабатывает  введенное выражение и если есть то находит ошибки указывая их тип. например   тут будет ошибка

Цитата

int x = false;  нельзя присвоить логическое значение к типу int

 Нужно описать все эти правила в коде?  чтобы программа находила ошибки типа и т п

Цитата

 x === y;
x = y'

собственно то чем занимается компилятор когда подчеркивыает значение и высвечивает тип ошибки..Что то типа Сканера

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

ps - я вижу эту программу довольно длинной с тщательным описанием возможных ситуаций..просто может быть существует какой то иной прием

Это сообщение отредактировал(а) Alexandr507 - 9.3.2010, 16:07
PM MAIL   Вверх
Dims
Дата 10.3.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



Если я правильно помню, что такое "лексический анализ" smile

Нужно читать текст посимвольно, и написать "распознаватель" для каждой лексемы. "Распознаватель" может быть в виде отдельной функции или блока в одной, большой, функции. Задача распознавателя -- сдвинуть текущую позицию чтения на длину найденной лексемы. Если распознаватель не сдвинул позицию, значит, он не опознал лексему. Внешний блок или отдельная функция должны просто по очереди пробовать каждый распознаватель и если не подошёл ни один, то выдавать ошибку. 

Пример ошибки, который ты привёл (int x = false), это не лексическая ошибка, а синтаксическая. Твоя программа не должна находить такие ошибки, так как лексически тут всё правильно. Точно так же, твоя программа не должна проверять парность скобок и т.п. Она просто должна преобразовать массив типа "char" в массив типа "лексема".

А вот здесь (x === y;) есть и лексическая ошибка, так как лексемы === не существует.
PM MAIL   Вверх
Sveta12
Дата 15.1.2013, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



Цитата(Alexandr507 @ 9.3.2010,  15:33)
Доброго времени суток.

в университете задали такую задачку написать

Цитата

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

Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, констант 0 и 1, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.

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

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

Цитата

bool y = true || false;
bool z = true ^ false ^ true;

int x = false; 



нажимаю enter  и запускается код который обрабатывает  введенное выражение и если есть то находит ошибки указывая их тип. например   тут будет ошибка

Цитата

int x = false;  нельзя присвоить логическое значение к типу int

 Нужно описать все эти правила в коде?  чтобы программа находила ошибки типа и т п

Цитата

 x === y;
x = y'

собственно то чем занимается компилятор когда подчеркивыает значение и высвечивает тип ошибки..Что то типа Сканера

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

ps - я вижу эту программу довольно длинной с тщательным описанием возможных ситуаций..просто может быть существует какой то иной прием

Подскажите пожалуйста, вот тоже необходимо написать лексический анализатор на C#, для языка VB. описала все кроме комментарий, в VB только однострочные и начитаютмя либо с ' либо со слова REM. вот именно ошибка как задать, что комментарий...вот код:

  pattern = "['|REM][\"[^]\"[с]]/[.]*";
            foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))
            {
                tmp = new MToken();
                tmp.text = match.Value; tmp.LexClass = "Com"; tmp.pos = match.Index; tmp.Spec = "Comment"; tmp.len = match.Length;
                list.Add(tmp);
                input = input.Remove(tmp.pos, tmp.len);
                string str = new String(' ', tmp.len);
                input = input.Insert(tmp.pos, str);
            }

т.е первая строчка, надо правильно описать, что идет ' или REM, далее все что угодно до конца строки.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0722 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.