Команда проваливается в lex - PullRequest
0 голосов
/ 24 марта 2009

Я использую lex в своей программе и столкнулся с проблемой, с которой мне нужна помощь.

Моя программа принимает свой ввод в виде [что-то “что-то]. Это работает правильно.

Однако мне также нужно принять форму [что-то “что-то].

Есть ли способ, которым я могу иметь какой-то первый случай в lex, через который проходит весь ввод (например, предварительная обработка), и затем этот же измененный ввод продолжается до конца моей программы?

Вот то, о чем я говорю:

%%
.* {
   do preprocessing
   }

something{
   return SOMETHING;
   }

\" {
   return QUOTE;
   }
%%

1 Ответ

1 голос
/ 24 марта 2009

Ну, вы могли бы написать препроцессор на 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 или более букв, подчеркиваний и цифр.

Это помогает?

...