Написание регулярного выражения Python для данного конечного автомата - PullRequest
1 голос
/ 04 марта 2020

Я пишу лексер Java в Python, используя PLY.

У меня есть этот конечный автомат:

Regular expression matching state machine

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

Регулярное выражение, которое я хочу найти, будет написано в методе с именем t_IGNORE_LINECOMMENT(t), так что при лексировании каждый комментарий в строке будет игнорируется.

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

(\/\/[^"\n\r]*(?:"[^"\n\r]*"[^"\n\r]*)*[\r\n]|\/\*([^*]|\*(?!\/))*?\*\/)(?=[^"]*(?:"[^"]*"[^"]*)*$)

, которые можно проверить здесь .

Предполагается, что этот соответствует каждому виду комментария, но может также соответствовать "//"/" и не соответствует hey = "//comment" //comment ", соответствуя всем //comment" //comment " как комментарию, а не только //comment

В конечном автомате я называю A весь алфавит, а когда я пишу A/{x,y}, я имею в виду весь алфавит, кроме x и y.

1 Ответ

1 голос
/ 04 марта 2020
(?:[^"]|"(?:[^\"]|\\.)*")*?(//.*?[\r\n])

должен делать то, что вы хотите (учитывая re.DOTALL): он соответствует как можно меньшему количеству нестроковых символов или строк (сами по себе любое количество не кавычек, не экранированных или экранированных) затем следует // и как можно меньше символов до следующего символа EOL. (Первое не жадное повторение необходимо, чтобы комментарий был максимально длинным.)

...