Парсер с использованием RegEx и XML, в C # - PullRequest
0 голосов
/ 05 марта 2009

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

Например, если есть команда печати:

  print "string" < variable < "some another string" //some comments

  print\s".*"((\s?<\s?".*")*\s?<\s?(?'string1'\w+))?(\s*//.*)?

Итак, я сделал следующее регулярное выражение:

  \s*[<>]\s*((?'variant'\w+)(\[\d+\])*) 

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

print %string% (%<% %string%|%variable%)* %comments%

Теперь вот так я пишу спецификацию для каждого ключевого слова и записываю определение строки, переменной, комментариев в другой файл, в котором хранится их регулярное выражение. Затем я пишу парсер, который анализирует эту строку и создает для меня строку регулярного выражения.

Возможно ли это?

Есть ли лучший способ сделать это или я могу сделать это в XML?

Ответы [ 2 ]

1 голос
/ 05 марта 2009

В прошлый раз, когда я задавал такой вопрос, кто-то указал мне на http://www.antlr.org/. Наслаждайтесь. : -)

0 голосов
/ 09 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...