Intereting Posts

Как построить массив с Bison / Yacc и рекурсивным правилом

С Бизоном я понял, как все вложить в одну длинную строку следующим образом:

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($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  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; } ; %%