Я думаю Literal('\n')
это ваша проблема. Вы не хотите создавать литерал с пробельными символами (поскольку литералы по умолчанию пропускают пробельные символы перед попыткой сопоставления). Попробуйте использовать LineEnd()
вместо.
РЕДАКТИРОВАТЬ 1:
Тот факт, что вы получаете бесконечный цикл с LineEnd, не означает, что Literal ('\ n') лучше. Попробуйте добавить .setDebug()
в конце определения _eol
, и вы увидите, что оно никогда ничего не соответствует.
Вместо того, чтобы пытаться определить тело вашего комментария как «одну или несколько строк, которые не являются закрывающей строкой, но получают все до конца строки», что делать, если вы просто сделаете:
xmlComment = _cPoundOpenXmlComment + pp.SkipTo(_cPoundCloseXmlComment) + _cPoundCloseXmlComment
(Причина, по которой вы получили бесконечный цикл с LineEnd (), заключалась в том, что вы по существу выполняли OneOrMore (SkipTo (LineEnd ())), но никогда не использовали LineEnd (), поэтому OneOrMore просто продолжал сопоставлять и сопоставлять и сопоставлять , синтаксический анализ и возврат пустой строки, поскольку позиция синтаксического анализа была в конце строки.)