В качестве упражнения я также создал парсер MediaWiki и не сопоставлял теги open и close для жирного и курсивного шрифта, а скорее вызывал переключение, подобное этому:
grammar MediaWiki;
options {
output=AST;
backtrack=true;
memoize=true;
}
...
// entry point of the parser
parse
: atom+ EOF -> ^(ROOT atom+)
;
atom
: formatToggle
| horizontalRule
| header
| link
| list
| preFormattedText
| table
| ...
| any
;
formatToggle
: SQt SQt SQt SQt SQt -> BOLD_ITALIC
| SQt SQt SQt -> BOLD
| SQt SQt -> ITALIC
;
...
SQt
: '\''
;
И затем во времяпереводя формат MediaWiki (в HTML?), вы переворачиваете некоторые логические флаги, когда сталкиваетесь с одним из BOLD_ITALIC
, BOLD
или ITALIC
.
Я еще не проверял свою грамматику должным образомпоэтому я не собираюсь публиковать здесь всю грамматику.
Удачи!