Написание парсера с М, потреблять пока не правило

Я пишу 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, что переводится как:

  • НЕ берите '<' ИЛИ ​​берите '<' НЕ следуйте '/'

Который будет потреблять что-либо, пока не встретится токен

Другие вопросы по тегам