2016-01-21 10 views
0

мне нужно разобрать следующий файл с помощью гибкого и Bison:Анализировать файл с помощью гибкого и зубру

нового файла

BEGIN BLOCK BLK_ROWDEC 
      NAME       cell_rowdec 
      SIZE        UNI_rowdecSize 
      ITERATE         itr_rows 
      DIRECTION        lgDir_rowdec 
      STRAP       STRD1,STRD3,STRD2 
      WRAP       WRD1 
      VIA           VIAB,VIAC,VIAD 
ENDS BLK_ROWDEC 

Я хочу прочитать вышеуказанный файл и для этого я пишу этот код

lex.l

%{ 
#include <iostream> 
#include <stdio.h> 
#include "yacc.tab.h" 
#define YY_DECL extern "C" int yylex() 

using namespace std; 
%} 

DOT    "." 
COLON   ":" 
SEMICOLON  ";" 
COMMA   "," 
ANGLE_LEFT  "<" 
ANGLE_RIGHT  ">" 
AT    "@" 
EQUAL   "=" 
SQUARE_OPEN  "[" 
SQUARE_CLOSE [^\\]"]" 
OPENBRACE  "\(" 
CLOSEBRACE  "\)" 
QUOTE   "\"" 
QUOTE_OPEN  "\"" 
QUOTE_CLOSE  [^\\]"\"" 
SPACE   " " 
TAB    "\t" 
CRLF   "\r\n" 
QUOTED_PAIR  "\\"[^\r\n] 
DIGIT   [0-9] 
ALPHA   [a-zA-Z] 
QTEXT   [0-9a-zA-Z!#$%&'()*+,\-.\/:;<=>[email protected]\[\]^_`{|}~] 

%% 

[a-zA-Z0-9]+   { yylval.sval = strdup(yytext); return TOK_STRING; } 

{SPACE}*     {return TOK_SPACE; } 

^{SPACE}*Name   {return TOK_NAME; } 
{SPACE}*SIZE.*    {return TOK_SIZE; } 
{SPACE}*ITERATE.*   {return TOK_ITERATE; } 
{SPACE}*DIRECTION.*  {return TOK_DIRECTION; } 

^{CRLF}       { return TOK_EMPTY_LINE; } 
{CRLF}       {} 
.        {}/* ignore unknown chars */ 

yacc.y

%{ 
#include <cstdio> 
#include <cstring> 
#include <iostream> 
#include <stdio.h> 

using namespace std; 

extern "C" int yylex(); 
extern "C" FILE *yyin; 

void yyerror(const char* s); 
%} 

// Symbols. 
%union 
{ 
    char* sval; 
}; 

%token <sval> TOK_NAME 
%token <sval> TOK_SIZE 
%token <sval> TOK_STRING 
%token <sval> TOK_ITERATE 
%token <sval> TOK_DIRECTION 
%token <sval> TOK_EMPTY_LINE 
%token TOK_SPACE 


%% 

str: 
    TOK_SPACE TOK_NAME TOK_SPACE TOK_STRING 
    { 
     cout << "Value:" << $2 << "->" << $4; 
    } 
    ; 
%% 

int main(void) { 
    FILE * pt = fopen("new file ", "r"); 
    if(!pt) 
    { 
    cout << "Bad Input.Noexistant file" << endl; 
    return -1; 
    } 
    yyin = pt; 
    do 
    { 
     yyparse(); 
    }while (!feof(yyin));  
} 
void yyerror(const char *s) 
{ 
    cout << "Error. " << s << endl; 
    exit(-1); 
} 
#include "lex.yy.c" 

Во-первых, я просто пытаюсь напечатать вторую строку файла, но я ничего не могу напечатать. Пожалуйста, помогите мне, что я могу сделать?

Компиляция выполняется:

flex lex.l 
bison -d yacc.y 
g++ yacc.tab.c -lfl -o scanner.exe 
+0

Анализаторы bison/flex работают последовательно с начала ввода до конца. Они не пропускают входные данные, ищущие что-то, что они могут сопоставить. – rici

+0

, но почему он ничего не печатал? Что такое проблема с моим скриптом? –

+0

, пожалуйста, помогите мне @rici –

ответ

0

Это очень важно знать, как отлаживать анализатор. В первой части файла #define YYDEBUG 1, а также в основном наборе yydebug = 1. Это позволит вам увидеть точные шаги при запуске вашего синтаксического анализатора, тогда вы узнаете, где находится ваша ошибка. Знание этого чрезвычайно важно, потому что ошибок очень трудно найти. Поэтому отлаживайте свою программу!

%{ 
#include <cstdio> 
#include <cstring> 
#include <iostream> 
#include <stdio.h> 

#define YYDEBUG 1 // This is new 

using namespace std; 

extern "C" int yylex(); 
extern "C" FILE *yyin; 

void yyerror(const char* s); 
%} 

int main(){ 

    yydebug = 1; // This is new 
    yyparse(); 
} 

Также yylval.sval = strdup(yytext); после этого вам нужно проверить, является ли NULL yylval.sval, поскольку strdup(yytext) является первым выделение памяти, и после того, как эта функция копирует строку, так strdup(yytext) вернет NULL, если выделение памяти.

+0

Я добавляю это оба утверждения, но это не сработало. У меня не было никаких выходов. пожалуйста, помогите мне .. Его срочно –

+0

Сначала вам нужно выполнить команду 'yacc -d', потому что' yacc' генерирует '.h' файл для' lex'. Этот файл говорит Лексу, что означают токены. И после этого вам нужно сделать flex. Кроме того, ваш процесс компиляции в конце неправильный, вам нужно скомпилировать файл 'yacc' в файл объекта, файл' lex' в файл объекта и после этого объединить их в один исполняемый файл. –

+0

Если вы не понимаете слова того, что я только что сказал, ознакомьтесь с документацией flex и yacc или просмотрите несколько руководств. –