首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LR1解析器和Epsilon

LR1解析器和Epsilon
EN

Stack Overflow用户
提问于 2009-01-28 08:45:10
回答 2查看 5.5K关注 0票数 6

我试图理解LR1解析器是如何工作的,但我遇到了一个奇怪的问题:如果语法中包含Epsilons怎么办?例如:如果我有这样的语法:

代码语言:javascript
运行
复制
S -> A
A -> a A | B
B -> a

如何开始是很清楚的:

代码语言:javascript
运行
复制
S -> .A
A -> .a A 
A -> .B

..。诸若此类

但我不知道这样的语法该怎么做:

代码语言:javascript
运行
复制
S -> A
A -> a A a | \epsilon

这样做正确吗?

代码语言:javascript
运行
复制
S -> .A
A -> .a A a
( A -> .\epsilon )

然后让这个状态在DFA中被接受?

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-28 12:44:15

是的,完全正确(将epsilon想象为空白空间,其中没有两个位置来放置边上的点)。

在LR(0)自动机中,您将使状态为accepting并还原为A。然而,由于A->a A a的产生,将存在shift/reduce冲突。

在LR(1)自动机中,您将使用lookahead确定是移位还是还原(a -> shift,FOLLOW(A) -> reduce中的任何内容)

请参阅Wikipedia article

票数 5
EN

Stack Overflow用户

发布于 2021-02-04 20:28:37

你可以使用这个站点来计算:https://cyberzhg.github.io/toolbox/lr1

查看结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/486920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档