yacc 编程

本文介绍了Yacc编程的基本结构,包括声明、语法规则和C代码段。讲解了Yacc声明中如何定义终端和非终端符号,以及操作符优先级。通过示例展示Yacc语法规则的格式,并提供了C代码实现错误处理。最后,提到了Yacc命令行选项,如'-d'用于生成头文件,'-b'和'-o'用于自定义输出文件名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Yacc编写语法

如同Lex一样,一个Yacc程序也用双百分号分为三段。它们是:声明、语法规则和C代码。

C与Yacc的声明

C声明可能会定义动作中使用的类型和变量,以及宏。还可能包含头文件。每个Yacc声明段声明了终端符号和非终端符号的名称,还可能描述操作符优先级和针对不同符号的数据类型。lex一般返回这些标记,所有这些标记都必须在Yacc声明中说明。

例:文件解析声明

%{

#typedef char* string;

#define YYSTYPE string

%}

%token NAME EQ AGE

%%

Yacc语法规则

Yacc语法规则具有以下一般格式:

result:components {}

result是规则描述的非终端符号。components是根据规则放在一起的不同的终端和非终端符号。如果匹配特定序列的话Components后面可以跟要执行的动作。

param:NAME EQ NAME{printf("\tName:%s\tvalue(name):%s\n",$1,$3);}

           |NAME EQ VALUE{printf("\tName:%s\tValue(value):%s\n",$1,$3)};

标记NAME的Lex代码是这样的:

        char [A-Za-z]

        name {char}+

        %%

         {name} {yylvl=strdup(yytext);

                       return NAME;

}

 

文件解析的语法

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值