野牛,@1 和 1 美元之间的区别



我正在编写一个Pascal编译器,并且已经有了工作语法。现在我想从语义分析开始,但实际上不明白它在野牛中是如何工作的。不知何故,我通过尝试每个选项编写了一段工作代码,我想知道@1和$1之间有什么区别。

uint_values_split_by_comma:
UINT {
pas::ic_label label = ctx->tab->new_label();
ctx->tab->add_label_entry(@1, $1, label);
}
| uint_values_split_by_comma COMMA UINT {}
;

还看到了野牛文档,还是不明白。

编写语义操作时,$n引用语义值并@n位置。

这是来自Bison文档的一个例子:

expr: expr '+' expr   { $$ = $1 + $3; } ;

$1引用左表达式的值,$3引用右表达式的值。

关于位置,在文档中,我们可以阅读:

与语义值一样,可以使用一组专用构造在操作中访问位置。在上面的示例中,整个分组的位置是 @$,而子表达式的位置是 @1 和 @3。

下面是语义位置用法的示例:

exp:
…
| exp '/' exp
{
@$.first_column = @1.first_column;
@$.first_line = @1.first_line;
@$.last_column = @3.last_column;
@$.last_line = @3.last_line;
if ($3)
$$ = $1 / $3;
else
{
$$ = 1;
fprintf (stderr, "%d.%d-%d.%d: division by zero",
@3.first_line, @3.first_column,
@3.last_line, @3.last_column);
}
}

在此示例中,使用位置可以打印包含错误精确位置的详细错误消息。

最新更新