C # парсинг неизвестных логических условий во время выполнения - PullRequest
1 голос
/ 09 декабря 2011

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

IF KEY IS "X" AND VALUE IS "Y" RETURN NOTIFICATION

(IF KEY IS "X" OR VALUE IS "Y") AND (IF SECTIONNAME IS "I") REPLACE "Y" WITH "J"

Итак, как вы можете видеть выше, я хочу иметь возможность группировать вещи с паренами, использовать логические И и ИЛИ и обрабатывать операторы IF, которые все приведут к некоторому значению True / False для выполнения какого-либо действия. Мой вопрос заключается в том, как лучше всего анализировать данные, чтобы я знал, какие операции нужно выполнять, и в правильных группировках. Через Google кажется, что, возможно, я хочу создать абстрактное синтаксическое дерево, если это так, я не смог найти несколько простых примеров, чтобы действительно начать меня.

Любая помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Я большой поклонник генераторов парсеров (см. Мою биографию), но иногда они излишни.

Для выражений, таких простых (булева логика) и небольшого набора действий (таких, как вы показали), парсер рекурсивного спуска должен прекрасно работать. Если вы включаете семантические действия в анализ, вам не нужен AST; Вы можете вычислить результат булевого уравнения на лету и использовать этот результат, чтобы решить, следует ли вам выполнить анализируемое действие, прежде чем даже анализировать его, поскольку анализаторы рекурсивного спуска работают слева направо. Таким образом, вы можете хранить свои правила в виде текста и просто выполнять их по требованию, а ваши пользователи могут вводить их на месте.

См. этот SO-ответ о том, как создать парсер рекурсивного спуска вручную

0 голосов
/ 09 декабря 2011

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

...