Parsing 解析中使用的第一个和后面的集合是什么?

Parsing 解析中使用的第一个和后面的集合是什么?,parsing,parser-generator,ll,Parsing,Parser Generator,Ll,什么是第一套和第二套?它们在解析中用于什么? 它们是用于自顶向下还是自底向上的解析器 有谁能先给我解释一下,然后按照下面的语法规则进行设置: E:=E+T | T T:=T*V|T V:= 维基百科是你的朋友。请参见和第一组/后续组 基本上,它们被用作解析器构造的基础,例如,作为解析器生成器的一部分。您也可以使用它们来推断语法的属性,但大多数人不太需要这样做。它们通常用于LL(自顶向下)解析器,以检查正在运行的解析器是否会遇到有多种方法继续解析的情况 如果您有备选的A | B,并且也有FIRST

什么是第一套和第二套?它们在解析中用于什么? 它们是用于自顶向下还是自底向上的解析器

有谁能先给我解释一下,然后按照下面的语法规则进行设置:

E:=E+T | T
T:=T*V|T
V:=

维基百科是你的朋友。请参见和第一组/后续组


基本上,它们被用作解析器构造的基础,例如,作为解析器生成器的一部分。您也可以使用它们来推断语法的属性,但大多数人不太需要这样做。

它们通常用于LL(自顶向下)解析器,以检查正在运行的解析器是否会遇到有多种方法继续解析的情况

如果您有备选的
A | B
,并且也有
FIRST(A)={“A”}
FIRST(B)={“B”,“A”}
,那么您将有第一个/第一个冲突,因为当输入中的下一个“A”出现时,您将不知道是扩展A还是扩展B(假设lookahead为1)

另一方面,如果您有一个像
AOpt:(“a”)?
一样可以为null的非终结符,那么您必须确保
FOLLOW(AOpt)
不包含“a”,因为否则您将不知道是否要扩展AOpt,或者不像这里:
S:AOpt“a”
S或AOpt都可能使用“a”,这会给我们带来一个第一/跟随冲突

出于性能原因,在解析过程中也可以使用第一组。如果您有一个可为null的非终端NullableNt,您可以将其展开,以查看它是否可以使用任何东西,或者检查
FIRST(NullableNt)
是否包含下一个标记,如果不只是忽略它(回溯与预测性解析),可能会更快。另一个性能改进是为词法扫描器额外提供当前的第一组,因此扫描器不会尝试所有可能的终端,而只尝试上下文当前允许的终端。这与保留的终端冲突,但并不总是需要这些终端

自下而上的解析器有不同类型的冲突,即Reduce/Reduce和Shift/Reduce。他们还使用项目集来检测冲突,而不是先检测后检测

您的语法无法与LL解析器一起使用,因为它包含左递归。但是E、T和V的第一组是{id}(假设你的
T:=T*V | T
T:=T*V | V

E->E+T | T

左递归

E->TE'

E'->+TE'| eipsilon

T->T*V|T

左递归

T->VT'

T'->*VT'|ε

中没有左递归

V->(id)

因此,语法是:

E->TE'

E'->+TE'|ε

T->VT'

T'->*VT'|ε

V->(id)

第一(E)={(}

第一(E')={+,ε}

第一(T)={(}

第一(T')={*,ε}

第一(V)={(}

起始符号=跟随(E)={$}

E->TE',E'->TE'|ε:FOLLOW(E')=FOLLOW(E)={$}

E->TE',E'->+TE'|ε:FOLLOW(T)=FIRST(E')={+,$}

T->VT',T'->*VT'| epsilon:FOLLOW(T')=FOLLOW(T)={+,$}

T->VT',T->*VT'| epsilon:FOLLOW(V)=FIRST(T)={*,epsilon}

第一套规则

If X is a terminal then First(X) is just X!
If there is a Production X → ε then add ε to first(X)
If there is a Production X → Y1Y2..Yk then add first(Y1Y2..Yk) to first(X)
First(Y1Y2..Yk) is either
    First(Y1) (if First(Y1) doesn't contain ε)
    OR (if First(Y1) does contain ε) then First (Y1Y2..Yk) is everything in First(Y1) except for ε  as well as everything in First(Y2..Yk)
    If First(Y1) First(Y2)..First(Yk) all contain ε then add ε to First(Y1Y2..Yk) as well.
跟随集规则

First put $ (the end of input marker) in Follow(S) (S is the start symbol)
If there is a production A → aBb, (where a can be a whole string) then everything in FIRST(b) except for ε is placed in FOLLOW(B).
If there is a production A → aB, then everything in FOLLOW(A) is in FOLLOW(B)
If there is a production A → aBb, where FIRST(b) contains ε, then everything in FOLLOW(A) is in FOLLOW(B)

基于LR的解析器也使用first和follow集合,first集合用于生成follow集合,follow集合用于生成LR表这是否回答了您的问题?