Как реализовать оператор If во Flex / bison

Я не получаю ошибку, пожалуйста, вы можете помочь мне, вот .l и .y file.thanks.

%{
#include "ifanw.tab.h"
extern int yylval;
%}
%%
"="      { return EQ; }
"!="     { return NE; }
"<"      { return LT; }
"<="     { return LE; }
">"      { return GT; }
">="     { return GE; }
"+"      { return PLUS; }
"-"      { return MINUS; }
"*"      { return MULT; }
"/"      { return DIVIDE; }
")"      { return RPAREN; }
"("      { return LPAREN; }
":="     { return ASSIGN; }
";"      { return SEMICOLON; }
"IF"     { return IF; }
"THEN"   { return THEN; }
"ELSE"   { return ELSE; }
"FI"     { return FI; }
"WHILE"  { return WHILE; }
"DO"     { return DO; }
"OD"     { return OD; }
"PRINT"  { return PRINT; }
[0-9]+   { yylval = atoi(yytext); return NUMBER; }
[a-z]    { yylval = yytext[0] - 'a'; return NAME; }   
\        { ; }
\n       { nextline(); }
\t       { ; }
"//".*\n { nextline(); }
.        { yyerror("illegal token"); }
%%

Yacc-файл

%start ROOT

%token EQ
%token NE
%token LT
%token LE
%token GT
%token GE
%token PLUS
%token MINUS
%token MULT
%token DIVIDE
%token RPAREN
%token LPAREN
%token ASSIGN
%token SEMICOLON
%token IF
%token THEN
%token ELSE
%token FI
%token WHILE
%token DO
%token OD
%token PRINT
%token NUMBER
%token NAME

%%

ROOT:
   stmtseq { execute($1); } 
   ;

statement:
     designator ASSIGN expression { $ = assignment($1, $3); } 
   | PRINT expression { $ = print($2); } 
   | IF expression THEN stmtseq ELSE stmtseq FI
    { $ = ifstmt($2, $4, $6); }
   | IF expression THEN stmtseq FI
    { $ = ifstmt($2, $4, empty()); }
   | WHILE expression DO stmtseq OD { $ = whilestmt($2, $4); }   
   ;

stmtseq:
     stmtseq SEMICOLON statement { $ = seq($1, $3); }
   | statement { $ = $1; }
   ;

expression:
 expr2 { $ = $1; } 
   | expr2 EQ expr2 { $ = eq($1, $3); }
   | expr2 NE expr2 { $ = ne($1, $3); }
   | expr2 LT expr2 { $ = le($1, $3); }
   | expr2 LE expr2 { $ = le($1, $3); }
   | expr2 GT expr2 { $ = gt($1, $3); }
   | expr2 GE expr2 { $ = gt($1, $3); }
   ;

expr2:
     expr3 { $ == $1; }
   | expr2 PLUS expr3 { $ = plus($1, $3); }
   | expr2 MINUS expr3 { $ = minus($1, $3); }
   ;

expr3:
     expr4 { $ = $1; }
   | expr3 MULT expr4 { $ = mult($1, $3); }
   | expr3 DIVIDE expr4 { $ = divide ($1, $3); }
   ;

expr4:
     PLUS expr4 { $ = $2; }
   | MINUS expr4 { $ = neg($2); }
   | LPAREN expression RPAREN { $ = $2; }
   | NUMBER { $ = number($1); }
   | designator { $ = $1; }
   ;

designator:
     NAME { $ = name($1); }
  ;
%%

У меня другой вопрос, есть ли возможность реализовать инструкцию JMP с помощью flex / bison, как в Assembler, чтобы перейти к метке, как мой пример, спасибо за вашу помощь.

:L1
IF FLAG AND X"0001"
    EVT 23;
ELSE
    WAIT 500 ms;
    JMP L1;
END IF; 

Ответы на вопрос(1)

Ваш ответ на вопрос