Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2017, 10:37   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Лексические анализаторы (сканеры).

Стоит задача контроля передаваемой строки. Строка представляет собой набор различных действий разделенных запятой. Возможный вид строки:
a=ww ee, sd="as sd", pos("qw",Test)>0, a=1&b>3, q=words(U)
И так далее, то есть по сути это набор команд языка программирования.

В контроль входит:
* Учитывать, что запятая может находиться внутри команды s="we, tt", или быть частью функции pos("qw",Test)>0. То есть, взять и просто поделить входящий текст на части использую запятые как разграничители - нельзя.
* Проверка наличия обрамляющих кавычек. Например, команда a=ww ee , должна быть исправлена на a="ww ee". Одновременно с этим строка b="a=ww ee" имеет правильный формат.
* Нужно выделять присвоения sd=1, формулы q=words(U), логические операции a=1&b>3. А так же их составные части. Для анализа.
* Основная задача: контроль синтаксиса строки, с возможностью автоматической коррекции. Нужно различать указание функции (список заранее не известен), работу с переменными (основной список известен, но допускаться использование неизвестных имен) как напрямую, так и внутри функций или составных условий. Но подробности не нужны, нужно просто видеть, что функция (неважно какая) работает с такими переменными, или в этом составном условии (не важно каким) используется вот этот набор переменных.

И целый ряд дополнительных условий, как мне кажется нет смысла сейчас перечислять все.

Как я понимаю нужен лексический анализатор. Теорию я нашел (и запутался в ней), а вот рабочих примеров ни как найти не могу.

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

Особенно интересна методика деления входящей строки на составные части.
С уважением, Алексей.

Последний раз редактировалось tae1980; 23.04.2017 в 10:54.
tae1980 вне форума Ответить с цитированием
Старый 23.04.2017, 11:00   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А для чего это нужно?

Есть генераторы лексеров/парсеров типа ANTLR, надо только описать грамматику языка.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.04.2017, 11:54   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А для чего это нужно?
Есть генераторы лексеров/парсеров типа ANTLR, надо только описать грамматику языка.
Нужно для "общения" между моими скриптами написанными на языке Rexx.
Хочу усложнить формат передаваемых данных, и тут налетел на кучу неопределенностей и условий.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 23.04.2017, 17:44   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

для общения м-у разными языками и т.д. круто работает

Google Protobufs

описываете на этом языке формат сообщения, а дальше их компилятор делает код для нужного языка родной.
alexzk вне форума Ответить с цитированием
Старый 23.04.2017, 17:58   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вы предлагаете автору написать компилятор Protobuf?
Вряд ли кто-то сделал это для этого языка.

Да и круто или нет зависит от задачи.
В большинстве случаев и текстовые форматы (JSON, XML, ...) удобны.

Непонятно что за общение автору нужно.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.04.2017, 18:00   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Компилятор есть у гугла - protoc
Он работает чтук для 5-10 языков, для других, типа перла, есть поделки вполне рабочие.
Текстовые типа JSON хороши только для интерпретаторов с динамическими типами. В С++, например, это боль и страдание. Хотя, судя по количеству реализаций - боль у всех.
alexzk вне форума Ответить с цитированием
Старый 23.04.2017, 18:12   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

И в чём трудности?
Читаем первый символ. Определяем к каому классу лексем он относиться и вычитываем лексему. Если это кавычка то вычитываем всё пока не встретим вторую кавычку.
Если это цифра то вычитываем число. Если буква вычитываем слово.
Если это знак препинания вычитываем символ препинания(оператор).
Что касается восстановление кавычек, то делаете это вторым проходом. Если встретили "=" то ищите лексему с символом ",". И просто вставляет недостающие кавычке.
Вложения
Тип файла: zip SimvlerTest.zip (58.2 Кб, 13 просмотров)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 11.05.2017, 15:17   #8
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
И в чём трудности?
Читаем первый символ. Определяем к каому классу лексем он относиться и вычитываем лексему. Если это кавычка то вычитываем всё пока не встретим вторую кавычку.
Если это цифра то вычитываем число. Если буква вычитываем слово.
Если это знак препинания вычитываем символ препинания(оператор).
Что касается восстановление кавычек, то делаете это вторым проходом. Если встретили "=" то ищите лексему с символом ",". И просто вставляет недостающие кавычке.
Сложности для меня есть Спасибо за пример, полезный для изучения материал.
Но он делает полный анализ строки. А мне нужен только частичный, по сути только синтаксис.
Вопрос решился с использованием двух тезисов:
1. Делением строки на слова и разделители, и работой с последним словом. Разделители: символы логики, символы условий, арифметических действий, запятая и т.п. Все что не разделители - части слова. Посимвольно просматриваем строку и набирает текущее слово. Как только встретили разделитель, прекратили набор слова, приступили к анализу.
2. Введено понятие уровень. Начинаем разбор строки на 0 уровне, символы открывающие уровень (в моем случае): скобки ({ или кавычки ' ", символы закрывающие уровни: скобки )} или кавычки ' ". Если встретили запятую на 0 уровне, это разделитель условий, на других это разделитель слов. ВСЁ внутри кавычек - это часть текста.

Все очень просто. Написал нужный мне скрипт за два дня. Сейчас тестирую в различных ситуациях. Если есть интерес выложу результат.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сканеры уязвимостей AfiD Безопасность, Шифрование 1 28.09.2016 20:46
Грамматики, Синтаксические анализаторы, Парсеры Granus Обсуждение статей 5 27.06.2011 16:09
Анализаторы сетевых протоколов TDrive Софт 2 04.09.2009 06:32