Я пытаюсь извлечь следующие элементы из файла C:Упрощая регулярное выражение, которое вызывает Java StackOverflowException
- Комментарии (одиночных и множественных линий)
- строковых литералов
- Decimal, восьмеричные и шестнадцатеричные литералы.
Я написал следующее регулярное выражение, чтобы попытаться найти эти пункты:
/\*(?:.|[\r\n])*?\*/|"(?:[^"\\\r\n]|\\.)*"|//.*|\b\d+\b|\b0[xX][\da-fA-F]+\b
Выражение состоит из пяти частей Ored вместе.
/\*(?:.|[\r\n])*?\*/
проверяет многострочные комментарии."(?:[^"\\\r\n]|\\.)*"
проверяет строковые литералы.//.*
проверяет однострочные комментарии.\b\d+\b
проверяет десятичные и восьмеричные константы.\b0[xX][\da-fA-F]+\b
проверяет наличие шестнадцатеричных констант.
Хотя выражение, похоже, отлично работает при тестировании с использованием regexpal и файла с 500 строками C, моя Java-программа выдает исключение StackOverflowException после нескольких совпадений.
Вот код Java, который использует регулярное выражение:
Pattern itemsOfInterestPattern = Pattern.compile(
"/\\*(?:.|[\\r\\n])*?\\*/|\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|//.*|\\b\\d+\\b|\\b0[xX][\\da-fA-F]+\\b");
// Now, go through the source file and process any tags we find
Matcher itemsOfInterestMatcher = itemsOfInterestPattern.matcher(sourceFile);
int matchNumber = 0;
while (itemsOfInterestMatcher.find()) {
// We've found a token
++matchNumber;
String token = itemsOfInterestMatcher.group();
// I then have a switch statement that processes each match depending on its type
}
Трассировка стека, когда происходит переполнение можно найти на http://pastebin.com/7eL6mVd2
Что вызывает переполнение стека и как я могу изменить выражение разрешить ему работать?
Амр
Возможно, что-то делать с фактическим кодом Java. Разве это сообщение? – keyser
Не захватывающий (? :) может быть проблематичным, так как его обработка потребляет много стека. – nansen
Ваши числовые образцы букв будут соответствовать целым частям и частям фракции '0,5', но' \ b \ d + \ b' не будет соответствовать какой-либо части значений с плавающей точкой в научной нотации '1e1' или целочисленных литералов с спецификатором размера:' 1L'. –