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

2024-05-05

我有一个用 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)当我打印时。

谢谢。


我不是 yacc 专家,但我处理从词法分析器到解析器的转换的方式如下:对于每个词法分析器标记,您应该有一个单独的规则来“翻译”yytext转换为适合您的解析器的形式。就您而言,您可能只是感兴趣yytext本身(如果你正在编写一个编译器,你会将它包装在一个SyntaxNode对象或类似的东西)。尝试

%token ID RULE 
%token LEFT RIGHT

%%

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

id:
    ID { $$ = strdup(yytext); }

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yacc/Bison:伪变量($$、$1、$2、..)以及如何使用 printf 打印它们 的相关文章

随机推荐