Рубрики
Без рубрики

Как создать язык, используя ANTLR4 и Java

В этом посте научу вас, как создать язык, не программирования, используя ANTLR4 в Java. С тегом java, синтаксический анализатор, antlr4, учебное пособие.

При разработке любой инструмент, вы topará с неблагодарное задание написать парсер. Я использовал термин неблагодарное, потому что сначала это может показаться легким, но потом вы увидите, что это очень сложным.

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

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

Анализаторы решить проблемы, если понимать Формальный Язык, но мы должны понимать, что каждый.

Естественный Язык

Давайте сначала начать через которые мы узнаем в первую очередь. Естественный язык является, что мы пытаемся учить, чтобы мой сын 1 год и полтора года 👶 . Из-за воздействия экранов, он просто разрабатывает других языков, прежде чем что будет главным в вашей жизни. Он уже понимает русский, включает в себя несколько песен, может напевать…. Но не может говорить еще. Только мама и папа, но еще не связывает говорите о нем вещи. Он связывает звук наши вещи. Странно, не?

Но это так, для понимания нашей. У нас есть звуки, говоришь, фонемы, etc… Они существуют, несмотря на то, что грамматики. Грамматика служит основой, служит для создания общий язык, где все мы можем быть поняты.

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

У нас есть многочисленные Языки, Естественная в мире:

  • Музыка ➡️ Партитура
  • Говорит ➡️: русский, Английский, Испанский, etc….
  • UX ➡️ мобильное Приложение, Веб-Приложение, etc…

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

Хотите знать, как обработка Естественного Языка. Поиск RNN или LSTM .

Формальный Язык

Несмотря на использование одного и того же слова, Формальный язык это совершенно другое Естественного . Язык Формальной имеет цели, будь то отдавать приказы машине или обмена информацией между системами.

Теперь не знаю, заметили ли вы главное отличие: Формальных Языков сделаны, чтобы быть понятым Машин .

Вы можете иметь веру, которая в Технологии, но большая разница в том, что никогда не наступит розе вычислительных систем, как Формальных Языков не принимают неологизмы. Или язык следует строго по binômio грамматика и синтаксис, или она не состоится. Компилятор не понимает, то, что за пределами того, что вы уже знаете.

Да, и какие Формальных Языков, известных:

  • C
  • C++
  • Java
  • XML
  • brainfuck!!! День изучу brainfuck!!!

Следует Привет, мир, эм, засранец:

+[-[<<[+[--->]-[<<<]]]>>>-]>-.---.>..>.<<<<-.<+.>>>>>.>.<<.<-.

Да, больше, потому что мне нужен новый язык? Хорошо, до этого нужна необходимость. Я закончил тем, что развивается в дом в последние дни в качестве упражнения. Необходимо было: на совещании, всех ненавидит, JMeter.

Причина всех ненавидящих JMeter было очевидно, JMeter использует XML в качестве Языка и XML-это просто Язык, для хранения информации, она не предназначена для того, чтобы обрабатывать тесты.

Так что я сделал это упражнение: Как бы один Язык Тесты?

Примечание : это упражнение и есть и другие языки, для Тестирования. Но мало заменяют, что JMeter делает…

С этого момента я буду ссылаться на этот язык, который я разрабатываю, как PlainTest .

Представить

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

Для PlainTest , я себе два базовых величин:

  • Люкс : – Это объединение упорядоченного действия или апартаменты. Служит логической группировки. Будет CriarUsuário .
  • O Step : – Это únidade основные Испытания, то есть реализации его. Выполнить команду, отправить Запрос HTTP, etc…

Именно мой первый пример PlainTest :

Suite UserTest {
    HTTP CreateUser {
        url   : "http://127.0.0.1"
        method: "POST"
        body  : """
                   {
                       "id": 123,
                       "firstName": "John",
                       "lastName" : "Doe"
                   }
                """
        assert responseCode Equals 200
    }
}

Извлечь

Представить, грамматика, необходимо извлечь из него некоторую информацию: его лексики и грамматики. Для этого нам понадобится Формальный Язык, и поэтому мы выбираем ANTLR4 . O ANTLR4 имеет собственной грамматики, где разработчик может объявить грамматики и лексики языка.

Лексикон

Давайте определим, грубо Лексикон, или при распознавании лексем, как идентифицировать каждый элемент Языка.

Так же можем установить в нашем языке:

  • Зарезервированные слова: Люкс , утверждать
  • Идентификатор: Служит для идентификации элементов
  • Номер: да, количество….
  • String: “да”, string…
  • MultilineString: String значение """ , который не требует побег .

Для определения Token в ANTLR4, нужно установить определить с большой буквы:

grammar TestSuite;

STRING : DQUOTE (ESC | ~["\\])* DQUOTE;

VERB: 'Contains' | 'Equals';

IDENTIFIER: [A-Za-z] [._\-A-Za-z0-9]*;

NUMBER: '-'? INT '.' [0-9]+ EXP? | '-'? INT EXP | '-'? INT;

fragment DQUOTE: '"';

fragment ESC: '\\' (["\\/bfnrt] | UNICODE);

fragment UNICODE: 'u' HEX HEX HEX HEX;

fragment HEX: [0-9a-fA-F];

fragment INT: '0' | [1-9] [0-9]*; // no leading zeros

fragment EXP: [Ee] [+\-]? INT; // \- since - means "range" inside [...]

// Just ignore WhiteSpaces
WS: [ \t\r\n]+ -> skip;

В грамматике выше, определим лишь некоторые маркеры. Обратите внимание, что есть и Маркеры, и фрагменты. Нет ANTLR4, org fragment должен быть использован, потому что идентификатор не принимает состоит из идентификаторов, он должен состоять из чего-то подобного регулярного выражения и фрагменты.

Синтаксический

Когда я говорю о] в ANTLR4, говорю, грамматика сама по себе, правила. В нашем случае мы будем создавать следующие значения:

  • Suite: Состоит из Люксов и Steps
  • Step: Единицей test
  • Attribute: пары Ключ/Значение
  • Assertion: пары Ключ/Значение
  • Значение: Um valor que pode ser де Атрибут вашего утверждения.

Каждое правило, таким будет Parser Rule в грамматику ANTLR4. В определении грамматики они различаются по первой букве. Лексикон-это большой буквы, в то время как Синтаксический крошечный. Впоследствии мы увидим разницу на практике.

Ниже пример, как будет выглядеть наше Люкс определена:

grammar TestSuite;

suite:
    'Suite' IDENTIFIER '{'
        (suite | step)* 
    '}'
;

step:
    IDENTIFIER IDENTIFIER '{'
        (assertion | attribute)* 
    '}'
;

assertion: 'assert' IDENTIFIER VERB value;

attribute: IDENTIFIER ':' value;

value: NUMBER | STRING;

STRING : DQUOTE (ESC | ~["\\])* DQUOTE;

VERB: 'Contains' | 'Equals';

IDENTIFIER: [A-Za-z] [._\-A-Za-z0-9]*;

NUMBER: '-'? INT '.' [0-9]+ EXP? | '-'? INT EXP | '-'? INT;

fragment DQUOTE: '"';

fragment ESC: '\\' (["\\/bfnrt] | UNICODE);

fragment UNICODE: 'u' HEX HEX HEX HEX;

fragment HEX: [0-9a-fA-F];

fragment INT: '0' | [1-9] [0-9]*; // no leading zeros

fragment EXP: [Ee] [+\-]? INT; // \- since - means "range" inside [...]

// Just ignore WhiteSpaces
WS: [ \t\r\n]+ -> skip;

При генерации Кода

Эта Грамматика не пойти, если воткнуть автоматически в коде, до этого необходимо создать несколько кодов до.

На этом этапе я настоятельно рекомендую использовать Maven для управления ANTLR4, так у вас уже будет все легко настроены.

Но если вы хотите создать вручную…

Создание Кода Вручную

  1. Скачать ANTLR4 Tool Скачать ANTLR ищет Сам инструмент ANTLR
  2. Депо выполняет o Инструмент ANTLR4:

  3. Используйте сгенерированные файлы в проект, как показано ниже:

Создавая с помощью Maven

С помощью Maven-это просто так. Создайте свой файл .g4 в каталог аналогичных пакета. Например, в нашем примере это:

И настройте плагин ANTLR4 в И настройте плагин ANTLR4 в


    org.antlr
    antlr4-maven-plugin
    ${version.antlr4}
    
        
            -package
            io.vepo.tutorial.antlr4.generated
        
    
    
        
            
                antlr4
            
        
    

Используя Код, Созданный

Сгенерированный код, его нужно будет просто повторно реализовать класс. Узнайте, интерфейс TestSuiteListener для каждой Правило, вызывается Метод, до и после обработки. В каждом методе есть объект контекста, где мы можем получить все Жетоны.

Эти методы вызываются в порядке, так на пример, приведенный ниже, любой метод атрибута url вызывается до |/| method и так далее. Все, как есть, только люкс, enterSuite и exitSuite будет первой и последней, которые будут призваны.

Suite UserTest {
    HTTP CreateUser {
        url   : "http://127.0.0.1"
        method: "POST"
        body  : """
                   {
                       "id": 123,
                       "firstName": "John",
                       "lastName" : "Doe"
                   }
                """
        assert responseCode Equals 200
    }
}

Наконец, чтобы превратить текст в Объектах, просто позвоните parser?

TestSuiteParser parser = new TestSuiteParser(
        new CommonTokenStream(new TestSuiteLexer(CharStreams.fromString(contents))));
ParseTreeWalker walker = new ParseTreeWalker();
SuiteCreator creator = new SuiteCreator();
walker.walk(creator, parser.suite());
Suite suite = creator.getTestSuite();

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

Для этих решений, более легко использовать ANTLR. Поэтому мы создаем язык легко.

Весь код, используемый в этом пост доступен в репозитории:

vepo/antlr4-сообщение

Чтобы увидеть это в действии:

mvn clean verify

Продолжу развитие этой tool:

vepo/простой тест

Просто инструмент для тестирования. Никакого XML! Просто обычный текстовый язык…

Рациональный

Тестирование – это тяжело. Если есть приложение, которое выполняет тесты из простых тестовых файлов?

Формат

Suite UserTest {
    HTTP CreateUser {
        url   : "http://127.0.0.1"
        method: "POST"
        body  : """
                   {
                       "id": 123,
                       "firstName": "John",
                       "lastName" : "Doe"
                   }
                """
        assert responseCode: 200
    }
}

Оригинал: “https://dev.to/vepo/como-criar-uma-linguagem-usando-antlr4-e-java-56g2”