yacc 解析器在左递归后缀之前减少
yacc parser reduces before left recursion suffix
我在 yacc 中编写了一个非常简单的左递归语法,它基于一种简单的类 C 语言的数据类型。生成的yacc解析器在左递归后缀之前减少,我不知道为什么。
这里是源代码:
%%
start: type {
printf("Reduced to start.\n");
};
type: pointer {
printf("Reduced pointer to type.\n");
}
| char {
printf("Reduced char to type.\n");
};
char: KW_CHAR {
printf("Reduced to char.\n");
};
pointer: type ASTERISK {
printf("Reduced to pointer.\n");
};
%%
给定输入 char *
(KW_CHAR 星号):
Reduced to char.
Reduced char to type.
syntax error
您似乎并没有询问您收到的解析错误(如评论中所述,这可能是 yylex()
返回的令牌类型的问题),而是为什么解析器缩减是按照您的跟踪显示的顺序执行的。这就是我将在此处尝试解决的问题,即使它很可能是 XY problem,因为理解降序很重要。
在这种情况下,减少顺序非常简单。如果您有作品:
pointer: type ASTERISK
然后 type
必须在移动 ASTERISK
之前减少。在 LR 解析器中,当要减少的 right-hand 端恰好在最后消耗的输入标记处结束时,必须完成减少。 (先行标记已被词法扫描器识别,但尚未被解析器使用。因此它不是归约的一部分,也可用于识别在同一点结束的其他归约。)
我希望制作中的原因更明显
type: char
char
需要在type
之前减少。在 char
被归约之前,它不能用于 type
的归约。
真的,这两个示例显示了相同的行为。缩减是 left-to-right,并且是自下而上(即首先 children)。因此,这种解析的名称。
所以你的解析器显示的缩减顺序(首先是 char
,然后是 type
,只有在 *
被移动之后,pointer
)正是意料之中。
我在 yacc 中编写了一个非常简单的左递归语法,它基于一种简单的类 C 语言的数据类型。生成的yacc解析器在左递归后缀之前减少,我不知道为什么。
这里是源代码:
%%
start: type {
printf("Reduced to start.\n");
};
type: pointer {
printf("Reduced pointer to type.\n");
}
| char {
printf("Reduced char to type.\n");
};
char: KW_CHAR {
printf("Reduced to char.\n");
};
pointer: type ASTERISK {
printf("Reduced to pointer.\n");
};
%%
给定输入 char *
(KW_CHAR 星号):
Reduced to char.
Reduced char to type.
syntax error
您似乎并没有询问您收到的解析错误(如评论中所述,这可能是 yylex()
返回的令牌类型的问题),而是为什么解析器缩减是按照您的跟踪显示的顺序执行的。这就是我将在此处尝试解决的问题,即使它很可能是 XY problem,因为理解降序很重要。
在这种情况下,减少顺序非常简单。如果您有作品:
pointer: type ASTERISK
然后 type
必须在移动 ASTERISK
之前减少。在 LR 解析器中,当要减少的 right-hand 端恰好在最后消耗的输入标记处结束时,必须完成减少。 (先行标记已被词法扫描器识别,但尚未被解析器使用。因此它不是归约的一部分,也可用于识别在同一点结束的其他归约。)
我希望制作中的原因更明显
type: char
char
需要在type
之前减少。在 char
被归约之前,它不能用于 type
的归约。
真的,这两个示例显示了相同的行为。缩减是 left-to-right,并且是自下而上(即首先 children)。因此,这种解析的名称。
所以你的解析器显示的缩减顺序(首先是 char
,然后是 type
,只有在 *
被移动之后,pointer
)正是意料之中。