|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.04.2017, 10:37 | #1 |
Форумчанин
Регистрация: 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. |
23.04.2017, 11:00 | #2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
А для чего это нужно?
Есть генераторы лексеров/парсеров типа ANTLR, надо только описать грамматику языка.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
23.04.2017, 11:54 | #3 | |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Хочу усложнить формат передаваемых данных, и тут налетел на кучу неопределенностей и условий.
С уважением, Алексей.
|
|
23.04.2017, 17:44 | #4 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
для общения м-у разными языками и т.д. круто работает
Google Protobufs описываете на этом языке формат сообщения, а дальше их компилятор делает код для нужного языка родной. |
23.04.2017, 17:58 | #5 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Вы предлагаете автору написать компилятор Protobuf?
Вряд ли кто-то сделал это для этого языка. Да и круто или нет зависит от задачи. В большинстве случаев и текстовые форматы (JSON, XML, ...) удобны. Непонятно что за общение автору нужно.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
23.04.2017, 18:00 | #6 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Компилятор есть у гугла - protoc
Он работает чтук для 5-10 языков, для других, типа перла, есть поделки вполне рабочие. Текстовые типа JSON хороши только для интерпретаторов с динамическими типами. В С++, например, это боль и страдание. Хотя, судя по количеству реализаций - боль у всех. |
23.04.2017, 18:12 | #7 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
И в чём трудности?
Читаем первый символ. Определяем к каому классу лексем он относиться и вычитываем лексему. Если это кавычка то вычитываем всё пока не встретим вторую кавычку. Если это цифра то вычитываем число. Если буква вычитываем слово. Если это знак препинания вычитываем символ препинания(оператор). Что касается восстановление кавычек, то делаете это вторым проходом. Если встретили "=" то ищите лексему с символом ",". И просто вставляет недостающие кавычке.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
11.05.2017, 15:17 | #8 | |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Но он делает полный анализ строки. А мне нужен только частичный, по сути только синтаксис. Вопрос решился с использованием двух тезисов: 1. Делением строки на слова и разделители, и работой с последним словом. Разделители: символы логики, символы условий, арифметических действий, запятая и т.п. Все что не разделители - части слова. Посимвольно просматриваем строку и набирает текущее слово. Как только встретили разделитель, прекратили набор слова, приступили к анализу. 2. Введено понятие уровень. Начинаем разбор строки на 0 уровне, символы открывающие уровень (в моем случае): скобки ({ или кавычки ' ", символы закрывающие уровни: скобки )} или кавычки ' ". Если встретили запятую на 0 уровне, это разделитель условий, на других это разделитель слов. ВСЁ внутри кавычек - это часть текста. Все очень просто. Написал нужный мне скрипт за два дня. Сейчас тестирую в различных ситуациях. Если есть интерес выложу результат.
С уважением, Алексей.
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сканеры уязвимостей | AfiD | Безопасность, Шифрование | 1 | 28.09.2016 20:46 |
Грамматики, Синтаксические анализаторы, Парсеры | Granus | Обсуждение статей | 5 | 27.06.2011 16:09 |
Анализаторы сетевых протоколов | TDrive | Софт | 2 | 04.09.2009 06:32 |