【问题标题】:How to create top-down "tree" construction using bison?如何使用野牛创建自上而下的“树”结构?
【发布时间】:2014-01-24 22:16:06
【问题描述】:

我找到了this example,但它会创建自下而上的树。是否可以使用 bison、flex 创建树自上而下?

伪代码:

block(parent):
    { current = new Block(); parent.addBlock(this); }
    BLOCK_BEGIN_TOKEN block_content(current) BLOCK_END_TOKEN
    ;

block_content(parent)
    : block_content(parent) statement(current)
    | block_content(parent) block(current)
    | statement(parent) 
    | block(parent)
    ;

statement(parent)
    : STATEMENT_TOKEN { parent.addStatement(new Statement($1)); }

【问题讨论】:

    标签: parsing bison flex-lexer parser-generator compiler-compiler


    【解决方案1】:

    您几乎可以完全按照btyacc 的描述进行操作。你可以写:

    %union {
        Statement *stmt;
        Block *blk;
    }
    
    %token BLOCK_BEGIN_TOKEN BLOCK_END_TOKEN
    %token<stmt> STATEMENT_TOKEN
    
    %type block(<blk>) block_content(<blk>) statement(<blk>)
    
    %%
    
    input: block(new Block())
         ;
    
    block($parent):
        BLOCK_BEGIN_TOKEN block_content(new_block($parent)) BLOCK_END_TOKEN
        ;
    
    block_content($parent)
        : block_content($parent) statement($parent)
        | block_content($parent) block($parent)
        | statement($parent)
        | block($parent)
        ;
    
    statement($parent)
        : STATEMENT_TOKEN { $parent->addStatement($1); }
    
    %%
    
    Block *new_block(Block *parent) {
        Block *b = new Block();
        parent->addBlock(b);
        return b;
    }
    

    你可以在 bison 中做同样的事情,但是你必须使用带有显式类型标签的嵌入式操作:

    block:
        BLOCK_BEGIN_TOKEN { $<blk>$ = new_block($<blk>0); } block_content BLOCK_END_TOKEN
        ;
    
    block_content
        : block_content { $$=$0; } statement
        | block_content { $$=$0; } block
        | statement
        | block
        ;
    
    statement
        : STATEMENT_TOKEN { $<blk>0->addStatement($1); }
    

    【讨论】:

    • 感谢您的解决方案。它让我的很多工作变得更轻松、更好:)
    【解决方案2】:

    就像在您的示例中一样,yacc/bison 是否有办法对产生式中的非终结符进行参数化,从而将其等同于对生成函数的调用?

    那就是不;这是reference for the syntax

    请记住,yacc/bison 生成 shift-reduce 解析器而不是递归下降解析器。如果你想做这样的事情,递归下降生成器更有可能允许它。这是list of them

    【讨论】:

      【解决方案3】:

      没有。 yacc/bison 解析器是 LALR(1) 解析器。这些是自下而上的解析器。

      我不明白你为什么在乎。

      【讨论】:

      • @Miro 但不是野牛。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多