我需要帮助在XML文件中构建AST(抽象语法树)

时间:2016-01-29 14:00:35

标签: compiler-construction bison abstract-syntax-tree flex-lexer

我不知道如何解决这个家庭工作的问题;我们被告知为一个名为Exp的语言编写一个flex和bison代码,它提供结构控制:序列,条件和重复。 我编写了代码,但我不知道如何构建AST并将其显示在XML文件中。这是Flex代码:

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 Code

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

1 个答案:

答案 0 :(得分:0)

有关构建AST的一般方法,请参阅https://stackoverflow.com/a/25106688/120163

你需要为野牛量身打造;事实上,人们一直这样做,IIRC,野牛参考手册给出了如何做到这一点的例子。因此,您需要仔细阅读bison参考手册。

一旦拥有 AST,就可以通过执行递归树遍历并在散步时随地吐出XML标记/内容来从中生成XML。这是一段非常简单的代码。