Lex & Yacc - Грамматические правила - PullRequest
0 голосов
/ 05 февраля 2012

Я пытаюсь выучить lex и yacc.

Я пытаюсь понять, как выполнять правила грамматики.Мой файл уже был определен как:

fd 3x00
bk 100
setc 100
int xy3 fd 10 rt 90
rt

Мой вывод с printf и печать в файл прошел примерно так:

Keyword: fd
Illegal: 3x00
Keyword: bk
Keyword: setc
Number: 100
Keyword: int
Id: xy3
Keyword: fd
Number: 10
Keyword: rt
Number: 90

Вот мой файл lex - я только собираюсьчтобы показать его часть, чтобы сохранить этот пост как можно меньше

fd                  {return FD; }

[0-9]+[a-z]+[0-9]+      {}  // this is the illegal entry 3x00
[\r\t\n]+               {}
bk                    {return BK;}
setc                  {return SETC;}
[-+]?[0-9]+           {yyval.ival = atoi(yytext); return NUMBER;}
int                   {fprintf(yyout, "%s\n", yytext);}
xy3                   {fprintf(yyout, "%s\n", yytext);}
fd[0-9]+              {fprintf(yyout, "%s\n", yytext);}

%%

Вот мой файл yacc.Это не завершено, так как я не знаю, как это закончить.

%{

#include <ctype.h>
#include <stdio.h>

%}

%token NUMBER
%token ID
%token FD
%token BK
%token SETC
%token KEYWORD

%%



%%
main()
{


yyparse()


}

Я не уверен, как бы я написал правила грамматики для них.Могу ли я сделать свое собственное имя для выражения?

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

1 Ответ

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

Правила должны быть такими:

statement: command arg {printf("Keyword: %s\n", $1);};

command: KEYWORD {$$ = $1;}
        |FD {$$ = $1;}
        |BK {$$ = $1;};

arg: NUMBER {printf("Number: %s\n", $1);}
    |ID {printf("Id: %s\n", $1);};

Это означает, что вы должны определить синтаксические правила таким образом. Разделите альтернативные определения на | и запишите нужные действия в блоке { } для каждого правила. Завершите каждое правило с помощью ;. Когда вы ссылаетесь на токены, используйте $n, где n - это позиция токена в правиле. На заголовок правила можно ссылаться с помощью $$.

...