Библиотеки java для чего нужны

Библиотеки java для чего нужны

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

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

Встроенные классы

В языке Java все классы происходят от класса Object, и, соответственно, наследуют методы этого класса. Некоторые библиотеки классов подключаются автоматически, и мы будем называть их встроенными. К таким относится, в частности, библиотека с названием java.lang. Другие библиотеки классов вы должны подключать в исходном тексте приложения Java явным образом с помощью оператора import.

Замещающие классы

Очень часто в наших приложениях вместо базовых типов переменных мы будем использовать объекты встроенных классов, которые называются замещающими классами (wrapper classes). Ниже мы перечислили названия этих классов и названия базовых типов данных, которые они замещают:

Базовый тип данныхЗамещающий класс
booleanBoolean
charCharacter
intInteger
longLong
floatFloat
doubleDouble

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

Класс String

Класс String предназначен для работы с такими часто встречающимися объектами, как текстовые строки. Методы этого класса позволяют выполнять над строками практически все операции, которые вы делали раньше при помощи библиотечных функций C. Это преобразование строки в число и обратно с любым заданным основанием, определение длины строки, сравнение строк, извлечение подстроки и так далее.

Хотя в языке Java не допускается перезагрузка (переопределение) операторов, для объектов класса Stirng и объектов всех произошедших от него классов сделана встроенная перезагрузка операторов «+» и «+=». С помощью этих операторов можно выполнять слияние текстовых строк, например:

Здесь в качестве параметра функции println передается текстовая строка, составленная из трех компонент: строки «x = «, числа x и символа перехода на следующую строку ‘\n’. Значение переменной x автоматически преобразуется в текстовую строку (что выполняется только для текстовых строк) и полученная таким образом текстовая строка сливается со строкой «x = «.

Другие встроенные классы

Среди других встроенных классов отметим класс Math, предназначенный для выполнения математических операций, таких как вычисление синуса, косинуса и тангенса.

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

Библиотека встроенных классов содержит очень важные классы для работы с исключениями. Эти классы нужны для обработки ошибочных ситуаций, которые могут возникнуть (и возникают!) при работе приложений или аплетов Java.

Подключаемые библиотеки классов

Ниже мы кратко перечислим подключаемые библиотеки классов для того чтобы вы могли оценить возможности набора классов Java. Подробное описание этих классов есть в справочной системе Java WorkShop и в различной литературе, посвященной Java. Мы же ограничимся описанием тех классов, которые будем использовать в наших примерах приложений.

Библиотека классов java.util

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

Библиотека классов java.io

В библиотеке классов java.io собраны классы, имеющие отношение к вводу и выводу данных через потоки. Заметим, что с использованием этих классов можно работать не только с потоками байт, но также и с потоками данных других типов, например числами int или текстовыми строками.

Библиотека классов java.net

Язык программирования Java разрабатывался в предположении, что им будут пользоваться для создания сетевых приложений. Поэтому было бы странно, если бы в составе среды разработки приложений Java не поставлялась библиотека классов для работы в сети. Библиотека классов java.net предназначена как раз для этого. Она содержит классы, с помощью которых можно работать с универсальными сетевыми адресами URL, передавать данные с использованием сокетов TCP и UDP, выполнять различные операции с адресами IP. Эта библиотека содержит также классы для выполнения преобразований двоичных данных в текстовый формат, что часто бывает необходимо.

В качестве примера приложения, составленного на языке программирования Java и ориентированного на работу в сети Internet, можно привести игру Java Color Lines (рис. 7).

Библиотеки java для чего нужны. pic07sm. Библиотеки java для чего нужны фото. Библиотеки java для чего нужны-pic07sm. картинка Библиотеки java для чего нужны. картинка pic07sm.Рис. 7. Сетевая игра Java Color Lines.

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

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

Библиотека классов java.awt

Классы, входящие в состав библиотеки java.awt, предоставляют возможность создания пользовательского интерфейса способом, не зависящим от платформы, на которой выполняется аплет Java. Вы можете создавать обычные окна и диалоговые панели, кнопки, переключатели, списки, меню, полосы просмотра, однострочные и многострочные поля для ввода текстовой информации.

Библиотека классов java.awt.image

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

Источник

Разбор в Java: все инструменты и библиотеки, которые вы можете использовать

Если вам нужно проанализировать язык или документ из Java, есть три основных способа решения проблемы:

Использовать существующую библиотеку

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

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

Инструмент или библиотека для генерации парсера

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

Инструменты для создания парсеров

Генераторы синтаксических анализаторов (или комбинаторы синтаксических анализаторов) не являются тривиальными: вам нужно некоторое время, чтобы научиться использовать их, и не все типы генераторов синтаксических анализаторов подходят для всех типов языков. Именно поэтому мы подготовили список самых известных из них с кратким введением для каждого из них. Мы также концентрируемся на одном целевом языке: Java. Это также означает, что (обычно) сам парсер будет написан на Java.

Перечислить все возможные инструменты и библиотеки парсера для всех языков было бы довольно интересно, но не так полезно. Это потому, что будет слишком много вариантов, и мы все потеряемся в них. Концентрируясь на одном языке программирования, мы можем обеспечить сравнение между яблоками и помочь вам выбрать один вариант для вашего проекта.

Полезные сведения о парсерах

Чтобы убедиться, что этот список доступен для всех программистов, мы подготовили краткое объяснение терминов и понятий, с которыми вы можете столкнуться при поиске парсера. Мы не пытаемся дать вам формальные объяснения, но практические.

Структура парсера

Лексер и синтаксический анализатор работают последовательно: лексер сканирует входные данные и выдает совпадающие токены, анализатор сканирует токены и выдает результат синтаксического анализа.

Давайте посмотрим на следующий пример и представим, что мы пытаемся разобрать математическую операцию.

Парсер обычно объединяет токены, созданные лексером, и группирует их.

Сканеры без сканера отличаются тем, что обрабатывают непосредственно исходный текст вместо обработки списка токенов, созданных лексером.

Сейчас типично найти наборы, которые могут генерировать как лексер, так и парсер. В прошлом вместо этого было более распространенным объединять два разных инструмента: один для создания лексера и один для создания парсера. Это был, например, случай с почтенной парой lex & yacc: lex создал лексер, а yacc — парсер.

Дерево синтаксического анализа и абстрактное синтаксическое дерево

Есть два термина, которые связаны между собой, и иногда они используются взаимозаменяемо: дерево разбора и Abstract SyntaxTree (AST).

Концептуально они очень похожи:

В AST некоторая информация теряется, например, комментарии и символы группировки (круглые скобки) не представлены. Такие вещи, как комментарии, являются излишними для программы, а символы группировки неявно определяются структурой дерева.

Дерево разбора — это представление кода, более близкого к конкретному синтаксису. Он показывает много деталей реализации парсера. Например, обычно правила соответствуют типу узла. Они обычно преобразуются в AST пользователем с некоторой помощью генератора парсера.

Графическое представление AST выглядит следующим образом.

Библиотеки java для чего нужны. 2420d6d49aed74f528fd76c56b27779e. Библиотеки java для чего нужны фото. Библиотеки java для чего нужны-2420d6d49aed74f528fd76c56b27779e. картинка Библиотеки java для чего нужны. картинка 2420d6d49aed74f528fd76c56b27779e.

Иногда вы можете захотеть начать создавать дерево разбора, а затем получить из него AST. Это может иметь смысл, потому что дерево синтаксического анализа легче создать для синтаксического анализатора (это прямое представление процесса синтаксического анализа), но AST проще и легче обрабатывать с помощью следующих шагов. Под следующими шагами мы подразумеваем все операции, которые вы можете выполнять над деревом: проверка кода, интерпретация, компиляция и т. Д.

грамматика

Грамматика — это формальное описание языка, которое можно использовать для распознавания его структуры.

Простыми словами, это список правил, которые определяют, как каждая конструкция может быть составлена. Например, правило для оператора if может указывать, что оно должно начинаться с ключевого слова «if», за которым следуют левая скобка, выражение, правая скобка и оператор.

Правило может ссылаться на другие правила или типы токенов. В примере оператора if ключевое слово «if», левая и правая скобки были типами токенов, а выражение и оператор — ссылками на другие правила.

Леворекурсивные правила

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

Рассмотрим для примера арифметические операции. Дополнение может быть описано как два выражения (ий), разделенных символом плюс (+), но выражение также может содержать другие дополнения.

Это описание также соответствует множественным сложениям, таким как 5 + 4 + 3. Это потому, что его можно интерпретировать как выражение (5) (‘+’), выражение (4 + 3). И тогда само 4 + 3 можно разделить на две составляющие.

Проблема в том, что такого рода правила не могут быть использованы с некоторыми генераторами синтаксического анализатора. Альтернативой является длинная цепочка выражений, которая учитывает также приоритет операторов.

Некоторые генераторы парсеров поддерживают прямые леворекурсивные правила, но не косвенные.

Типы языков и грамматик

Обычно какому-то языку соответствует один и тот же вид грамматики. То есть существуют регулярные грамматики и контекстно-свободные грамматики, которые соответствуют соответственно обычным и контекстно-свободным языкам. Но чтобы усложнить ситуацию, существует относительно новый (созданный в 2004 году) вид грамматики, называемый грамматикой синтаксического анализа (PEG). Эти грамматики столь же мощны, как и контекстно-свободные грамматики, но, по словам их авторов, они более естественным образом описывают языки программирования.

Различия между PEG и CFG

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

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

Традиционно и PEG, и некоторые CFG были не в состоянии справиться с леворекурсивными правилами, но некоторые инструменты нашли обходные пути для этого. Либо путем изменения основного алгоритма синтаксического анализа, либо с помощью инструмента, автоматически переписывающего леворекурсивное правило нерекурсивным способом. Любой из этих способов имеет свои недостатки: либо делает сгенерированный парсер менее понятным, либо ухудшает его производительность. Однако на практике преимущества более простой и быстрой разработки перевешивают недостатки.

Генераторы парсеров

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

Обычно вам нужна библиотека времени выполнения и / или программа, чтобы использовать сгенерированный парсер.

Обычный (Лексер)

Инструменты, которые анализируют обычные языки, как правило, лексеры.

JFlex

JFlex — генератор лексического анализатора (лексера), основанный на детерминированных конечных автоматах (DFA). Лексер JFlex сопоставляет входные данные в соответствии с определенной грамматикой (называемой спецификацией) и выполняет соответствующее действие (встроенное в грамматику).

Он может использоваться как самостоятельный инструмент, но будучи генератором лексера, предназначен для работы с генераторами синтаксического анализатора: обычно он используется с CUP или BYacc / J. Он также может работать с ANTLR.

Типичная грамматика (спецификация) разделена на три части, разделенные символом «%%»:

Файл спецификации JFlex

Без контекста

Давайте посмотрим инструменты, которые генерируют парсеры без контекста.

ANTLR

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

Типичная грамматика разделена на две части: правила лексера и правила парсера. Деление является неявным, поскольку все правила, начинающиеся с заглавной буквы, являются правилами лексера, а правила, начинающиеся со строчной буквы, являются правилами синтаксического анализатора. В качестве альтернативы грамматики лексера и синтаксического анализатора могут быть определены в отдельных файлах.

Очень простая грамматика ANTLR

Если вы заинтересованы в ANTLR, вы можете заглянуть в этот гигантский учебник ANTLR, который мы написали.

Он может генерировать парсеры в C / C ++, Java и JavaScript. Поддержка последнего языка кажется превосходной и более современной: она имеет несколько дополнительных функций и выглядит более обновленной. Фактически в документации говорится, что она разработана так, чтобы иметь внешний вид JavaScript RegExp.

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

Грамматика APG очень чистая и понятная.

BYACC / Дж

BYACC — это Yacc, который генерирует код Java. Вот и вся идея, и она определяет ее достоинства и недостатки. Хорошо известно, что это позволяет легче конвертировать Yacc и C-программу в Java-программу. Хотя вам, очевидно, все еще нужно преобразовать весь код C, встроенный в семантические действия, в код Java. Еще одним преимуществом является то, что вам не нужно отдельное время выполнения, сгенерированный парсер это все что вам нужно.

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

Типичная грамматика состоит из трех разделов, разделенных «%%»: ДЕКЛАРАЦИИ, ДЕЙСТВИЯ и КОД. Второй содержит правила грамматики, а третий — пользовательский код пользователя.

Кокосовый / Р

Coco / R — это генератор компиляторов, который принимает атрибутированную грамматику и генерирует сканер и парсер рекурсивного спуска. Приписанная грамматика означает, что правила, написанные в варианте EBNF, могут быть аннотированы несколькими способами для изменения методов сгенерированного синтаксического анализатора.

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

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

Грамматика Coco / R выглядит следующим образом.

Коко / R грамматика

Coco / R имеет хорошую документацию с несколькими примерами грамматики. Он поддерживает несколько языков, включая Java, C # и C ++.

CookCC

CookCC — это генератор парсера LALR (1), написанный на Java. Грамматики можно указывать тремя разными способами:

Уникальной особенностью является то, что он также может выводить грамматику Yacc. Это может быть полезно, если вам нужно взаимодействовать с инструментом, поддерживающим грамматику Yacc. Как какая-то старая программа на C, с которой вы должны поддерживать совместимость.

Для генерации парсера требуется Java 7, но он может работать на более ранних версиях.

Типичный парсер, определенный с аннотациями, будет выглядеть следующим образом.

Для стандарта генераторов синтаксического анализатора, использующего аннотации Java, это особый выбор. По сравнению с такой альтернативой, как ANTLR, между грамматикой и действиями, безусловно, нет четкого разделения. Это может усложнить поддержку синтаксического анализатора для сложных языков. Также портирование на другой язык может потребовать полного переписывания.

С другой стороны, этот подход позволяет смешивать грамматические правила с действиями, выполняемыми при их сопоставлении. Кроме того, он имеет преимущество в том, что интегрируется в IDE по вашему выбору, поскольку это просто код Java.

КРУЖКА

CUP — это аббревиатура построения полезных анализаторов, и это генератор синтаксических анализаторов LALR для Java. Он просто генерирует правильную парсерную часть, но он хорошо подходит для работы с JFlex. Хотя очевидно, что вы также можете создать лексер вручную для работы с CUP. Грамматика имеет синтаксис, похожий на Yacc, и позволяет встраивать код для каждого правила.

Он может автоматически генерировать дерево разбора, но не AST.

У него также есть плагин Eclipse, который поможет вам в создании грамматики, поэтому он имеет собственную IDE.

Типичная грамматика похожа на YACC.

Grammatica

Grammatica является генератором синтаксического анализатора C # и Java (компилятор компилятора). Он читает файл грамматики (в формате EBNF) и создает хорошо прокомментированный и читаемый исходный код C # или Java для синтаксического анализатора. Он поддерживает грамматику LL (k), автоматическое восстановление после ошибок, читаемые сообщения об ошибках и четкое разделение между грамматикой и исходным кодом.

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

Типичная грамматика Grammatica состоит из трех разделов: заголовок, токены и продукция. Это также чисто, почти столько же, сколько ANTLR. Он также основан на аналогичном Extended BNF, хотя формат немного отличается.

Jacc похож на BYACC / J, за исключением того, что он написан на Java, и поэтому он может работать везде, где может работать ваша программа. Как правило, он разработан как более современная версия Yacc. Автор описывает небольшие улучшения в таких областях, как сообщения об ошибках, модульность и поддержка отладки.

Если вы знаете Yacc и у вас нет базы кода для обновления, это может быть отличным выбором.

JavaCC

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

По сравнению с ANTLR файл грамматики намного менее чист и содержит много исходного кода Java.

Благодаря своей длинной истории он используется в важных проектах, таких как JavaParser. Это оставило некоторые странности в документации и использовании. Например, технически сама JavaCC не создает AST, но поставляется с инструментом, который делает это, JTree, поэтому для практических целей это так.

ModelCC

ModelCC — это генератор синтаксических анализаторов на основе модели, который отделяет спецификацию языка от языковой обработки [..]. ModelCC получает концептуальную модель в качестве входных данных вместе с ограничениями, которые ее аннотируют.

В практическом плане вы определяете модель вашего языка, которая работает как грамматика в Java, используя аннотации. Затем вы передаете ModelCC созданную вами модель для получения анализатора.

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

Существует четкое описание намерений авторов инструментов, но ограниченная документация. Тем не менее, есть доступные примеры, включая следующую модель калькулятора, частично показанную здесь.

SableCC

SableCC — это генератор синтаксических анализаторов, созданный для дипломной работы и имеющий целью быть простым в использовании и предлагая четкое разделение между грамматикой и кодом Java. Версия 3 также должна предлагать готовый способ пройти AST с помощью посетителя. Но это все в теории, потому что практически нет документации, и мы не знаем, как использовать любую из этих вещей.

Кроме того, версия 4 была запущена в 2015 году и, по-видимому, заброшена.

UrchinCC

Urchin (CC) — это генератор парсера, который позволяет вам определить грамматику, называемую определением парсера Urchin. Затем вы генерируете парсер Java из него. Urchin также генерирует посетителя из UPD.

Существует исчерпывающее руководство, которое также используется для объяснения работы Urchin и ее ограничений, но оно ограничено.

UPD разделен на три раздела: терминалы, токен и правила.

После парсеров CFG пришло время увидеть парсеры PEG, доступные на Java.

балдахин

Canopy — это компилятор парсера, ориентированный на Java, JavaScript, Python и Ruby. Он берет файл, описывающий грамматику синтаксического анализа, и компилирует его в модуль синтаксического анализа на целевом языке. Сгенерированные парсеры не имеют зависимости во время выполнения от самого Canopy.

Это также обеспечивает легкий доступ к узлам дерева разбора.

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

Грамматика навеса с действиями

Файл Java, содержащий код действия.

Laja — это двухфазный генератор синтаксического анализатора обратного отслеживания без поддержки сканера с поддержкой правил грамматики во время выполнения.

Laja — генератор кода и генератор синтаксического анализатора, и он в основном предназначен для создания внешних DSL. Это означает, что у него есть некоторые особенности. С Laja вы должны указать не только структуру данных, но и то, как данные должны отображаться в структуры Java. Эти структуры обычно являются объектами иерархической или плоской организации. Короче говоря, он позволяет очень легко анализировать файлы данных, но он менее подходит для универсального языка программирования.

Параметры Laja, такие как выходной каталог или входной файл, задаются в файле конфигурации.

Грамматика Лая разделена на раздел правил и раздел отображения данных. Похоже на это.

Мышь — это инструмент для преобразования PEG в исполняемый синтаксический анализатор, написанный на Java.

Он не использует packrat и, следовательно, он использует меньше памяти, чем обычный PEG-парсер (руководство явно сравнивает мышь с крысами!).

У него нет хранилища грамматики, но есть грамматики для Java 6-8 и C.

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

Крысы!

Крысы! является частью генератора синтаксического анализатора xtc (eXTensible Compiler). Он основан на PEG, но использует «дополнительные выражения и операторы, необходимые для генерации реальных анализаторов». Поддерживает леворекурсивное производство. Он может автоматически генерировать AST.

Требуется Java 6 или более поздняя версия.

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

Parser Combinators

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

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

Jparsec

Jparsec — это порт библиотеки парсек Haskell.

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

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

Типичный парсер, написанный на jparsec, похож на этот.

Парсер калькулятора с Jparsec

обданный кипяток

Parboiled предоставляет реализацию синтаксического анализатора PEG с рекурсивным спуском, которая работает с указанными вами правилами PEG.

Цель Parboiled — предоставить простой в использовании и понять способ создания небольших DSL в Java. Он оказался между простым набором регулярных выражений и генератором парсера промышленного уровня, таким как ANTLR. Пропаркованная грамматика может включать действия с пользовательским кодом, включенным непосредственно в код грамматики или через интерфейс.

Пример парофилированного парсера

Он не создает AST для вас, но предоставляет дерево разбора и некоторые классы, чтобы упростить его построение.

Документация очень хорошая, она объясняет особенности, показывает пример, сравнивает идеи, стоящие за этим, с другими вариантами. В репозитории есть несколько примеров грамматик, в том числе для Java.

PetitParser

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

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

Выдержка из файла примера грамматики для JSON.

Пример грамматики PetitParser

Выдержка из примера файла определения синтаксического анализатора (который определяет действия для правил) для JSON.

Файл определения парсера для PetitParser

Существует версия, написанная на Java, но есть также версии на Smalltalk, Dart, PHP и TypeScript.

Документация отсутствует, но есть примеры доступных грамматик.

Библиотеки Java, которые разбирают Java: JavaParser

Быстрый список возможностей:

Будучи убеждена? Вы все еще хотите написать свой собственный анализатор Java для Java?

Резюме

Разбор в Java — это широкая тема, и мир парсеров немного отличается от обычного мира программистов. Вы найдете лучшие инструменты, поступающие непосредственно из научных кругов, что, как правило, не относится к программному обеспечению. Некоторые инструменты и библиотеки были запущены для дипломной работы или исследовательского проекта. Плюс в том, что инструменты, как правило, легко и свободно доступны. Недостатком является то, что некоторые авторы предпочитают иметь хорошее объяснение теории того, что делают их инструменты, а не хорошую документацию о том, как их использовать. Кроме того, некоторые инструменты заканчиваются тем, что авторы заканчивают работу над магистром или доктором наук.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *