#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(салат).
- Я могу создать посетителя, который будет проверять типы, но порядок ошибок будет:
- первый синтаксический анализатор проверяет грамматику
- мой пользовательский тип проверки фруктов в моем посетителе
Я хотел бы объединить это вместе, некоторый код с ошибками:
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. Я согласен с вами, что хорошо не смешивать синтаксический анализ и интеллектуальную проверку, например, проверку типа объекта. Если это лучшая практика, я должен принять ее. Однако это не решает мою проблему.