Bison - 如何打印解析树

2023-12-12

你好,我正在研究一头小野牛,以了解它是如何工作的。野牛应该解析一个句子。 句子是由表达式组成的,表达式是由单词组成的。

以下是我的代码:

%{
#include <stdio.h>
#include <string.h>


void yyerror(const char *str)
{
    fprintf(stderr,"error: %s\n",str);
}

int yywrap()
{
    return 1;
}

main()
{
    yyparse();
}

%}

%token ASSIGN RANGE OR AND WHITESPACE QUOTE LPAREN RPAREN NOT GREATER LESS

%union 
{
        int number;
        char *string;
}

%token <number> VALUE
%token <string> WORD

%type <string> term
%type <string> expression
%%

query:   /* empty */
    | query expression 
    {
        printf("WOrd:%s",$2);
    }
    ;

expression:
     term
    |expression term
    |expression AND term
        {
            printf("AND");
        }
    ;

term:
    WORD
    {
        $$=$1;
    }
    ;

因此,当用户输入一个单词时,它应该打印出该单词。 用户应该能够输入: 词,词词,词和词

我不知道如何使用 $$ 传递单词并从“查询表达式”规则中打印出来。 我该怎么做呢?

这是我的弹性:

%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
%}
%%
[0-9]+                  yylval.number=atoi(yytext);return VALUE;
[a-zA-Z][a-zA-Z]*       yylval.string=strdup(yytext);return WORD;
":"                     return ASSIGN;
"and"|"&"|"&&"          return AND; 
".."                    return RANGE;
"-"                     return NOT;
"|"                     return OR;
"\""                    return QUOTE;
">"                     return GREATER;
"<"                     return LESS;
\n                      /* ignore end of line */;
\t                      /* ignore end of line */;

%%

提前非常感谢。 莎拉


通常,编写解析器的目的是最终得到表示输入的数据结构。然后,您可以以某种方式转换结构,或者,在您的情况下,只需将其打印出来。

在每个表达式生成中,您希望在该结构中构造一个节点来表示您到目前为止所识别的内容。

我有点生疏了,但它会是这样的:

query:   /* empty */
     | query expression { printNode($2); /* printf()s are in here */ }
;

expression: term { $$ = makeTermNode($1); }
          | expression OR term { $$ = makeOrNode($1, $3); }
          | expression AND term  { $$ = makeAndNode($1, $3); }
;

保存节点的数据结构:

struct Node {
    int nodeType;          /* WORD or operator token like AND, OR */
    node* leftOperand;
    node* rightOperand;    /* will be null if the node is a term */
}

%union 
{
    int number;
    char *string;
    Node *node;
}

Update:

我已经有一段时间没有用 C 编写代码了,所以我不得不求助于伪代码。这里没有代码可以在我们使用完内存后回收内存。对任何其他错误表示歉意。

struct Node *makeTermNode(int word) {
    Node *node = malloc(sizeof struct Node);
    node->nodeType = word;
    node->rightOperand = null;
    node->leftOperand = null;
    return node;
}

请注意,您的 WORD 标记仅表示扫描了某种类型的字母串;特定的字母顺序将被丢弃。 (如果您想知道序列,请让您的词法分析器返回 yytext 的副本而不是 WORD 标记。)

struct Node *makeAndNode(struct Node* leftOperand, struct Node *rightOperand) {
    Node *node = malloc(sizeof struct Node);
    node->nodeType = AND;
    node->leftOperand = leftOperand;
    node->rightOperand = rightOperand;
    return node;
}

makeOrNode() 也是如此。或者,您可以只编写 makeNodeWithOperator(int operator, struct Node* leftOperand, struct Node *rightOperand) 来处理“and”和“or”情况。

我将 printAllNodes() 更改为 printNode()。它从我们构建的表达式树结构的根部开始,首先递归访问每个子表达式的左侧,然后是右侧。事情是这样的:

void printNode (struct Node* node) {
    switch (node->nodeType) {
    case WORD:
        printf("%i", node->nodeType);
        return;
    case AND:
    case OR:
        printf("(");
        printNode(node->leftOperand);
        printf("%i", node->nodeType);
        printfNode(node->rightOperand);
        printf(")");
        return;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bison - 如何打印解析树 的相关文章

  • Windows10下配置flex+bison(附运行例子)

    Windows10下配置flex 43 bison xff08 附运行例子 xff09 因为最近上编译课 xff0c 老师要求我们自己安装配置flex xff08 她还强调说windows配置很简单的网上一搜一大把教程 xff09 xff0
  • GCC 在 bison 生成的头文件中显示“数字常量之前的语法错误”

    当我使用 bison parser y d t 编译 y 文件 然后将 parser tab h 文件包含在我的 Flex 文件中时 gcc 说 错误 数字常量之前有语法错误 它引用第 32 行 这是 yytokentype 枚举中的第一行
  • 尝试使用 GNU GMP 库中的类型作为 Bison 的 yylval 类型时出错

    我正在尝试使用该类型mpz t来自 GMP 库的类型yylval通过在 Bison 文件中包含以下内容 define api value type mpz t 我检查了生成的解析器 它正确生成了该行typedef mpz t YYSTYPE
  • 回溯如何与标记一起使用?

    我在互联网上进行了搜索 但找不到关于回填如何工作的正确解释 您能解释一下回溯是如何工作的吗 它如何与markers 我知道它有两种主要类型的标记 其中有下一个四边形 其中包含下一个列表 I found 这段代码 其中他们获取输入文件并使用
  • 如何为 flex 和 bison 编写工作 cmake 文件?

    我正在编写一个小型解析器 但在使用 cmake 时遇到问题 我的目的是 flex F l gt F cc bison B y gt B cc my program cc F cc B cc gt 库 我的第一次尝试 FIND PACKAGE
  • Flex 换行扫描野牛

    我想使用相同的 flex bison 扫描仪 解析器作为解释器并加载要解释的文件 在这两种情况下我都无法让换行符解析正常工作 解释器 有一个提示 我可以输入按 ENTER 终止的命令 文件 这是一个示例输入文件 切 begin print
  • 如何使用 Bison 实现“隐式乘法”规则?

    我正在为数学表达式解析器编写 Bison 文件 到目前为止 一切都很好 但我面临着隐式乘法的问题 你看 我想支持这样的表达2x sin 4x cos 4x 它应该像这样解析2 x sin 4 x cos 4 x 这里没什么太糟糕的 但请考虑
  • 如何使用 Bison 解析 C 字符串

    Closed 这个问题需要细节或清晰度 目前不接受答案 我的 C 文件中有一个字符串 如下所示 char test print x 我想用我编写的 Bison 解析器来解析它 是否可以 Bison 解析器根本不读取输入 他们只是通过重复调用
  • Bison 语义谓词语法错误,杂散“#”

    我正在尝试使用 Bison 的语义谓词 https www gnu org software bison manual html node Semantic Predicates html Semantic Predicates功能 但我在
  • YAML 解析 - lex 还是手工?

    我正在尝试编写一个简单的 YAML 解析器 我从 yaml org 阅读了规范 在开始之前 我想知道是否编写一个手卷解析器更好 或者 使用lex flex bison 我看了看libyaml C 库 好像没用lex yacc YAML 不包
  • 对“yylex”的未定义引用

    我正在尝试使用 flex 和 bison 解析一个输入文件 但在编译程序时遇到一个困难 我附上了我的 Flex 和 Bison 代码以及我收到的错误 请帮我解决这些错误 lex l include
  • 我的 Flex 文件输出错误

    我编写了一个 l 文件并希望输出 c17 isc 中的内容 但有一个错误我不知道为什么 我已经给出了我打算读取的文件 flex文件和执行结果 这是 c17 isc 文件 内容的意思是 number gate name gate type o
  • 无法配置 CMake 来查找 Bison 的 Homebrew 安装版本

    我正在运行 macOS 10 14 并且安装了bison版本 3 2 与brew 但它拒绝链接 brew link bison force Warning Refusing to link macOS provided software b
  • 编写编译器……什么是对的,什么是错的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Flex 和 Bison 编译时未定义对“_yyerror”的引用

    我正在尝试为迷你 Pascal 语言制作一个编译器 我为此使用了 Flex 和 Bison 并且出现了这个错误 我的 Flex 文件 include y tab h include
  • Flex/Bison IDE? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个良好的开发环境 可以在 Flex 或 Bison 或两者上工作 是否有任何 IDE 具有
  • vc++下编译bison和flex程序时unistd.h相关困难

    我正在使用 bison flex 通过 cygwin 下载 和 vc 当我编译程序时 出现错误 fatal error C1083 Cannot open include file unistd h No such file or dire
  • 如何将 C++ flex 与 C++ Bison 连接起来?

    我正在尝试将 C flex 与 C bison 连接起来 但我被难住了 Bison 3 8 1 手册有一个带有 C Flex 的 C Bison 示例 Flex 2 6 4 没有示例 我试图解决的问题是如何向 C 或 C Bison 提供指
  • 在 Mac OS X 10.6 上编译和执行莎士比亚编程语言转换器 spl2c 会导致警告/错误

    我想尝试一下莎士比亚编程语言 http shakespearelang sourceforge net report shakespeare 所以我从here http shakespearelang sourceforge net 并使用
  • 无法弄清楚为什么 Bison 抛出“由于冲突,规则在解析器中无用”

    我正在为一种非常简单的编程语言编写 BNF 语法 并使用 Flex 和 Bison 进行编译 我只有 3 种变量和常量类型 实数 整数 字符串 我的 l 文件具有 ID 的标记定义 如下所示 DIGIT 0 9 LETTER a zA Z

随机推荐