0

我不知道如何解決這個家庭作業問題;我們被告知爲一個名爲Exp的語言編寫flex和bison代碼,該代碼提供結構控制:序列,條件和重複。 我編寫了代碼,但我不知道如何構建AST並將其顯示在XML文件中。這裏是Flex代碼:我需要幫助來構建XML文件中的AST(抽象語法樹)

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

,這裏是野牛代碼

%{ 
     #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

由於您沒有顯示試圖解決問題的證據,因此您正在陷入低谷。你嘗試了什麼?你讀了什麼,你不明白? –

回答

0

對建築物的AST的一般方法見https://stackoverflow.com/a/25106688/120163

你需要爲此量身打造野牛;事實上,人們一直都在這樣做,IIRC,野牛參考手冊給出瞭如何做到這一點的例子。所以,你需要仔細閱讀野牛參考手冊。

一旦你的AST,你可以通過你做步行做遞歸樹的步行路程,隨地吐痰的XML標籤/內容製作從它的XML。這是一個非常簡單的代碼。