首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要帮助在XML文件中构建一个AST (抽象语法树

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

Stack Overflow用户
提问于 2016-01-29 22:00:35
回答 1查看 366关注 0票数 0

我不知道如何为家庭作业解决这个问题;我们被告知要为一种名为Exp的语言编写灵活而灵活的代码,该语言提供结构控制:顺序、条件和重复。代码是我写的,但我不知道如何构造AST并将其显示在XML文件中。以下是Flex代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
 %{
        #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;
    }
EN

回答 1

Stack Overflow用户

发布于 2016-02-07 19:29:53

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

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

一旦有了AST,就可以通过执行递归树遍历并在遍历时拆分XML标记/内容来从它生成XML。这是一段相当琐碎的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35086390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档