2015-11-11 3 views
0

Я работаю над мини-проектом для своего семестра для курса Compiler Construction.Как избежать предварительной обработки комментариев внутри строкового литерала с использованием Java Regex

Я разрабатываю часть сканера на данный момент для языка Java на языке Java. Этот сканер будет производить маркеры, которые позже будут использоваться для анализатора ...

Большая часть работы, которую я проделал, - это использование регулярных выражений Java. Проблема, с которой я столкнулся сейчас, заключается в том, что, когда я предварительно обрабатываю код для удаления inline & многострочных комментариев, он также удаляет комментарии внутри строковых литералов, если они есть. Я использую следующее регулярное выражение:

String regExPreProcess = "((?s)(/\\*.*?\\*/|/\\*.*))|(//.*)" 

Может кто-то пожалуйста, пролить некоторый свет, чтобы решить эту проблему. Я попробовал lookahead & функцию lookbehind, но проблема все еще сохраняется.

+1

Я даже не уверен, что это что-то регулярное выражение _can_ do ... –

+0

@Louis прав, регулярные выражения бесполезны для этого. Вы не можете просто вырвать биты, которые вас не интересуют, потому что вы не можете надежно идентифицировать их, не зная всего контекста. –

+0

Вы уверены, что это то, что вы хотите? Что означает, что для строкового литерала есть комментарий внутри него? Зачем тебе это когда-нибудь? – mvd

ответ

0

Сначала вам нужно сделать официальное определение встроенных и блочных (многострочных) комментариев.

Что-то, как:

  • инлайн комментарий начинается с встроенный комментарий разделители (//), расположенных за пределами строковых литералов и блокировать комментарии и заканчивается в конце строки
  • строковых литералов начинается с двойной кавычки ("), размещенное вне встроенных комментариев или комментариев блока и заканчивается неэкспрессированной двойной кавычкой (")
  • скрытая двойная кавычка - двойная кавычка, добавленная с нечетным числом обратных косых черт (\)
  • комментарий блока начинается с проспект открытия комментария (/ *) pl (* /)

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