гибкий, определяющий символ - PullRequest
0 голосов
/ 13 ноября 2009

Я хочу определить char (то есть 'a и' a '), но у меня возникают проблемы при проверке ошибок Вот как я пишу правило и проверяю:

char         " ' " {letter}

код

{char}    {
          int x =input() ;
          //printf("%d",'a');

                if(x == 10)
                {
                    return(tCharunterm);
                }
                else if(x == '\'')
                {
                    return(tChar);
                }
                else
                {
                    yyerror("char overflow");
                }

И, наконец, проверим:

'a
token = tCharunterm, value = "(null)"
'a'  
token = tChar, value = "(null)"
'as
char overflow
'asddd
char overflow
token = tIdentifier, value = "ddd"
^Z

1 Ответ

2 голосов
/ 15 ноября 2009

Как правило, вы НИКОГДА не хотите вызывать 'input' прямо в вашем Flex-коде - это обычная процедура flex, используемая для получения большего ввода, поэтому если вы ее вызываете, вы вытягиваете случайные символы из середины ввода и сбивает с толку, думая, что они не существуют. Лучший способ сделать это - определить несколько правил и опираться на самое длинное совпадение, чтобы получить правильное.

"'"{letter}"'"  { return(tChar); }
"'"{letter}"\n" { return(tCharunterm); }
"'"{letter}     { yyerror("char overflow"); return(rCharunterm); }

вы также можете захотеть, чтобы yylval.ch = yytext[1]; в этих правилах возвращало фактическое значение символа, которое вы выбрали.

...