【问题标题】:Yacc/Bison: The pseudo-variables ($$, $1, $2,..) and how to print them using printfYacc/Bison:伪变量($$、$1、$2、..)以及如何使用 printf 打印它们
【发布时间】: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 给克里斯。任何想法如何打印这些东西?

标签: yacc bison


【解决方案1】:

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

%token ID RULE 
%token LEFT RIGHT

%%

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

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

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

【讨论】:

  • 谢谢你 Aasmund.. 只是想弄清楚为什么“错误:'yytext' undeclared (first use in this function)”正在发生,但我可能遗漏了一些东西。
  • @alemaster:在最顶部使用extern char yytext[];,或者可能使用extern char * yytext;
  • 非常感谢。仅供参考:您的第二个选项有效,但第一个选项没有打印(而不是(null))。谢谢你:)。
  • @alemaster:很好。我似乎记得被不同的 YACC 实现咬住了,对于是否使用 char[]char* 有不同的约定;这就是我提供两者的原因。可能还有一个控制类型的选项,但我不记得它是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多