Проблемы зависимости с флексом / бизоном - PullRequest
0 голосов
/ 14 февраля 2012

Я пытаюсь скомпилировать простой пример калькулятора, который я нашел в Интернете для моей встроенной среды, но у меня есть несколько трудностей, связанных с зависимостями с flex / bison.

Вот мои тестовые файлы:

lexer.l

%{
// lexer.l     From tcalc: a simple calculator program
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "tcalc.tab.h"
extern YYSTYPE yylval;

%}
%option noyywrap
%option never-interactive
%option nounistd
delim         [ \t]
whitesp       {delim}+
digit         [0-9]
number        [-]?{digit}*[.]?{digit}+
%%
{number}  { sscanf(yytext, "%lf", &yylval); return NUMBER;}
"+"       { return PLUS; }
"-"       { return MINUS; }
"/"       { return SLASH; }
"*"       { return ASTERISK; }
"("       { return LPAREN; }
")"       { return RPAREN; }
"\n"      { return NEWLINE; }
{whitesp} { /* No action and no return */}

tcalc.y

/* tcalc.y - a four function calculator */
%{
#define YYSTYPE double      /* yyparse() stack type */
#include <stdlib.h>
%}
/* BISON Declarations */
%token NEWLINE NUMBER PLUS MINUS SLASH ASTERISK LPAREN RPAREN

/* Grammar follows */
%%
input:              /* empty string */
    | input line
    ;
line: NEWLINE
    | expr NEWLINE           { printf("\t%.10g\n",$1); }
    ;
expr: expr PLUS term         { $$ = $1 + $3; }
    | expr MINUS term        { $$ = $1 - $3; }
    | term
    ;
term: term ASTERISK factor   { $$ = $1 * $3; }
    | term SLASH factor      { $$ = $1 / $3; }
    | factor
    ;
factor:  LPAREN expr RPAREN  { $$ = $2; }
      | NUMBER
      ;
%%
/*--------------------------------------------------------*/
/* Additional C code */
/* Error processor for yyparse */
#include <stdio.h>
int yyerror(char *s)        /* called by yyparse on error */
{
    printf("%s\n",s);
    return(0);
}

/*--------------------------------------------------------*/
/* The controlling function */
#include "lex.h"
int parse(void)
{
    char exp[] = "2+3\n\0\0";
    yy_scan_buffer(exp, sizeof(exp));
    yyparse();
    exit(0);
}

Когда я пытаюсь скомпилировать его смой компилятор, я получаю сообщение об ошибке EINTR не найден.В моем заголовке errno.h (из набора инструментов моего компилятора) нет EINTR.

Существуют ли какие-либо опции, делающие flex / bison более легким и менее зависимым от POSIX?

1 Ответ

0 голосов
/ 15 февраля 2012

Вкратце: номер flex будет ссылаться на EINTR во всех сканерах C. Таким образом, у вас есть три варианта (в порядке убывания):

  1. Исправьте свой компилятор. Какой из них не определяет EINTR?
  2. Определите свой собственный YY_INPUT в блоке %top.
  3. Определить манекена EINTR; 0 или INT_MAX, вероятно, являются хорошим выбором для этого конкретного приложения, но переопределение стандартных макросов всегда может иметь забавные побочные эффекты.
...