FIRST集和FOLLOW集求法

   

龙书算法:

First:

(1)、如果X是终结符,那么First(X) = X;

(2)、如果X是非终结符,且XàY1Y2......Yk是一个产生式,其中k>=1;那么如果对于某个I, a在First(Yi)中,且#(空串)在所有的First(Y1)…..First(Yi-1)中,就吧a加入到First(X)中。

(3)、如果Xà#(空串)是一个产生式,那么将#加入到First(X)中。

Follow:

(1)、将$放入到Follow(S)中,其中S是开始符号,而$是输入右端结束的标记。

(2)、如果存在一个产生式AàaBb,那么First(b)中除#(空串)外地所有符号都在Follow(B)中。

(3)、如果存在一个产生式AàaB, 或存在AàaBb且First(b)包含#(空串),那么Follow(A)中的所有符号都在Follow(B)中。

自己理解:

First:(看X的产生式)

(1)、如果X是终结符,那么First(X)= X;

(2)、如果X是非终结符,且XàY1Y2......Yk,i=1;

1)、将First(Yi)加入到First(X)中,

2)、如果#包含着First(Yi)中,i++,重复1);

3)、如果#不包含在First(Yi)中,First(X)计算完成;

(3)、如果Xà#(空串)是一个产生式,那么将#加入到First(X)中。

Follow:(看在右边有B的产生式)

(1)、将$放入到Follow(S)中,其中S是开始符号,而$是输入右端结束的标记。

(2)、如果存在一个产生式AàaBb,那么First(b)中除#(空串)外地所有符号都在Follow(B)中。

(3)、如果存在一个产生式AàaB, 或存在AàaBb且First(b)包含#(空串),那么Follow(A)中的所有符号都在Follow(B)中。

实例:

(1) EàTE’            (2)E’à+TE’ |#        (3) TàFT’          (4)T’à*FT’|#        (5)Fà(E)|id

FIRST(F)={(,id }  FIRST(T’)={*,#}  FIRST(T)=FIRST(F)={(,id}

FITST(E’)={+,#} FIRST(E)={(,id}

FOLLOW(E)={$,)}

FOLLOW(E’)={$,)}

FOLLOW(T)={+,$,)}

FOLLOW(T’)={+,$,)}

FOLLOW(F)={*,+,$,)}

时间: 2024-10-17 00:33:46

FIRST集和FOLLOW集求法的相关文章

FIRST集和FOLLOW集的求法

FIRST集 $FIRST集合$ ------------------------------------------------------------------------ $ S\rightarrow a..., \\a \ \ \in FIRST(S)\\$ ------------------------------------------------------------------------ $S\rightarrow \epsilon, \\ \epsilon \in FI

求FIRST集和FOLLOW集

花了点时间弄了个大概,希望对和我一样的人有所帮助. 文法如下: E -> TE'E' -> +TE'|εT -> FT'T' -> *FT'|εF -> (E)|id ---------------------------------------------------------------------------------------------------------------------------------------------------- FIRST集:

FIRST集和FOLLOW集

省略号代表其他相关产生式得出的终结符号,一开始的时候,省略号里面是没有的 求FIRST集 情况壹  如果A只在→的右边出现,那么FIRST(A)={A},例子M→α,FIRST(α)={α} 情况貳  对于A→BCDEFG, 一 如果无B→ε,那么FIRST(A)={……}∪FIRST(B),接着求FIRST(B) 二 如果有B→ε,那么FIRST(A)={……}∪(FIRST(B)-{ε})∪FIRST(CDEFG),接着分别求FIRST(B)-{ε}.FIRST(CDEFG) 情况叁 如果G

怎样求FIRST集与FOLLOW集

一,要知道什么是终结符和非终结符. 终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导. 非终结符:不是终结符的都是非终结符.(非男即女,呵呵) 如:A-->B,则A是非终结符. (一般书上终结符用小写,非终结符用大写.) 二,文法产生语言句子的基本思想:从识别符号(开始符)开始,把当前产生的符号串中的非终结符替换为相应规则右部的符号串,直到全部由终结符组成. 三,FIRST集求法 First集合最终是对产生式右部的字符串而言的,但其关键是求出非终结符的First集

随机切分csv训练集和测试集

使用numpy切分训练集和测试集 觉得有用的话,欢迎一起讨论相互学习~Follow Me 序言 在机器学习的任务中,时常需要将一个完整的数据集切分为训练集和测试集.此处我们使用numpy完成这个任务. iris数据集中有150条数据,我们将120条数据整合为训练集,将30条数据整合为测试集. iris.csv下载 程序 import csv import os import numpy as np '''将iris.csv中的数据分成train_iris和test_iris两个csv文件,其中t

将数据划分为训练集和测试集;缩放特征区间

导入葡萄酒数据: 1 import numpy as np 2 import pandas as pd 3 4 df_wine = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", header=None) 5 df_wine.columns = ["class label", "alcohol", 6 "mal

sklearn——train_test_split 随机划分训练集和测试集

sklearn--train_test_split 随机划分训练集和测试集 sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html 一般形式: train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和

sklearn获得某个参数的不同取值在训练集和测试集上的表现的曲线刻画

from sklearn.svm import SVC from sklearn.datasets import make_classification import numpy as np X,y = make_classification() def plot_validation_curve(estimator,X,y,param_name="gamma", param_range=np.logspace(-6,-1,5),cv=5,scoring="accuracy&

AI - MLCC06 - 训练集和测试集 (Training and Test Sets)

原文链接:https://developers.google.com/machine-learning/crash-course/training-and-test-sets 1- 拆分数据 可将单个数据集拆分为一个训练集和一个测试集. 训练集 - 用于训练模型的子集. 测试集 - 用于测试训练后模型的子集. 训练集的规模越大,模型的学习效果越好.测试集规模越大,对于评估指标的信心越充足,置信区间就越窄.在创建一个能够很好地泛化到新数据模型的过程中,测试集充当了新数据的代理. 拆分数据的一些注意