Nano Hash - криптовалюты, майнинг, программирование

Использование нескольких команд лексера в одном правиле лексера в Antlr

Я пытаюсь использовать более одной команды лексера в правиле лексера. Мой код выглядит примерно так:

LEXER_RULE: something->mode(NUMBER);

mode NUMBER;
NU: [0-9]+ ->mode(ANOTHER_MODE); //Going into another mode in case the NU rule is used

//now leaving the NUMBER mode, in case there is no number written

NO_NUM: ~[0-9]->mode(DEFAULT_MODE);

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

NO_NUM:~[0-9]->skip ->mode(DEFAULT_MODE);

Я знаю, что мне не разрешено использовать более одной команды лексера в одном правиле лексера. Кто-нибудь знает какой-нибудь другой подход? Мне нужно как-то выйти из режима. Кстати, мне не разрешено использовать семантические предикаты. Спасибо!

07.05.2020

Ответы:


1

Вы были почти там! Используйте запятую вставки:

NO_NUM : ~[0-9] -> skip, mode(DEFAULT_MODE);

Это, очевидно, отбрасывает все, что соответствует ~[0-9]. Итак, если у вас есть эта грамматика:

ID : [a-zA-Z]+;
...

mode NUMBER;
  NU.    : [0-9]+ -> mode(ANOTHER_MODE);
  NO_NUM : ~[0-9] -> skip, mode(DEFAULT_MODE);

mode ANOTHER_MODE;
  ...

И в mode NUMBER вы встречаете abc, затем a отбрасывается, а bc превращается в ID. Если вы также хотите, чтобы a было частью ID, вам нужно сделать следующее:

ID : [a-zA-Z]+;
...

mode NUMBER;
  NU.    : [0-9]+ -> mode(ANOTHER_MODE);
  NO_NUM : ~[0-9] -> more, mode(DEFAULT_MODE);

mode ANOTHER_MODE;
  ...

Подробнее о команде Lexer: https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md#lexer-commands

07.05.2020
  • Вы даже решили проблему, с которой я столкнулся, пропустив первый знак. Большое спасибо! 07.05.2020
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..