Я не уверен, как выводить (сложную) полезную информацию, когда в моем парсере бизонов - PullRequest
1 голос
/ 09 января 2012

Я пишу Flex / Bison Lexer / Parser, чтобы разобрать сценарий моего собственного дизайна, как задание для университета.Он идет очень хорошо, и мой скрипт правильно анализирует, обнаруживает любые ошибки и т. Д., И распознает токены, и передает смысловые значения.

Однако я немного не уверен, как перевести это в полезную информацию ... Мне просто нужно вывести простой текст, который сам по себе достаточно прост, однако я борюсь с логикой того, где это сделать вYacc.

Например, скажем, мой yacc - что-то вроде этого -

statement : 
   DRAW shape AT location  { printf("Draw shape at location"); } 
;

shape : 
   CUBE 
  | PYRAMID
  | SPHERE 
; 

location : 
   '(' NUMBER ',' 'NUMBER' ',' 'NUMBER' ')' { int x = $2; int y = $4; int z = $6;
                                              printf("%d,%d,%d",x,y,z); 
; 

Я хотел бы, чтобы он распечатал что-то вроде drawShape (shape, x, y, z);- но я не уверен, как передать семантические значения из местоположения в утверждение или как определить, был ли найденный маркер формы кубом, пирамидой или сферой.

В данный момент сначала запускается оператор печати в местоположении, поэтому мой вывод выглядит примерно так:

1,2,3Драфа в местоположении

Isлучше всего просто создать некоторые переменные для хранения семантических значений из местоположения и использовать их для каждого оператора?(Это кажется немного неаккуратным, но я не уверен, как это сделать лучше.)

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Обычный способ состоит в том, чтобы каждое действие создавало структуру данных, которая возвращается через $$ и используется более поздними действиями.Например, у вас может быть

%union {
    int      ival;
    struct {
        int  x,y,z;
    }        coord;
}

%token<ival>  NUMBER
%type<coord>  location

%%

statement:
    DRAW shape AT location { printf("Draw shape at (%d,%d,%d)\n", $4.x, $4.y, $4.z); }
;

location:
    '(' NUMBER ',' NUMBER ',' NUMBER ')'  { $$.x = $2; $$.y = $4; $$.z = $6; }
;
0 голосов
/ 09 января 2012

Я пошел дальше и изменил это на -

statement:
    DRAW shape AT location {printf("Draw shape at (%d, %d, %d)",x,y,z); }
;

location :
    '(' NUMBER ',' NUMBER ',' NUMBER ')' {x=$2; y=$4; z=$6); 
; 

Это работает правильно, однако мне было бы интересно, если есть более элегантное решение?

...