Yacc/Bison:伪变量($$,$ 1,$ 2,..)以及如何使用printf打印它们

ale*_*ale 3 yacc bison

我有一个用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;
Run Code Online (Sandbox Code Playgroud)

还有其他位用于解析空白等.

然后解析器的一部分看起来像这样:

%{
#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); }
    ;

%%
Run Code Online (Sandbox Code Playgroud)

它一切正常,但我只想用printf打印出ID令牌 - 这就是全部:).我不是在编写编译器......只是flex/bison是我软件的好工具.你打算怎么打印令牌?(null)我打印时就得到了.

谢谢.

Aas*_*set 7

我不是yacc的专家,但我处理从词法分析器到解析器的过程的方式如下:对于每个词法分析器,你应该有一个单独的规则来"转换" yytext成适合的形式你的解析器.在您的情况下,您可能只对yytext自己感兴趣(如果您正在编写编译器,则将其包装在SyntaxNode对象或类似的东西中).尝试

%token ID RULE 
%token LEFT RIGHT

%%

rule_decl:
    RULE LEFT id RIGHT { printf("%s\n", $3); }

id:
    ID { $$ = strdup(yytext); }
Run Code Online (Sandbox Code Playgroud)

关键是最后一条规则可用作可由涉及的规则引用yytext的$变量id.