算符优先系列之(一)Firstvt和Lastvt集

sdut 算符优先系列之(一)Firstvt和Lastvt集 学过编译原理的菊苣们都知道算符优先文法,作为一个有点深度的分析方法,我们怎么能只止步于理论呢,实践才是王道哦。 已知文法G[S]的表达式,计算G[S]的Firstvt和Lastvt。因为某些特殊的原因,我们在这规定一下输入输出格式。 例如: 已知文法G[S]为: S->a|@|(T) T->T,S|S 首先先把各条件语句按照从左到右从上到下的方式分解和输出 S->a S->@ S 阅读详情
AI摘要

本文介绍了一种计算算符优先文法中Firstvt和Lastvt集合的方法,通过解析文法规则并应用特定算法,能够有效地找出非终结符的Firstvt和Lastvt集合,为编译原理的深入理解提供了实践指导。

Problem Description

学过编译原理的菊苣们都知道算符优先文法,作为一个有点深度的分析方法,我们怎么能只止步于理论呢,实践才是王道哦。

已知文法G[S]的表达式,计算G[S]的Firstvt和Lastvt。因为某些特殊的原因,我们在这规定一下输入输出格式。

例如:

已知文法G[S]为:

S->a|@|(T)

T->T,S|S

首先先把各条件语句按照从左到右从上到下的方式分解和输出

S->a

S->@

S->(T)

T->T,S

T->S

对于输出首先输出FIRSTVT集然后输出LASTVT集,对于各自的集合的的输出按照非终结符从上向下的方式

Firstvt[S]:非终结符+空格的形式

Firstvt[T]:

Lastvt[S]:

Lastvt[T]:

Input

多组输入。第一行输入一个n,表示表达式的个数,接下来n行,每行一个表达式

Output

根据上述的格式,输出文法的Firstvt和Lastvt集合

Sample Input

2
S->a|@|(T)
T->T,S|S

Sample Output

Firstvt[S]:a @ ( 
Firstvt[T]:, a @ ( 
Lastvt[S]:a @ ) 
Lastvt[T]:, a @ )

code:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
 
const int Maxn=110;
const int maxn=20;
char str[maxn][Maxn];//输入文法
char st[maxn];//输入串
char stac[maxn];//模拟栈的数组
char nstr[maxn][maxn];//储存转化文法
char mstr[maxn][maxn];
char fin[maxn];//存储终结符
char firstvt[maxn][maxn],lastvt[maxn][maxn];
char cmp[maxn][maxn];//存储表中的比较符
int firstflag[maxn],lastflag[maxn];//非终结符的firstvt,lastvt是否求出
int fcnt[maxn],lcnt[maxn];//非终结符firsvt和lastvt的个数
int is_fin(char c) { //判断终结符
    for(int i=0; fin[i]!='\0'; i++) {
        if(fin[i]==c)
            return 1;
    }
    return 0;
}
int site(char c) { //求在表中的下标
    for(int i=0; fin[i]!='\0'; i++) {
        if(fin[i]==c)
            return i;
    }
}
void get_firstvt(char s,int t) { //求s非终结符的firstvt值
    int i,j,ii,jj,tt;
    for(i=0; i<t; i++) {
        if(str[i][0]==s)
            break;
    }
    if(!firstflag[i]) {
        int k=fcnt[i];
        for(j=0; str[i][j]!='\0'; j++) {
            if(j==2||str[i][j]=='|') {
                if(is_fin(str[i][j+1])) {
                    firstvt[i][k++]=str[i][j+1];
                } else {
                    if(is_fin(str[i][j+2])) {
                        firstvt[i][k++]=str[i][j+2];
                    }
                    if(str[i][j+1]!=s) {
                        get_firstvt(str[i][j+1],t);
                        for(ii=0; ii<t; ii++) {
                            if(str[ii][0]==str[i][j+1])
                                break;
                        }
                        for(jj=0; jj<fcnt[ii]; jj++) {
                            for(tt=0; tt<k; tt++) {
                                if(firstvt[i][tt]==firstvt[ii][jj])
                                    break;
                            }
                            if(tt==k) {
                                firstvt[i][k++]=firstvt[ii][jj];
                            }
                        }
                    }
                }
            }
        }
        firstvt[i][k]='\0';
        fcnt[i]=k;
        firstflag[i]=1;
    }
}
 
void output_firstvt(int T) { //输出firstvt集
    for(int i=0; i<T; i++) {
        get_firstvt(str[i][0],T);
    }
    for(int i=0; i<T; i++) {
        printf("Firstvt[%c]:",str[i][0]);
        for(int j=0; j<fcnt[i]; j++) {
            printf("%c ",firstvt[i][j]);
        }
        puts("");
    }
}
 
void get_lastvt(char s,int t) { //求s非终结符的lastvt值
    int i,j,ii,jj,tt;
    for(i=0; i<t; i++) {
        if(str[i][0]==s)
            break;
    }
    if(!lastflag[i]) {
        int k=lcnt[i];
        for(j=0; str[i][j]!='\0'; j++) {
            if(str[i][j+1]=='|'||str[i][j+1]=='\0') {
                if(is_fin(str[i][j])) {
                    lastvt[i][k++]=str[i][j];
                } else {
                    if(is_fin(str[i][j-1])) {
                        lastvt[i][k++]=str[i][j-1];
                    }
                    if(str[i][j]!=s) {
                        get_lastvt(str[i][j],t);
                        for(ii=0; ii<t; ii++) {
                            if(str[ii][0]==str[i][j])
                                break;
                        }
                        for(jj=0; jj<lcnt[ii]; jj++) {
                            for(tt=0; tt<k; tt++) {
                                if(lastvt[i][tt]==lastvt[ii][jj])
                                    break;
                            }
                            if(tt==k) {
                                lastvt[i][k++]=lastvt[ii][jj];
                            }
                        }
                    }
                }
            }
        }
        lastvt[i][k]='\0';
        lcnt[i]=k;
        lastflag[i]=1;
    }
}
 
void output_lastvt(int T) { //输出lastvt集
    for(int i=0; i<T; i++) {
        get_lastvt(str[i][0],T);
    }
    for(int i=0; i<T; i++) {
        printf("Lastvt[%c]:",str[i][0]);
        for(int j=0; j<lcnt[i]; j++) {
            printf("%c ",lastvt[i][j]);
        }
        puts("");
    }
}
void output(int i,int j,char *str) {
    printf("\t");
    for(int ii=i; ii<=j; ii++)
        printf("%c",str[ii]);
}
int main() {
    int T;
    while(scanf("%d",&T)!=EOF)
    {
    int cnt=0;//终结符的个数
    memset(firstflag,0,sizeof(firstflag));
    memset(lastflag,0,sizeof(lastflag));
    memset(cmp,0,sizeof(cmp));
 
    for(int i=0; i<T; i++) {
        scanf("%s",str[i]);
        fcnt[i]=lcnt[i]=0;
    }
    for(int i=0; i<T; i++) {
        for(int j=0; str[i][j]!='\0'; j++) {
            if((str[i][j]<'A'||str[i][j]>'Z')&&(str[i][j]!='-'&&str[i][j]!='>')&&str[i][j]!='|')
                fin[cnt++]=str[i][j];
        }
    }
    fin[cnt++]='#';
    fin[cnt]='\0';
    output_firstvt(T);
    output_lastvt(T);
    }
    return 0;
}

 

算符优先算法(FIRSTVT集,LASTVT集,判读是否是算符优先文法,算符优先矩阵,句子分析) /////**共有三个类**①主类Op.java*②处理算法的关键类GetFL.java*③读取信息类ReadInfo.java从TXT文件中读取文法**/////* * author:Ack訾 * Date:15/11/2012 * Attention: */ package com.algorithm; import java.io.IOException; import java.u 阅读详情

相关推荐

编译原理实验四:算符优先分析法(附C/C++源码)

本文讲述了算符优先文法的原理及如何用C语言实现。并在给出的代码中实现了FirstVt集,LastVt集的计算输出,构造优先关系表并输出,和对任意输入字符串的分析程序总流程为:从文件中读取文法 -> 输出文法信息 -> 计算FirstVt集并输出 -> 计算LastVt集并输出 -> 判断是否是算符优先文法 -> 构造算符优先表并输出 -> 手动输入要分析的字符串 -> 输出分析过程和结果读取文件非终结符要求必须是大写字母,一行只能有一条规则,可用‘|’表示或,空用$表示。

W_Wmwmwm的博客 5282

FIRSTVT和LASTVT的计算(很长但是很详细)

目录 1.定义 2.定义剖析与理解 (1)FIRSTVT(P) (2)LASTVT(P) 3.例题演示 (1)FIRSTVT的详细计算过程 1.第一遍扫描 2.第二遍扫描 3.第三遍扫描 4.第四遍扫描 5.第五遍扫描 (2)LASTVT的详细计算过程 1.定义 大家看完定义之后是不是觉得有点懵,这很正常,我们要利用定义做题的第一步就是理解定义。 笔者在这里先给大家抛个引子,我认为它们的计算与FOLLOW集的计算有类似之处(FOLLOW集的计算我在之...

qq_55168827的博客 1万+

FirstVT集和LastVT集生成算法模拟(编译原理课程设计文档)

编译原理课程设计的详细文档,内附代码!小心下载 华东交通大学上传

【编译原理】FIRSTVT和LASTVT求法

FIRSTVT 找FIRSTVT的三条规则:如果要找A的FIRSTVT,A的候选式中出现: A->a…,即以终结符开头,该终结符入FIRSTVT A->B…,即以非终结符开头,该非终结符的FIRSTVT入A的FIRSTVT A->Ba…,即以非终结符接终结符开头,则该终结符入FIRSTVT LASTVT 找LASTVT的三条规则:如果要找A的LASTVT,A的候选式中出现: A->…a,即以终结符结尾,该终结符入LASTVT A->…B,即以非终结符结尾,该非终结符的LASTV

TYPFOON的博客 1万+

Deepseek接入QQ机器人:实现拟人化概率回复的完整指南

大语言模型API正在快速改变即时通讯工具的交互方式。通过标准化的OpenAI兼容接口,开发者可以将Deepseek等AI服务嵌入到QQ机器人等IM场景中,实现自然语言对话能力。其核心原理在于事件驱动架构:消息接收层通过OneBot协议获取群聊内容,业务层利用概率过滤与冷却机制控制回复节奏,再由大模型生成拟人化文本。这种设计不仅避免了机器人刷屏,还能通过系统提示词塑造性格,营造真实的社群陪伴体验。适用于粉丝群互动、内容订阅、小规模客服等场景,同时支持多群独立配置、关键词加权回复及上下文记忆扩展。在实际工程中,

weixin_29051245的博客 458

Device Mapper 代码分析

Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。一、DM

SonicLing的专栏 1万+

算符优先系列之(一)Firstvt和Lastvt集 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descri

算符优先系列之(一)Firstvt和Lastvt集 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 学过编译原理的菊苣们都知道算符优先文法,作为一个有点深度的分析方法,我们怎么能只止步于理论呢,实践才是王道哦。 已知文法G[S]的表达式,计算G[S]的Firstvt和

huantonglei的博客 2722

钣金件设计规范

为保证折弯 强度,钣金折弯钣金应大于材料的最小折弯半径。在设计U型弯曲件时,两弯曲边最好长度相等,以免弯曲时产品偏 移而产生废品,如果因为结构设计不允许两边一样长,为保证产品在模 具中准确定位,应预先在设计时添加工艺定位孔,特别是多次折弯成 形的零件,必须设计工艺孔为定位基准,以减少累计误差,保证产品 质量,如图2-11所示。凸包是依靠材料的延伸使钣金件形成局部凹陷或凸起的冲压工序凸包与拉深是完全不同的冲压工艺,凸包中材料厚度的改变为费意图性 的,即厚度的少量改变是变形过程中形成的,不是设计指定的要求。

制冷技术咨询与服务的博客 7322

编译原理----FIRST集,LARST集,FIRSTVT集,LASTVT集

编译原理----FIRST集,LARST集,FIRSTVT集,LASTVT集

weixin_69884785的博客 3747

python-调用动态链接库dll/so的方法

使用python ctyeps CDLL来调用linux下的so动态链接库或windows下的dll动态链接库

XIAOXIANG233233的博客 3662

从零到一:基于DESeq2的转录组差异表达分析实战指南

本文详细介绍了基于DESeq2的转录组差异表达分析实战指南,涵盖数据准备、标准化处理、差异分析及结果解读等关键步骤。DESeq2凭借其稳定性和对低表达基因的友好处理,成为转录组数据分析的首选工具。文章还提供了常见问题排查和优化建议,帮助研究者高效完成从分析到发表的完整流程。

weixin_26759093的博客 270

G - 算符优先系列之(一)Firstvt和Lastvt集

已知文法G[S]的表达式,计算G[S]的Firstvt和Lastvt。因为某些特殊的原因,我们在这规定一下输入输出格式。学过编译原理的菊苣们都知道算符优先文法,作为一个有点深度的分析方法,我们怎么能只止步于理论呢,实践才是王道哦。对于输出首先输出FIRSTVT集然后输出LASTVT集,对于各自的集合的的输出按照非终结符从上向下的方式。第一行输入一个n,表示表达式的个数,接下来n行,每行一个表达式。根据上述的格式,输出文法的Firstvt和Lastvt集合。Firstvt[S]:非终结符+空格的形式。

代码欢乐豆 267

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

《编译原理》求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析

求 FIRSTVT 集和 LASTVT 集的步骤及例题解析 算符优先关系表的构造中涉及到求 FIRSTVT 集和 LASTVT 集。 表示及含义: FIRSTVT(T) 非终结符T的最左终结符集合 LASTVT(T) 非终结符T的最右终结符集合 定义: 定义解释: FIRSTVT(T) 非终结符T经过1步或多步推导,得到的最左端终结符,以及左端第二个终结符的集合 ...

肖朋伟 2万+

STM32驱动WS2812B实现音乐频谱可视化系统

本文详细介绍了基于STM32驱动WS2812B灯带实现音乐频谱可视化系统的设计与实现。通过FFT算法实时分析音频信号,将频谱映射到炫彩灯光控制系统,结合PWM和DMA技术实现低延迟响应。系统支持多模式切换和动态亮度调节,适用于创意灯光秀和智能家居场景。

weixin_29171129的博客 301

从零开始学Agent的搭建——多角色项目需求分析框架实战

场景一:电商促销需求——技术细节顾此失彼团队用单Agent分析一个"双11秒杀系统"的需求。Agent输出了完整的功能清单,但当我们拿着这份方案找架构师评审时,发现了致命问题:Agent完全没有考虑库存扣减的并发一致性、Redis与MySQL之间的数据同步延迟、以及超卖风险的控制策略。原因是单Agent在处理"业务理解"任务时,已经耗尽了它的"注意力预算",技术深度分析几乎为空。场景二:ERP集成需求——跨系统边界模糊。

软件行业技术文化交流。 534

编译原理——判断文法是否为算符优先文法

编译原理——判断文法是否为算符优先文法 在判断之前我们需要看一下该文法是否为算符文法。 算符文法定义 一个文法,如果它的任意产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部: …QR… 那么我们称该文法为算符文法。 接下来就可以构造优先关系表了,再构造之前我们需要了解两个基本知识。 1.算符优先关系 关系有三种: a<b a的优先性低于b a>b a的...

weixin_44162921的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

编译原理的FIRST、FOLLOW、FIRSTVT、LASTVT的求法总结

首先呢First和Follow是一对,而Firstvt和Lastvt是一对。 First和Follow是为了画预测分析表的(在LL(1)分析法处)。 而Firstvt和Lastvt是为了画算符优先关系表。 First这里面包含了组成First(A)的两种情况:以终结符开头, 当然要把这个终结符放到A的First里以非终结符开头, 先把C的First放到A的First里再看如果C的First中...

However_day的博客 9233

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

设计算法求解FIRSTVT和LASTVT(c语言)

Firstvt和Lastvt是为了画算符优先关系表的(就是表里面填优先大于小于等于的抄那个)。 Firstvt: 找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现: A->a…,即以终结符开头,该终结符入Firstvt; A->B…,即以非终结符开头,该非终结符的Firstvt入A的Firstvt; A->Ba…,即先以非终结符开头,紧跟终结符,则终结符入Firstvt。 Lastvt: 找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:.

qq_41246458的博客 4853

算符优先分析程序&对着注释理解代码

文章目录一 实验目的和要求二 实验内容三 实验过程3.1什么是算符文法?应满足什么条件3.2构造FIRSTVT3.3构造LASTVT3.3思路四 实验结果 一 实验目的和要求 1.理解自下而上分析算法的构造思想。 2.理解算符文法和算符优先文法的概念。 3.掌握 FIRSTVT 集、LASTVT 集和算符优先关系表的构造方法。 4.理解素短语和最左素短语的概念,并掌握其寻求方法。 5.理解算符优先分析算法,能够使用某种高级语言实现一个算符优先分析程序。 二 实验内容 编写一个算符优先分析程序,能实现以下功能

qq_45893999的博客 3894

算符优先分析法-思路方法在这里

为了方便,记录一下,因为本人也正在学编译原理,以便后续的学习复习,以下是自己整理的。 编写一个算符优先分析程序,能实现以下功能: 1.输入文法,判断是否为算符文法; 2.构造并输出该文法的每个非终结符的 FIRSTVT 集和 LASTVT 集; 3.构造并输出算符优先分析表,判断是否为算符优先文法,若不是提示无法进行分析; 4.任意输入一个输入串,可得到成功的分析或错误的提示,输出其分析过程或打印语法 分析树。 实验运行结果 算符优先文法的特点: 我们构造了算符优先语法分析器,就可以忽略原来的文法,栈中的非

qq_45893999的博客 1万+

4. 构造【算符优先分析表】步骤 + 判断是否为【算符优先文法】

什么是算符优先分析法 算符优先分析法是一种简单、直观的自下而上分析法 算符优先分析法就是仿照算术表达式的四则运算过程而设计的一种语法分析方法。 这种分析方法首先要规定运算符之间(确切地说终结符之间)的优先关系和结合性质,然后借助这种关系,比较相邻运算符的优先级来确定句型的可归约串并进行归约。 算符优先文法的定义 一、算符文法的定义 在算符文法中,任何一个规则右部都不存在两个非终结符相邻的情况。如 AB 二、定义任意两个终结符号之间的优先关系 解释 : (1)ab两个可以同时规约,故

你说的白是什么白_ 1万+
上一篇: LL(1)文法系列(二)预测分析表
下一篇: 算符优先系列之(二)算符优先关系表
shadowam
博客等级 码龄10年 62粉丝 168原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值