【问题标题】:I Need Help to construct an AST (abstract syntax tree ) in XML File我需要帮助在 XML 文件中构造 AST(抽象语法树)
【发布时间】:2016-01-29 14:00:34
【问题描述】:

我不知道如何为家庭作业解决这个问题;我们被告知为一种名为 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;
                                        }
    %%

这是野牛代码

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

【问题讨论】:

  • 你被否决了,因为你没有表现出试图解决问题的证据。你尝试了什么?你读到了什么,你不明白?

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


【解决方案1】:

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

您需要根据野牛进行调整;事实上人们一直这样做,IIRC,野牛参考手册给出了如何做到这一点的例子。所以,你需要仔细阅读野牛参考手册。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多