gpt4 book ai didi

c++ - 弹性代币订单

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:55 25 4
gpt4 key购买 nike

我在 flex 中声明以下标记时遇到问题:>、<、>=、<= >>、<<、>>=、<<=。

我这样声明:(flex)

ID          [_a-zA-Z][_a-zA-Z0-9]*

">" {
ultimo_token = ">";
return BT_OP;
}

"<" {
ultimo_token = "<";
return LT_OP;
}

"<<" {
ultimo_token = "<<";
return ESQ_OP;
}
">>" {
ultimo_token = "<<";
return DIR_OP;
}

"<=" {
ultimo_token = "<=";
return LE_OP;
}

">=" {
ultimo_token = ">=";
return GE_OP;
}
">>=" {
ultimo_token = ">>=";
return DIR_ATRIBUICAO;
}

"<<=" {
ultimo_token = "<<=";
return ESQ_ATRIBUICAO;
}

{ID}+ {
ultimo_token = "IDENTIFICADOR ";
ultimo_token += yytext;
yylval.sval = new string(yytext) ;
return IDENTIFICADOR;
}

在 bison 中它在这里不起作用:

expressao_relacional
: expressao_shift { $$ = $1; }
| expressao_relacional LE_OP expressao_shift { $$ = new NOperacaoBinaria($1, Operador::LE_OP, $3, $1->linha); }
| expressao_relacional GE_OP expressao_shift { $$ = new NOperacaoBinaria($1, Operador::GE_OP, $3, $1->linha); }
| expressao_relacional LT_OP expressao_shift { $$ = new NOperacaoBinaria($1, Operador::LT_OP, $3, $1->linha); }
| expressao_relacional BT_OP expressao_shift { $$ = new NOperacaoBinaria($1, Operador::BT_OP, $3, $1->linha); }
;

在这样的代码示例中:if(a > b)。它忽略 > 并匹配而不是 IF '(' expression ')' where expression -> identifier 规则。但是有一个b标识符所以报错...

我用 -d 选项编写了测试扫描器,它打印了这个:

--(end of buffer or a NUL)
--accepting rule at line 434 ("if")
if
--accepting rule at line 274 ("(")
(
--accepting rule at line 478 ("a")
a
--accepting rule at line 484 (" >> ")
--accepting rule at line 478 ("b")
b
--accepting rule at line 280 (")")
)
--accepting rule at line 484 (" ")
--accepting rule at line 446 ("then")
then
--accepting rule at line 484 ("
")
--accepting rule at line 248 ("{")
{
--accepting rule at line 484 ("

")
--accepting rule at line 259 ("}")
}
--(end of buffer or a NUL)
--accepting rule at line 484 ("
")
--(end of buffer or a NUL)
--EOF (start condition 0)

代码:if(a >>b) { }

<< 匹配这条规则:

[ <<EOF>>\0\t\v\r\n\f]+ ; /* eat up whitespace */

为什么?

...

谢谢你...

最佳答案

<<EOF>>不是一个字符,它是一个特殊的弹性规则。所以你不能把它放在[...]里面使其成为角色类的一部分。当您尝试这样做时,字母 < , > , E , OF成为角色类的一部分。

你几乎不需要 <<EOF>>规则,无论如何,您当然不应该试图忽略它。

请记住,当多个模式具有相同的最长匹配时,flex 将在扫描器定义中使用第一个 匹配模式。所以顺序很重要。除非你抑制或忽略 flex 的警告,否则它会告诉你你的 "<""<<"规则永远无法匹配,因为它们被错误的空白规则覆盖了。阅读并尝试理解警告总是很重要的(或者至少询问它们的意思,尤其是当它们看起来相关时。)

根据您关于 EOF 匹配错误模式的评论,我怀疑您正在使用空匹配来触发错误条件。 不要那样做。您的错误(默认)规则应该是定义中的最后一个,并且它应该匹配.|\n。 (或者只是 . 如果你确定 \n 总是匹配一些规则。)这将捕获任何其他无法识别的单个字符,但不会被文件末尾触发,因为,正如我之前所说, <<EOF>> 不是一个字符。

关于c++ - 弹性代币订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22444094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com