如何设置flex和bison在自己的缓冲区/ getc而不是文件上工作?

时间:2018-07-25 15:58:00

标签: parsing grammar bison flex-lexer

一个简单的问题,但是要弄清楚它是怎么回事...

Flex和Bison是解析流的出色工具。现在,我想从典型的C IO /流转移到更基本的环境。在这种环境下,输入(YYINPUT)是按字符排列的。

我的问题是我需要如何设置词法分析器和解析器,使其与该约束一起使用?

到目前为止,我的设置是

对于flex:

%{

//option noinput
//option nounput

#include <stdio.h>

#define YY_NO_UNISTD_H
%}

%option 8bit reentrant bison-bridge
%option warn noyywrap nodefault
%option debug
%option header-file="my_lex.h"

%%

[ \t]   ; // ignore all whitespace
%%

关于野牛:

%{
#include <stdio.h>
#include <stdlib.h>

#define YY_NO_UNISTD_H

#include "my_lex.h" 
#include "my_par.h"

int my_yyInput( char *buffer, int *numBytesRead, int maxBytesToRead );

#undef YY_INPUT
#define YY_INPUT(b,r,s) my_yyInput(b,&r,s)
%}

%define parse.error verbose
%define api.pure 
%lex-param {void *scanner}
%parse-param {void *scanner}

%union {
    char val[64];
}

%token<val> T_PARAM

%token T_NEWLINE

%start notification

%%
notification: 
       | notification line
;

line: T_NEWLINE
    | T_PARAM T_NEWLINE
    ;


%%
int my_yyInput( char *buffer, int *numBytesRead, int maxBytesToRead ) {
    int i;
    *numBytesRead = 0;
    for (i = 0; i < maxBytesToRead; i++) {
        if ( 0 == k_msgq_get(&rxQ, buffer, MSEC(100))) {
            buffer++;
            (*numBytesRead)++;
        } else {
            // timeout read
            // return 1
        }
    }
    return 0;
}


void yyerror(void scanner, const char* s) {
    printk("Parse error: %s\n", s);
}

0 个答案:

没有答案