我有一个用flex编写的词法分析器,它将令牌传递给我在野牛中编写的解析器。
以下是我的词法分析者的一小部分:
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)
。
谢谢。
答案 0 :(得分:7)
我不是yacc的专家,但我处理从词法分析器到解析器的过程的方式如下:对于每个词法分析器,你应该有一个单独的规则来“翻译”{{ 1}}为您的解析器提供合适的表单。在您的情况下,您可能只对yytext
本身感兴趣(如果您正在编写编译器,则将其包装在yytext
对象或类似的东西中)。尝试
SyntaxNode
关键是最后一条规则使%token ID RULE
%token LEFT RIGHT
%%
rule_decl:
RULE LEFT id RIGHT { printf("%s\n", $3); }
id:
ID { $$ = strdup(yytext); }
可用作yytext
变量,可由涉及$
的规则引用。