Ну, вы могли бы написать препроцессор на lex и поместить его в свою систему сборки, но это вероятно перебор!
Вы можете использовать условия запуска, переключаясь между ними с помощью BEGIN, и сначала анализировать ввод, а затем использовать unput для передачи символов обратно в поток, а затем другое условие запуска может проанализировать результат (см. руководство по Flex * 1006. *).
Недавно я написал парсер для Python-подобного языка конфигурации, который сделал именно это. синтаксический анализатор имел два режима (условия запуска): один для подсчета вкладок в начале строки, чтобы определить область, а затем другой для фактического анализа.
Эти методы хороши, но обычно есть лучший способ сделать это, особенно если ваша схема ввода не очень сложна.
Есть ли грамматическая разница между [чем-то «чем-то» и [чем-то »чем-то] для вашей программы? будет ли правило поедания пустых пространств делать трюк?
Не могли бы вы немного подробнее описать ваш язык и грамматику ...?
После комментария:
Хорошо, так что в основном у вас есть два токена, ЧТО-ТО и ЦИТАТА. Если ваши токены разделены пробелами, вы можете сделать следующее:
%%
\" {
//this will match a single quote
return QUOTE;
}
[^" \t\n\r]+ {
//this will match a run of anything thats not a quote, space, tab or line ending
return SOMETHING;
}
[ \t\n\r] {
//do nothing: i.e. ignore whitespace
}
%%
Для вашего токена SOMETHING вы также можете подобрать что-то вроде [A-Za-z_][A-Za-z0-9_]*
, которое будет соответствовать букве или подчеркиванию, за которыми следуют 0 или более букв, подчеркиваний и цифр.
Это помогает?