флекс я запутался

вход в лексер

abc gef4 44jdjd ghghg
x
ererete
xyzzz
55k
hello wold
33

мои правила

rule1 [0-9]+[a-zA-Z]+
rule2 [x-z]
rule3 .*

{rule1} { printf("%s \n", yytext); }

{rule2} { printf("%s \n", yytext); }

{rule3} { // ничего не печатает }

выход :-

x  



55k   

Я не могу понять вывод? Может кто-нибудь, пожалуйста, помогите мне.


person user574183    schedule 03.02.2011    source источник
comment
много строк сопоставляются с правилом 3, почему это так? почему правило3 соответствует слову 44jdjd? Он должен сопоставляться с правилом1, так как правило1 появляется первым?   -  person user574183    schedule 03.02.2011


Ответы (1)


Первый символ ввода не соответствует ни правилу1, ни правилу2. Вместо этого правило3 поглощает ввод до конца строки. То же самое происходит в строках 3, 4, 6 и 7. Вероятно, вам нужно менее жадное правило3, то есть такое, которое не использует пробелы:

[^ \t\n]*           /* Do nothing */

Тогда 44jdjd находится по правилу1.

person antonakos    schedule 03.02.2011
comment
теперь он также печатает нежелательные слова. Думаю, мне нужно написать регулярное выражение, чтобы съесть их. Как поместить два регулярных выражения в одно правило? это не работает правило3 [^ \t\n] | [а-я-я]* - person user574183; 04.02.2011