程序中,调用Bison和Flex结合的小例子(类似完成语法树)
发布时间:2020-12-15 04:00:14 所属栏目:百科 来源:网络整理
导读:接前面的例子:程序中,调用Bison和Flex结合的小例子 要做出存储语法树结构的全局变量: 1 [root@lex ~]# cd /soft/ total 2 [root@lex total]# ls 3 lexer.l lex.yy.c myparser myparser.c myparser.h parser.y y.tab.c y.tab.h 4 [root@lex total]# cat my
接前面的例子:程序中,调用Bison和Flex结合的小例子 要做出存储语法树结构的全局变量: 1 [root@lex ~]# cd /soft/total 2 [root@lex total]# ls 3 lexer.l lex.yy.c myparser myparser.c myparser.h parser.y y.tab.c y.tab.h 4 [root@lex total]# cat myparser.h 5 typedef struct ABlock{ 6 int left; 7 int right; 8 }AB; 9 10 typedef struct MBlock{ 11 int left; 12 int right; 13 }MB; 14 15 typedef struct Parsetree{ 16 int flag; /*0 is init,1 is adding,2 is minusing*/ 17 AB adding; 18 MB minusing; 19 }Parse,*Pointer; 20 Pointer pointer; 21 [root@lex total]# 主程序中,要完成以下几件事: 声明语法树指针(实际在上述头文件中完成) 调用词法分析/语法分析,得到语法树 根据语法树进行运算 1 [root@lex total]# cat myparser.c 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include "myparser.h" 6 7 int yyparse(); 8 int readInputForLexer( char *buffer,int *numBytesRead,int maxBytesToRead ); 9 10 static int globalReadOffset; 11 // Text to read: 12 static const char *globalInputText = "23 - 5"; 13 14 int main() { 15 16 pointer=malloc(sizeof(struct Parsetree) ); 17 pointer->flag=0; 18 19 globalReadOffset = 0; 20 yyparse(); 21 22 //calculation 23 if (pointer->flag ==1){ 24 fprintf(stderr,"addding result is: %dn",pointer->adding.left + pointer->adding.right); 25 } 26 27 if (pointer->flag ==2){ 28 fprintf(stderr,"minusing result is: %dn",pointer->minusing.left - pointer->minusing.right); 29 } 30 31 free(pointer); 32 return 0; 33 } 34 35 int readInputForLexer( char *buffer,int maxBytesToRead ) { 36 int numBytesToRead = maxBytesToRead; 37 int bytesRemaining = strlen(globalInputText)-globalReadOffset; 38 int i; 39 if ( numBytesToRead > bytesRemaining ) { numBytesToRead = bytesRemaining; } 40 for ( i = 0; i < numBytesToRead; i++ ) { 41 buffer[i] = globalInputText[globalReadOffset+i]; 42 } 43 *numBytesRead = numBytesToRead; 44 globalReadOffset += numBytesToRead; 45 return 0; 46 } 47 [root@lex total]# 词法分析和句法分析基本不变: 1 [root@lex total]# cat lexer.l 2 %{ 3 4 #include "y.tab.h" 5 #include <stdio.h> 6 7 8 #undef YY_INPUT 9 #define YY_INPUT(b,r,s) readInputForLexer(b,&r,s) 10 11 #ifndef YYSTYPE 12 #define YYSTYPE int 13 #endif 14 extern YYSTYPE yylval; 15 16 %} 17 18 DIGIT [0-9] 19 %% 20 21 + { printf("got plusn"); return FUNCTION_PLUS; } 22 - { printf("got minusn"); return FUNCTION_MINUS; } 23 {DIGIT}* { printf("got numbern"); yylval = atoi(yytext); return NUMBER; } 24 n { printf("got end of linen"); return EOL;} 25 %% 26 27 28 void yyerror(char* s) { 29 printf("error %s n",s); 30 } 31 32 int yywrap() { 33 return -1; 34 } 35 [root@lex total]# 1 [root@lex total]# cat parser.y 2 %{ 3 #include <stdio.h> 4 #include "myparser.h" 5 extern void yyerror(char* s); 6 extern int yylex(); 7 extern int readInputForLexer(char* buffer,int maxBytesToRead); 8 %} 9 10 11 %token FUNCTION_PLUS FUNCTION_MINUS NUMBER EOL 12 13 %% 14 exp: 15 NUMBER FUNCTION_PLUS NUMBER { 16 fprintf(stderr,"---n"); 17 pointer->flag=1; 18 pointer->adding.left=$1; 19 pointer->adding.right=$3; 20 } 21 | 22 NUMBER FUNCTION_MINUS NUMBER { 23 fprintf(stderr,"left value is: %dn",$1); 24 fprintf(stderr,"right value is: %dn",$3); 25 pointer->flag=2; 26 pointer->minusing.left=$1; 27 pointer->minusing.right=$3; 28 } 29 ; 30 %% 31 [root@lex total]# 编译和运行: [root@lex total]# yacc -d parser.y [root@lex total]# lex lexer.l [root@lex total]# gcc -o myparser *.c [root@lex total]# ./myparser got number got minus got number left value is: 23 right value is: 5 minusing result is: 18 [root@lex total]# (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |