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]# 
  • 相关阅读:
    最长公共子序列
    BFS 从起始点到目标点的最短步数
    熟悉的A+B
    跳格子 完全背包
    pccontrol_scr
    VB快速读取TextBox第N行的数据 (转载)
    日语初学者会话
    语法着色控件使用典型范例
    2008年日语3级真题
    纯api实现ping主机(仅仅返回是否ping通)
  • 原文地址:https://www.cnblogs.com/gaojian/p/3084987.html
Copyright © 2011-2022 走看看