2015-01-26 3 views
0

Я пытаюсь перевести предложение «b ((aa) a) b $« используя грамматику, показанную в комментарии к коду. Когда я пытаюсь запустить его, он дает следующую ошибку. Кажется, что это ошибка в методе разделения строк, но я не знаю, как это исправить. Любые предложения? Спасибо.Исключение в теме «main» java.util.regex.PatternSyntaxException: Непревзойденное закрытие

пробег:

б ((а) а) б $

Исключение в потоке "основной" java.util.regex.PatternSyntaxException: Непревзойденная закрытие ')' рядом с индексом 3

)

^ в java.util.regex.Pattern.error (Pattern.java:1955) на java.util.regex.Pattern.compile (Pattern.java:1700) в Явь a.util.regex.Pattern. (Pattern.java:1351) на java.util.regex.Pattern.compile (Pattern.java:1028) на java.lang.String.split (String.java:2367) в exercise3.GrammarTest.parser (GrammarTest.java:28) в exercise3.GrammarTest.parser (GrammarTest.java:48) в exercise3.GrammarTest.main (GrammarTest.java:62)

Java Результат: 1

строить успешные (общее время: 1 секунда)

//grammar 
//<P> → <S>$ (P is the start symbol) 
//<S> → b<M>b 
//<M> → (<L> 
//<M> → a 
//<L> → <M> a) 


public static String parser(String original, String sym, String rep){ 
    if(!(original.contains(sym))){ 
     return original; 
    } 

    String str = ""; 
    String [] parts = original.split(sym, 2); 

    str = parts[0] + rep + parts[1]; 

    System.out.println(str); 
    return str; 
}   

public static String parser(String str){ 
    String [] sym = new String[5]; 
    //recursive    //b((aa)a)b$ 
    str = parser(str, "a", "<M>"); //b((<M>a)a)b$ 
    str = parser(str, "<M>a)", "<L>"); //b((<L>a)b$ 
    str = parser(str, "(<L>", "<M>"); //b(<M>a)b$ 
    str = parser(str, "<M>a)", "<L>"); //b(<L>b$ 
    str = parser(str, "(<L>", "<M>"); //b<M>b$ 
    str = parser(str, "b<M>b", "<S>"); //<S>$ 
    str = parser(str, "<S>$", "<P>"); //<P> 

    System.out.println(str); 

    return str; 
} 

public static void main(String[] args) { 
    String str = " b((aa)a)b$ "; 
    str = parser(str);  

} 

ответ

4

Если вы хотите совместить с (, вам нужно сбежать от него как \\(, потому что ( - это начало для группы для регулярных выражений. Для ленивых людей Java включает в себя фасад для этого: Pattern.quote("(a"); /* gives you \\(a */

1

Метод String .split принимает в регулярном выражении, а не в простой строке. У вас есть скобки на вашем входе, поэтому он ищет подходящую скобку для указания захваченной группы.

К сожалению, .contains не принимает регулярное выражение, поэтому использовать те же строки для обоих этих методов будет довольно сложно. Вероятно, было бы лучше просто разделить на регулярное выражение и проверить, есть ли только один результат. Если это так, матча не было.

1

Вы должны избежать скобки в шаблоне

str = parser(str, "<M>a\\)", "<L>"); //b((<L>a)b$ 
str = parser(str, "\\(<L>", "<M>"); //b(<M>a)b$ 
str = parser(str, "<M>a\\)", "<L>"); //b(<L>b$ 
str = parser(str, "\\(<L>", "<M>"); //b<M>b$ 
Смежные вопросы