Написание парсера с М, потреблять пока не правило
Я пишу HTML-парсер для собственного удовольствия, и я хотел попробовать M.
Я основываю эту работу на стандарте HTML 4.01 и там говорится
Хотя элементы STYLE и SCRIPT используют CDATA для своей модели данных, для этих элементов пользовательские агенты должны обрабатывать CDATA по-разному. Разметка и сущности должны рассматриваться как необработанный текст и передаваться приложению как есть. Первое вхождение последовательности символов "" (открытый разделитель конечного тега) обрабатывается как завершение конца содержимого элемента. В допустимых документах это будет конечный тег для элемента.
Я думаю об этом какое-то время, и действительно, что я хочу сделать, это что-то вроде этого
syntax Main
= "<script>" Script "</script>"
;
token Script
= TakeWhileNot("</") // this is not valid M grammar
;
Я обнаружил, что сам хочу выполнить какое-то правило токенизации, которое соответствует, пока я не достигну открытой угловой скобки <с последующей косой чертой /.
Если бы escape-последовательность состояла из одного символа, это не было бы проблемой, потому что тогда я мог бы написать это.
token Script
= ScriptEscape+
;
token ScriptEscape
= !"<"
;
И это сработало бы, не уверен, правильно ли я поступаю, но проблема в некотором роде связана с тем, что у меня есть язык, встроенный в другой, но в данном случае мне нет дела до языка сценариев, поэтому я просто хочу пропустить голову.
1 ответ
Я понял эту хитрую уловку, которая была не совсем очевидна...
syntax Main
= "<script>" Script* "</script>"
;
token Script
= !('<')
| '<' !('/')
;
Теперь это действительно MGrammar, что переводится как:
- НЕ берите '<' ИЛИ берите '<' НЕ следуйте '/'
Который будет потреблять что-либо, пока не встретится токен to, не потребляя его.