Вы не можете отрицать больше, чем один символ. Итак, следующее недействительно:
~('${')
Но почему бы просто не добавить '$'
, '{'
и '}'
к вашему CHUNK
правилу и удалить +
в конце правила CHUNK
(иначе это будет сожрать многое, возможно '$video{'
дальше в источнике, как вы уже заметили)?
Теперь токен CHUNK
будет всегда состоять из одного символа, но вы можете создать производственное правило, чтобы исправить это:
chunk
: CHUNK+
;
и используйте chunk
в своих правилах производства вместо CHUNK
(или используйте CHUNK+
, конечно).
Ввод, подобный "{ } $foo $video{"
, будет размечен следующим образом:
CHUNK {
CHUNK
CHUNK }
CHUNK
CHUNK $
CHUNK f
CHUNK o
CHUNK o
CHUNK
BEGIN_VIDEO $video{
EDIT
И если вы позволите вашему анализатору выводить AST, вы можете легко объединить весь текст, который соответствует одному или нескольким CHUNK
, в один AST, внутренний токен которого имеет тип CHUNK
, например:
grammar Text;
options {
output=AST;
}
...
chunk
: CHUNK+ -> {new CommonTree(new CommonToken(CHUNK, $text))}
;
...