Необходимо будет выйти + с \и потому что \самостоятельно специальный символ в строках Java, необходимо будет выйти из него с другим \.
, Таким образом, Ваша строка regex будет определена как "\\+" в коде Java.
Т.е. этот пример:
String test = "ABCD+EFGH";
test = test.replaceAll("\\+", "-");
System.out.println(test);
У меня был хороший опыт работы с ANTLR v3 . Безусловно, самым большим преимуществом является то, что он позволяет писать синтаксические анализаторы LL (*) с бесконечным упреждающим просмотром - они могут быть довольно неоптимальными, но грамматика может быть написана наиболее простым и естественным способом без необходимости рефакторинга для обхода ограничений синтаксического анализатора и производительность парсера часто не имеет большого значения (я надеюсь, что вы не пишете компилятор C ++), особенно в учебных проектах.
Он также предоставляет довольно хорошие средства для создания осмысленных AST без необходимости писать любой код - для каждой грамматической продукции вы указываете «критический» токен или подпродукцию, и это становится узлом дерева. Или вы можете написать постановку из дерева.
Взгляните на следующие грамматики ANTLR (перечисленные здесь в порядке возрастания сложности), чтобы понять, как это выглядит и ощущается
Вы можете изучить исходный код компилятора Mono C # .
Пока он все еще находится в ранней бета-версии, Oslo Язык моделирования и инструменты MGrammar от Microsoft выглядят многообещающими.
Я бы также взглянул на SableCC . Создать грамммер EBNF очень просто. Здесь - простой пример калькулятора C #.
Lex и yacc по-прежнему мои любимые. Непонятно, если вы только начинаете, но чрезвычайно просто, быстро и легко, когда вы усвоите жаргон.
Вы можете заставить его делать все, что захотите; генерировать код C #, строить другие грамматики, эмулировать инструкции, что угодно.
Это некрасиво, это текстовый формат и LL1, поэтому ваш синтаксис должен это учитывать.
С другой стороны, он везде. Об этом есть отличные книги Орейли, множество примеров кода, множество готовых грамматик и множество библиотек на родном языке.
Здесь есть небольшая статья о построении здесь анализатора LL (1), конечно, вы также можете использовать генератор.