【发布时间】:2014-03-16 22:43:28
【问题描述】:
我在 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;
}
在野牛中它在这里不起作用:
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 */
为什么?
...
谢谢你...
【问题讨论】:
-
您需要显示更多的语法和/或扫描规则。 (例如,标识符的扫描器规则是什么?)另外,bison 是否报告任何冲突?
-
看起来不错。例如,如果将“.”替换为“>”并测试一个 . b,它有效。它不工作 >>、、>=、= 和 >b) { }。似乎 flex 没有返回 "
-
flex 会给你任何警告吗?您是否尝试过使用
-d选项构建一个调试扫描器,它将为每个识别的令牌打印一条消息? -
我写了一个测试扫描器和这段代码:if (a >> b) then { },它打印了:if, (, a, b, then, {, }。
-
当然是把+1识别为一个token。您的数字规则是
[+-]?0?{D}+,它明确允许+作为数字的一部分。
标签: c++ compiler-construction bison flex-lexer