Я изо всех сил пытался понять некоторое поведение flex.
Я начал определять небольшую игрушечную программу-пример, которая будет разбиваться на ключевые слова и строки.
Одно определение регулярного выражения работает, как и ожидалось, но другое ведет себя совершенно иначе, вопреки моим ожиданиям.
Прошло несколько лет с тех пор, как я играл с этим материалом, так что, надеюсь, кто-то может указать мне правильное направление.
Я изменил регулярное выражение токена, чтобы заставить его работать, но мне бы очень хотелось понять , почему мой первоначальный выбор вел себя по-другому.
Этот первый пример - нерабочий код
%{
#include <iostream>
using namespace std;
%}
%option noyywrap
%%
[ \t\n] {cout << "ws" << endl;};
buzz {cout << "kw" << endl;};
[^\n]+ {cout << "str" << endl;};
%%
int main(){
yylex();
}
Второй пример - модифицированная версия, которая работает правильно.
%{
#include <iostream>
using namespace std;
%}
%option noyywrap
%%
[ \t\n] {cout << "ws" << endl;};
buzz {cout << "kw" << endl;};
[a-zA-Z]+ {cout << "str" << endl;};
%%
int main(){
yylex();
}
В коде buzz считается ключевым словом, а все, что следует за ним, следует просто читать как строку.
В первом примере гудение поглощается вместе с оставшимся словом как "str".
Во втором примере, жужжание распознано правильно, а оставшееся слово становится "str".
Я понимаю, что третье правило в обоих случаях также является допустимым определением токена, содержащего символы b-u-z-z. Каждая из этих четырех букв находится в [^ \ n] +, а также [a-zA-Z] +. Так почему же поведение отличается?
Пример ввода будет:
buzz lightyear
buzz aldren
Спасибо!