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

#c# #parsing #antlr

#c# #синтаксический анализ #antlr

Вопрос:

Допустим, у меня есть текстовый файл:

 Vegetable carrot,
Vegetable salad,
Fruit orange,
Fruit apple,

PRINT GetFruitCalories(orange),
PRINT GetFruitCalories(salad)
  

ANTLR может собирать все эти токены.

  • Допустим, мы хотим запретить типы овощей в методе GetFruitCalories.
  • Этот метод должен принимать только аргументы fruit-args
  • Antrl может проверить, есть ли у нас число, запятая, точка, (, ), новая строка…. (грамматика) но как насчет «умной» проверки типов?
  • Можем ли мы проверять на основе префиксов «Фрукты» и «Овощи», типа салата и апельсина?
  • Я хотел бы вызвать ошибку синтаксического анализатора при выполнении GetFruitCalories(салат).
  • Я могу создать посетителя, который будет проверять типы, но порядок ошибок будет:
  1. первый синтаксический анализатор проверяет грамматику
  2. мой пользовательский тип проверки фруктов в моем посетителе

Я хотел бы объединить это вместе, некоторый код с ошибками:

 ABCBACBAC_INVALID_TEXT1 //raise an error by grammar
Vegetable salad,
PRINT GetFruitCalories(salad), //raise an error by "smart" checking type
ABCBACBAC_INVALID_TEXT2 //raise an error by grammar
  

Ошибки должны отображаться по порядку:

  • вызывает ошибку из-за грамматики
  • выдает ошибку с помощью «умного» типа проверки
  • вызывает ошибку из-за грамматики

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

  • вызывает ошибку из-за грамматики
  • вызывает ошибку из-за грамматики

и ПЕЧАТЬ GetFruitCalories (салат) будет предотвращена из-за синтаксического анализатора.

Я использую C #, и после сбора всех фруктов и овощей было бы неплохо провести событие для проверки этих типов. Наиболее важным для меня является порядок последовательности ошибок. Возможно, я хочу сделать это на уровне синтаксического анализа. Возможно ли это? Есть ли какие-либо настройки? Обычно я просто вызываю метод «parse». Возможно, введение кода c # в грамматику может помочь — я никогда не пробовал. Событие в методе ‘CaloriesVisitor’ также может быть приятным.

Пожалуйста, помогите

Ответ №1:

Здесь вам нужно лучше понять процесс обработки языка. Это больше, чем просто синтаксический анализ (который, проще говоря, является способом определения достоверности входных данных по сравнению с определением языка — грамматикой). Синтаксический анализ дает вам структуру, которая каким-то образом описывает входные данные (обычно дерево синтаксического анализа или синтаксическое дерево). Он ничего не знает о значении отдельных токенов. Определение этого обычно является частью другого шага: семантической фазы.

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

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

Комментарии:

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