繁体   English   中英

如何使用野牛创建自上而下的“树”结构?

[英]How to create top-down “tree” construction using 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)); }

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

那就不行了。 这是语法参考

请记住,yacc / bison会生成移位减少解析器,而不是递归下降解析器。 如果您想执行类似的操作,则递归下降生成器将更可能允许这样做。 是他们清单

您几乎可以完全按照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;
}

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

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); }

否。yacc /野牛解析器是LALR(1)解析器。 这些是自底向上的解析器。

我不明白你为什么在乎。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM