0

Я не знаю, как решить эту проблему для работы на дому; нам говорят написать код flex и bison для языка под названием Exp, который предлагает управление структурами: последовательность, условие и повторение. Я написал код, но я не знаю, как построить AST и отобразить его в XML-файле. Вот код Flex:Мне нужна помощь в построении AST (абстрактное синтаксическое дерево) в файле XML

START%{ 
     #include"parser.tab.h" 

    %} 

    lettre [a-z] 
    chiffre [0-9] 

    %x comment 
    %% 


    "/*"        BEGIN(comment); 
    <comment>.       ; 
    <comment>"*/"      BEGIN(INITIAL); 

    debut        return DEBUT; 
    fin         return END; 
    si         return IF; 
    alors        return ALORS; 
    sinon        return SINON; 
    repeter        return REPETER; 
    jusqua        return JUSQUA; 
    pour        return POUR; 
    tantque        return TANTQUE; 
    lire        return READ; 
    ecrire        return ECRIRE; 

    " "|\t        ; 


    {lettre}({chiffre}|{lettre}){0,35} {return ID;} 
    "-"?{chiffre}+      {return NUM;} 
    "=="        return EQUAL; 

    "*"|"/"|"+"|"-"|"="|"<"|">"   return *yytext; 
    "("|")"|","|";"|"."     return *yytext; 

    \n         ; 

    .         { 
             printf("erreur\n"); 
             return 0; 
             } 
    %% 

и вот Bison Код

%{ 
     #include<stdio.h> 


     extern FILE* yyin; 

     int numAffec = 0; 
     int numLecture = 0; 
     int numEcriture = 0; 
     int numnumCondition = 0; 
     int numPour = 0; 
     int numTantque = 0; 
     int numRepeter = 0; 
    %} 


    %start prog 
    %token DEBUT END IF ALORS SINON REPETER JUSQUA POUR TANTQUE READ ECRIRE NUM ID EQUAL 
    %% 

    prog : DEBUT seq_instr END '.' 

    seq_instr : seq_instr instr ';' 
      | instr ';' 

    instr : instr_si   {numCondition++;} 
      | instr_repeter {numRepeter++;} 
      | instr_pour  {numPour++;} 
      | instr_tant_que {numTantque++;} 
      | instr_aff  {numAffec++;} 
      | instr_lect  {numLecture++;} 
      | instr_ecrit 

    instr_si : IF exp ALORS seq_instr END 
      | IF exp ALORS seq_instr SINON seq_instr END 
      ; 


    instr_repeter : REPETER seq_instr JUSQUA '(' exp ')' 
        ;    
    instr_pour : POUR '(' instr_aff ',' exp ',' instr_aff ')' seq_instr END 
        ; 
    instr_tant_que : TANTQUE '(' exp ')' seq_instr END 
        ; 
    instr_aff : ID '=' exp 
       ; 
    instr_lect : READ '(' ID ')' 
       ; 
    instr_ecrit : ECRIRE '(' exp ')'  
       ; 
    exp : exp_simple '<' exp_simple 
     | exp_simple '>' exp_simple 
     | exp_simple EQUAL exp_simple 
     | exp_simple 

    exp_simple : exp_simple '+' term 
       | exp_simple '-' term 
       | term 

    term : term '*' facteur 
     | term '/' facteur 
     | facteur 

    facteur : '(' exp ')' 
      | NUM 
      | ID 

    %% 
    int main(int arg,char** var) { 

     yyin = fopen(var[1],"r"); 

     if(yyin == NULL) { 
      printf("erreur\n"); 
      return ; 
     } 

     yyparse(); 

     printf("Affectation : %d\n",numAffec); 
     printf("Lecture  : %d\n",numLecture); 
     printf("Ecriture  : %d\n",numEcriture); 
     printf("Conditionnel : %d\n",numCondition); 
     printf(" Pour : %d\n",numPour); 
     printf(" Tant Que: %d\n",numTantque); 
     printf(" Repeter : %d\n",numRepeter); 

     return 0; 
    } 
+0

Вы получаете downvoted, потому что вы не показываете никаких доказательств, пытаясь решить проблему. Что вы пробовали? Что вы читали, что не поняли? –

ответ

0

См https://stackoverflow.com/a/25106688/120163 для общего подхода на строительных НРХ.

Вам нужно будет адаптировать это к бизону; на самом деле люди делают это все время и IIRC, справочное руководство по бизону приводит примеры того, как это сделать. Таким образом, вам необходимо внимательно прочитать справочное руководство по бизону.

После того как вы получили AST, вы можете создавать XML из него, выполняя рекурсивную древовидную прогулку и размывание XML-тегов/контента по ходу. Это довольно тривиальный бит кода.