2009-09-19 1 views
0

Скажем, у меня есть два правила, как ниже:Как «вычесть» лексерские правила в ANTLR?

printable_characters : '\u0020' .. '\uFFEF' ; 

newline_characters : '\n' | '\r' ; 

Теперь давайте предположим, что я хочу сделать новое правило под названием printable_no_newlines. Я хотел бы сделать это путем вычитания из newline_charactersprintable_characters так:

printable_no_newlines : printable_characters - newline_characters ; 

Этот синтаксис не работает в ANTLR3, но кто-нибудь знает, что лучше всего было бы эмулировать без повторного ввода всего правила?

ответ

1

Я не думаю, что это возможно. Я также скептически отношусь к тому, что он будет делать то, что вы хотите: например, ваш printable_new_newlines будет включать "foo\nbar", так как он соответствует printable_characters, но не соответствует newline_characters (так как это соответствует только символам с одним символом).

+0

Привет, Мартин. Я изменил свой пример, чтобы иметь больше смысла. Я не должен был использовать. * Для правила printable_characters. Если вы пересматриваете вопрос сейчас, имеет ли смысл, что я пытаюсь сделать? –

+0

Некоторые из комментариев Мартина больше не актуальны, но ключевой момент этого невозможен без ручной записи разницы заданий. –

+0

@Jeffrey: ваше редактирование все еще не делает запрос разумным. Поскольку 'newline_characters' не включены в' printable_characters' (поскольку они ниже U + 0020), в любом случае 'printable_no_newlines' будет таким же, как' printable_characters'. –