كيفية بناء صفيف مع بيسون / ياك وقاعدة تكراري

StackOverflow https://stackoverflow.com/questions/1429794

  •  07-07-2019
  •  | 
  •  

سؤال

ومع بيسون، فكنت أحسب كيفية الحصول على كل شيء في سلسلة واحدة طويلة كما يلي:

arg_list:
    WORD arg_list { strcat( $1, "IFS" ); $$ = strcat($1, $2); }  |
    WORD
    ;

وو:

WORD arg_list { printf("%s, %s\n", $1, $2); }

ولكن المشكلة هي أنني بعد ذلك سنضطر إلى تقسيم 2 $ في القاعدة الثانية مرة أخرى لتحليل ذلك. هل هناك وسيلة لتعبئة صفيف بدلا من مجرد استخدام سلسلة؟ أنا ذاهب عن هذا بطريقة خاطئة؟

إذا كنت بحاجة إلى بناء ما يشبه قائمة مرتبطة الذي يمكن أن يكون له معنى، ولكن ليس متأكدا ما يمكن أن يكون الطريقة الصحيحة لربط arg_list، ومن ثم تنظيف الذاكرة.

هل كانت مفيدة؟

المحلول

إذا كان لديك نوع مصفوفة مع عملية push_front، وهذا هو مسلي:

arg_list:
    WORD arg_list { $$ = $2.push_front($1); }
    WORD { $$ = new Array<string>($1); }

وبدون ذلك، فإنه يتطلب المزيد من العمل. يمكنك استخدام ناقلات وإضافة سلاسل في النهاية (التي ستكون في الترتيب عكس). أو يمكنك استخدام قائمة مرتبطة (والذي هو أسهل إذا كنت تستخدم التوالي C):

arg_list:
    WORD arg_list { $$ = malloc(sizeof(struct list_elem));
                    $$->next = $2;
                    $$->val = $1; }
    WORD          { $$ = malloc(sizeof(struct list_elem));
                    $$->next = 0;
                    $$->val = $1; }

نصائح أخرى

%union {
  char *char_ptr;
}
%token STRING
%type <char_ptr> STRING string
%%
...
string:
    STRING        /* Lexic analyzer return STRING and set yylval = yytext; */
  | string STRING
    { char *str = (char*) malloc(strlen($1) + strlen($2) + 1);
      strcpy(str, $1);
      strcat(str, $2);
      free($2);
      free($1);
      $$ = str;
    }
  ;
%%
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top