zoukankan      html  css  js  c++  java
  • 程序中,调用Bison和Flex结合的小例子(类似完成语法树)

    接前面的例子:程序中,调用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: %d\n",pointer->adding.left + pointer->adding.right);
    25     }
    26 
    27     if (pointer->flag ==2){
    28        fprintf(stderr,"minusing result is: %d\n",pointer->minusing.left - pointer->minusing.right);
    29     }
    30     
    31     free(pointer);
    32     return 0;
    33 }
    34 
    35 int readInputForLexer( char *buffer, int *numBytesRead, 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 plus\n"); return FUNCTION_PLUS; }
    22 \-      { printf("got minus\n"); return FUNCTION_MINUS; }
    23 {DIGIT}* { printf("got number\n"); yylval = atoi(yytext); return NUMBER; }
    24 \n      { printf("got end of line\n"); 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 *numBytesRead,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: %d\n",$1);
    24            fprintf(stderr,"right value is: %d\n",$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]# 
  • 相关阅读:
    17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication
    17.1.2 Replication Formats
    Setting the Master Configuration on the Slave
    17.1.1.9 Introducing Additional Slaves to an Existing Replication Environment
    17.1.1.8 Setting Up Replication with Existing Data
    17.1.1.7 Setting Up Replication with New Master and Slaves
    17.1.1.6 Creating a Data Snapshot Using Raw Data Files
    列出display的值,并说明它们的作用
    CSS设置DIV居中
    CSS选择符有哪些?哪些属性可以继承?优先级算法如何计算?
  • 原文地址:https://www.cnblogs.com/gaojian/p/3084987.html
Copyright © 2011-2022 走看看