flex,定义char

时间:2009-11-13 10:44:27

标签: c bison lex flex-lexer

我想定义char(即'a AND'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 个答案:

答案 0 :(得分:2)

一般来说,你永远不想直接在你的弹性代码中调用'input' - 这是例程flex用来获取更多输入,所以如果你调用它,你就会从输入的中间拉出随机字符并且将思维混淆,认为它们不存在。最好的方法是定义多个规则,并依靠最长的匹配来获得正确的规则。

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

您可能还希望这些规则中的yylval.ch = yytext[1];能够返回您匹配的实际字符值。