2016-04-30 12 views
0

Я пытаюсь сделать .l файл, но предупреждение происходят в определенных линиях, исключающих не могут быть сопоставленыLex - Предупреждение, правило не может быть согласован

"true"      return TRUE; 
"false"      return FALSE; 
"int"      return INT; 
"char"      return CHAR; 
"float"      return FLOAT; 
"bool"      return BOOLEAN; 

"if"     return IF; 
"else"     return ELSE; 
"for"     return FOR; 
"while"     return WHILE; 
"do"     return DO; 
"switch"    return SWITCH; 
"case"     return CASE; 

"break"     return BREAK; 
"default"    return DEFAULT; 
+0

ли вы положили в '%%' раздела разделителей? –

+0

Какие «определенные линии»? И где же все остальные определения сканера? – rici

ответ

2

Если строки, которые вы вставили в ваш вопрос, являются строки, которые вызвали предупреждение, то это, вероятно, потому, что у вас есть правило catch для всех идентификаторов до правил ключевых слов. Минимальный пример будет выглядеть так:

[[:space:]]    /* ignore whitespace */ 
[[:alpha:]][[:alnum:]]* return ID; /* Wrong!! */ 
keyword     return KEYWORD; 
.       return *yytext; 

Это будет выдавать предупреждение на третьей линии.

Порядок действий в (f) определениях lex, потому что если два правила совпадают с одним и тем же токеном, а ни одно правило не соответствует более длинному токену, то первое правило выигрывает.

Это объясняется в flex manual