【发布时间】:2011-07-05 20:42:28
【问题描述】:
我有一个用 flex 编写的词法分析器,它将标记传递给我用 bison 编写的解析器。
以下是我的词法分析器的一小部分:
ID [a-z][a-z0-9]*
%%
rule {
printf("A rule: %s\n", yytext);
return RULE;
}
{ID} {
printf( "An identifier: %s\n", yytext );
return ID;
}
"(" return LEFT;
")" return RIGHT;
还有其他用于解析空格等的位。
那么解析器的一部分看起来是这样的:
%{
#include <stdio.h>
#include <stdlib.h>
#define YYSTYPE char*
%}
%token ID RULE
%token LEFT RIGHT
%%
rule_decl :
RULE LEFT ID RIGHT { printf("Parsing a rule, its identifier is: %s\n", $2); }
;
%%
一切正常,但我只想使用 printf 打印出 ID 令牌 - 仅此而已:)。我不是在编写编译器.. 只是 flex/bison 是我的软件的好工具。你打算如何打印令牌?我打印时会收到(null)。
谢谢。
【问题讨论】:
-
$2将是该规则中的LEFT标记,不是吗?$3不是您要打印的ID令牌吗? -
我以为 $$ 是规则,$1 是 LEFT,$2 是 ID,$3 是 RIGHT?不?我可能错了:s。无论如何..打印出它们中的任何一个($$,$1,...)都会导致(null)所以我做错了其他事情嗯。
-
@alemaster:@Chris Lutz 是对的;规则中的标记从 1 开始编号。
$$是一个可以为其分配指针的变量;然后,该指针将被视为规则的“结果”,并将传递给涉及rule_decl的其他规则。 -
谢谢大家。 +1 给克里斯。任何想法如何打印这些东西?