我不知道如何解决这个家庭工作的问题;我们被告知为一个名为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;
}
答案 0 :(得分:0)
有关构建AST的一般方法,请参阅https://stackoverflow.com/a/25106688/120163。
你需要为野牛量身打造;事实上,人们一直这样做,IIRC,野牛参考手册给出了如何做到这一点的例子。因此,您需要仔细阅读bison参考手册。
一旦拥有 AST,就可以通过执行递归树遍历并在散步时随地吐出XML标记/内容来从中生成XML。这是一段非常简单的代码。