一个简单的问题,但是要弄清楚它是怎么回事...
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);
}