Лучший современный анализ текста? AKA Когда использовать Lex и Yacc? - PullRequest
3 голосов
/ 07 мая 2009

У меня есть входные блоки текста с командами и аргументами, по одному на строку, например

XYZ ARG1,ARG2,ARG3,...,ARGN

И я хочу убедиться, что аргументы XYZ правильно сформированы для этой конкретной команды, и выполнить правильный блок кода, если они есть. Есть что-то вроде ~ 100 команд, некоторые из которых имеют переменное число аргументов, различные отношения (то есть, если была вызвана команда XYZ, тогда мне нужно также вызвать команду ABC).

Также существуют команды, такие как:

COMMAND
XYZ ARG1
BEF ARG1 ARG2
ENDCOMMAND

Важно, чтобы текст содержался в COMMAND и ENDCOMMAND.

Обычно для чего-то подобного я бы использовал Lex и Yacc, а не regex, но есть ли что-нибудь более современное? Код написан на C #. Есть ли что-нибудь в MSDN, что делает это, а не старой школы C Lex и Yacc?

Ответы [ 6 ]

5 голосов
/ 07 мая 2009

Если вы ищете альтернативу Lex / Yacc, посмотрите ANTLR . Он поддерживает генерацию кода на различных языках, , включая C # .

4 голосов
/ 07 мая 2009

ANTLR может обрабатывать как лексические операции, так и синтаксический анализ, а также генерировать C # (в дополнение к Java, C ++ и Python). Он очень зрелый, имеет много документации и много примеров. Он также генерирует гораздо более приятные сообщения об ошибках, чем YACC.

1 голос
/ 26 июня 2009

Взгляните на jay, yacc перенаправлен на C # и Java. Входит в монопроект.

http://code.google.com/p/jayc/

1 голос
/ 11 мая 2009

Для такой простой задачи разбора вы можете написать рекурсивный анализатор спуска. Предполагая, конечно, ваш язык относительно фиксирован и не собирается превращаться в полноценный язык программирования. Если есть какая-либо опасность, прикусите пулю и используйте ANTLR или эквивалентный.

1 голос
/ 07 мая 2009

У вас есть большая проблема, чем "age", в том, что я не уверен, что какой-либо из известных широко известных компиляторов C-ish будет работать с C #. То же самое относится и к новомодным шаблонам парсинга Boost.

Вам, вероятно, придется пойти с чем-то эзотерическим, как Grammatica или Spart (чтобы выбрать два моих лучших Google хита )

EDIT: После более тщательного изучения выясняется, что ANTLR поддерживает C #. ANTLR очень хорошо известен и намного новее, чем LEX / YACC, поэтому я бы посоветовал проверить его.

0 голосов
/ 07 мая 2009

В .NET Framework нет ничего особенного, если вы это имеете в виду.

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

...