我想定义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
答案 0 :(得分:2)
一般来说,你永远不想直接在你的弹性代码中调用'input' - 这是例程flex用来获取更多输入,所以如果你调用它,你就会从输入的中间拉出随机字符并且将思维混淆,认为它们不存在。最好的方法是定义多个规则,并依靠最长的匹配来获得正确的规则。
"'"{letter}"'" { return(tChar); }
"'"{letter}"\n" { return(tCharunterm); }
"'"{letter} { yyerror("char overflow"); return(rCharunterm); }
您可能还希望这些规则中的yylval.ch = yytext[1];
能够返回您匹配的实际字符值。