Я пытаюсь сделать что-то подобное в Бизоне ...
loop_for: FOR var_name COLONEQUALS expression TO
{printf("%s<=", $2);} expression STEP
{printf("%s+=", $2);} expression {printf(")\n");}
Code ENDFOR
Я пытаюсь преобразовать оператор for из синтаксиса поддельного языка в C. Тем не менее, $ 2, которые я использовал для получения var_name, похоже, не работает, так как программа аварийно завершает работу, когда достигает ее. $ X должен работать только для целых чисел?
Я даже пытался добавить объединение и использовать char * для нового типа, но я все еще получаю (ноль) из вышеуказанных действий.
EDIT:
Я попытался исправить это, используя подсказки из вопросов, которые были предоставлены, но я все еще не могу сделать это идеально.
Правила FLEX, о которых идет речь:
"FOR" {printf("for ("); lisnew=0; return FOR;}
"TO" {printf("; "); return TO;}
"STEP" {printf("; "); return STEP;}
"ENDFOR" {printf("\n"); t--; instabs(); printf("}\n"); instabs(); lisnew=1; return ENDFOR;}
[a-zA-Z]+ {printf("%s",yytext); lisnew=0; yylval.strV = yytext; return CHARACTERS;}
":=" {printf("="); lisnew=0; return COLONEQUALS;}
ЗУБНЫЕ правила:
loop_for: FOR var_name {strcpy(myvar, $<strV>2);} COLONEQUALS expression TO {printf("%s<=", myvar);} expression STEP {printf("%s+=", myvar);} expression {printf(")\n");} Code ENDFOR
var_name: name_first_is_char
name_first_is_char: character | character name2
name2: | character name2 | digit name2
Дело в том, для ввода:
FOR i := 0 TO 10 STEP 1
Я получаю в качестве вывода:
for ( i = 0 ; i :=<= 10 ; i :=+= 1
Могу ли я избежать попадания символов: = в strV?
РЕДАКТИРОВАТЬ 2:
Я попробовал еще раз, на этот раз с
var_name: name_first_is_char {memset(myvar, '\0', BUFFER_LENGTH); sprintf(myvar, "%s", $<strV>1);}
Но все же следующие несколько персонажей попадают в myvar.