利用Yacc生成LR语法分析器的关键点…

本文总结了使用Yacc构建LR语法分析器的关键点,包括归约动作的编写、嵌入动作的时机以及如何根据DFA状态判断当前token。通过几个示例详细解释了不同情况下的解析过程。
摘要由CSDN通过智能技术生成

  实际上利用Yacc生成LR语法分析器(一般是Look ahead分析方法)还是比较简单的,而且写一个文法满足Yacc的要求也非常容易,主要的工作量体现在一个产生式被识别后的动作如何编写,尤其是有时候需要在一个产生式中嵌入一个动作,这个动作产生的时机是什么,产生这个动作时当前的token是什么一定要非常清楚,通过这几天的研究,基本上对这个问题已经有了一个了解,这里做一些总结。

  首先,Yacc中判断如果DFA的当前状态中的某一项S->a.发生归约时,执行产生式S->a后面带的动作。但是S->a.归约发生前可能需要获得下一个token,也有可能不需要获得,这个要具体情况具体分析。另外对于嵌入动作,Yacc会在产生式中插入一个新的非终结符E,其中E->空,当E->空.归约发生时,嵌入动作执行。

例1:

%{
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE double
int c;
%}

%token NUMBER

%%
lines    : expr            { printf("%d\n", $1); }
        ;

expr    : expr{printf("a%c\n",c);} '+' NUMBER                { $$ = $1 + $4; }
        | expr {printf("b%c\n",c);}'-' NUMBER                 { $$ = $1 - $4; }
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值