Я пишу лексер Java в Python, используя PLY.
У меня есть этот конечный автомат:

Его целью должно быть сопоставление всех комментариев строки в некотором коде. Я хочу создать регулярное выражение 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
.