首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lex & Yacc -语法规则

Lex & Yacc -语法规则
EN

Stack Overflow用户
提问于 2012-02-05 12:36:39
回答 1查看 1.9K关注 0票数 0

我正在努力学习lex和yacc。

我正在努力理解如何做语法规则。我的文件已经定义如下:

代码语言:javascript
复制
fd 3x00
bk 100
setc 100
int xy3 fd 10 rt 90
rt

我使用printf并打印到一个文件的输出是这样的:

代码语言:javascript
复制
Keyword: fd
Illegal: 3x00
Keyword: bk
Keyword: setc
Number: 100
Keyword: int
Id: xy3
Keyword: fd
Number: 10
Keyword: rt
Number: 90

下面是我的lex文件--为了使这篇文章尽可能小,我只展示其中的一部分

代码语言:javascript
复制
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文件。这是不完整的,因为我不知道如何完成它。

代码语言:javascript
复制
%{

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

%}

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

%%



%%
main()
{


yyparse()


}

我不确定我该如何写这些的语法规则。我可以为该表达式指定自己的名称吗?

有没有人能帮我举一个例子,让我看看如何完成它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-05 13:06:18

规则应该是这样的:

代码语言:javascript
复制
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是令牌在规则中的位置。可以使用$$引用规则标头。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9146952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档