2016-01-26 4 views
0

Это мой первый опыт в BISON, и я застреваю, пытаясь понять, как взять полный отчет, например, astros = 2. Всякий раз, когда я пытаюсь это сделать, я не получаю никакого результата. Но если я пробую каждую часть отдельно, я получаю вывод для каждой части. Мой код выглядит следующим образом, только часть его, конечно:BISON и YACC - Как ввести полное заявление

.y файла

%token ASSIGNMENT 
%token <intToken> INTNUMBER 
%token <intToken> INTTOKEN 
%type <statement> STATEMENT 

STATEMENT: '\n' 
       | INTTOKEN STATEMENT {printf("Token");} 
       | INTNUMBER STATEMENT {printf("Number");} 
       | STATEMENT ASSIGNMENT STATEMENT{printf("Assinging");} 
       | INTTOKEN '\t' ASSIGNMENT '\t' INTNUMBER STATEMENT {printf("FULL STATEMENT COMPLETE");} 

       |error {yyerror("ERROR");} 

Мой .l файл:

"="         return ASSIGNMENT; 
[0-9]+      { ECHO; yylval.integer = atoi(yytext); return INTNUMBER; } 
[a-fA-F]+[a-zA-Z]+  { ECHO; yylval.variableInteger = yytext; return INTTOKEN; } 

Кроме того, если кто-то может объяснить мне, как с правилами тогда это будет здорово. Может быть, так, я могу это понять сам.

+0

Возможно, вам стоит взглянуть на [flex manual] (http://flex.sourceforge.net/manual/Simple-Examples.html#Simple-Examples) или книгу Джона Левина о Bison и Flex (O ' Reilly). – rici

ответ

1

Правила просты, Лекс последовательно ищет регулярные выражения, сопоставляя токены и передавая их Yacc. Yacc использует функцию yylex() для этой цели.

Ваш вопрос не заполнен. У вас есть что-то еще, написанное в файле Yacc?

Yacc файл состоит из трех частей:

  • C код, который позже находится где-то вблизи начала y.tab.c файла (который Yacc генерирует), в этой части файла, который необходимо объявить extern int yylex(void) функция. Yacc действительно нуждается в двух вещах для работы, первый - yylex(), а seccond - yyerror().
  • Вторая часть грамматика с правилами и действиями

  • Третьей частью является основной функцией которой вы звоните yyparse().

Что касается декларации лексем и типов, что может быть сделано до или после %{ %} части файла. Некоторый базовый код Yacc будет выглядеть так:

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

/* Extern keyword is just good practice, it doesn't have to be written */ 
extern int yylex(void); 

void yyerror(char *string){ 

    fprintf(stderr,"Syntax error: %s", string); 
    exit(EXIT_FAILURE); 
} 

%} 

%% 
    /* Grammar with actions */ 
%% 

int main(){ 

    yyparse(); 
    return 0; 
} 

Как это работает? Yacc использует функцию yylex(), чтобы получить токены, а затем его грамматику, чтобы определить все остальное. Чтобы это сработало, вы должны скомпилировать как lex.yy.c сгенерированный с помощью flex, так и y.tab.c, сгенерированный с yacc в файл объекта, а затем скомпилируйте эти два объектных файла в один исполняемый файл.

Например:

yacc program.y 
flex program.lex 
gcc -c y.tab.c -o y.tab.o 
gcc -c lex.yy.c -o lex.yy.o 
gcc y.tab.o lex.yy.o -o program 

Примечание: Если вы объявляете маркеры в Yacc файле, вам необходимо сгенерировать y.tab.h файл при выполнении команды Yacc с yacc -d program.y и затем включить этот файл в Lex. Опция -d для этого.

Смежные вопросы