0

Я нашел this example, но он создает древовидную структуру. Можно ли создать древовидную структуру дерева с помощью зубров, 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)); } 

ответ

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

Вы можете сделать то же самое в бизона, но вы должны использовать встроенные действия с явными тегами типа:

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

Спасибо за решение. Это сделало мою работу намного проще и приятнее :) – kravemir

1

Так как в вашем примере это Yacc/бизон есть способ параметризующих нетерминалы в постановках, тем самым приравнивая его к вызову генерируемой функции?

Это было бы не так; здесь reference for the syntax.

Имейте в виду, что yacc/bison генерирует парсеры с уменьшением сдвига, а не рекурсивные спускающиеся. Если вы хотите сделать что-то подобное, генератор рекурсивного спуска будет с большей вероятностью разрешить это. Вот list of them.

-1

Нет. Анализатор yacc/bison является парсером LALR (1). Это синтаксические анализаторы снизу вверх.

Я не понимаю, почему вы заботитесь.

+0

Неправильный ответ, это может быть сделано, см Anwer выше:) – kravemir

+0

@ Миро Но не с бизоном. – EJP

 Смежные вопросы

  • Нет связанных вопросов^_^