首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基本语法中"END“和"END IF”之间的冲突,使用Lark

基本语法中"END“和"END IF”之间的冲突,使用Lark
EN

Stack Overflow用户
提问于 2019-05-10 14:44:11
回答 2查看 462关注 0票数 1

我正在尝试使用Lark为BASIC创建一个LALR解析器,并且我很难修复"END“语句和"END IF”等语句之间的冲突。以下是该语法的简化版本:

代码语言:javascript
运行
AI代码解释
复制
%ignore /[ \t\f]+/

program: _nlopt _part_list

_part_list: (stmt | block) _nl _part_list
          |

_nlopt: _nl
      |

_nl: _NEWLINE _nl
   | _NEWLINE

block: if_block

stmt: print_stmt
    | end_stmt

end_stmt: END_KW

if_block: IF_KW expr THEN_KW _nl block_body endif_stmt

endif_stmt: END_KW IF_KW

block_body: _block_body_item block_body
          |

_block_body_item: stmt _nl

print_stmt: PRINT_KW expr

?expr: NUMERIC_LITERAL

_NEWLINE: "\n"
NUMERIC_LITERAL: /[\-+]?\d+(\.\d*)?[!#%&]?/

END_KW: "end"i
IF_KW: "if"i
PRINT_KW: "print"i
THEN_KW: "then"i

如果我用下面这样的代码尝试这个语法:

代码语言:javascript
运行
AI代码解释
复制
parser = Lark(grammar, start='program', parser='lalr')

prog = r"""
if 1 then
   print 200
end if
"""
t = parser.parse(prog)
print(t.pretty())

这是我从Lark那里得到的:

代码语言:javascript
运行
AI代码解释
复制
Traceback (most recent call last):
  File "test.py", line 230, in <module>
    t = parser.parse(prog)
  File "/home/user/.pyenv/versions/venv/lib/python3.6/site-packages/lark/lark.py", line 250, in parse
    return self.parser.parse(text)
  File "/home/user/.pyenv/versions/venv/lib/python3.6/site-packages/lark/parser_frontends.py", line 37, in parse
    return self.parser.parse(token_stream, *[sps] if sps is not NotImplemented else [])
  File "/home/user/.pyenv/versions/venv/lib/python3.6/site-packages/lark/parsers/lalr_parser.py", line 68, in parse
    for token in stream:
  File "/home/user/.pyenv/versions/venv/lib/python3.6/site-packages/lark/lexer.py", line 341, in lex
    for x in l.lex(stream, self.root_lexer.newline_types, self.root_lexer.ignore_types):
  File "/home/user/.pyenv/versions/venv/lib/python3.6/site-packages/lark/lexer.py", line 175, in lex
    raise UnexpectedCharacters(stream, line_ctr.char_pos, line_ctr.line, line_ctr.column, allowed=allowed, state=self.state)
lark.exceptions.UnexpectedCharacters: No terminal defined for 'i' at line 4 col 5

end if
    ^

Expecting: ['__IGNORE_0', '_NEWLINE']

如果我删除"end_stmt“规则,这将不会发生。有没有办法修复语法,使这种情况不会发生?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-10 21:50:23

默认情况下,Lark不会警告您语法中存在shift-reduce冲突,而是静默地解决这些冲突,以支持shift。通常,这会导致解析器无法解析您想要的内容-就像这里的情况一样。您可以通过将debug = True标志传递给Lark()来使lark就此类冲突向您发出警告。这样,您甚至可以在通过测试发现问题之前就发现问题所在,甚至可以获得有关问题所在位置的有用信息。

启用debug选项后,您将收到一条警告,提示存在shift-reduce冲突,其中END_KW可能意味着当前block_body已结束,也可能是end_stmt。这是一个问题,因为LALR(1)解析器只能向前看一个令牌,但我们必须向前看第二个令牌,看看在end之后是否有if才能正确地决定采用哪个选项。

您可以通过将end if转换为单个令牌来修复此问题,如下所示:

代码语言:javascript
运行
AI代码解释
复制
ENDIF_KW: /end[ \t\f]+if/i

然后使用ENDIF_KW而不是END_KW IF_KW

PS:请注意,如果您使用Earley解析而不是LALR(1),您的语法将在没有这些更改的情况下工作得很好。

票数 3
EN

Stack Overflow用户

发布于 2019-05-22 11:30:17

我和我的基本语法也有同样的冲突。basic语言是LALR(2)或LR(2),因为有END WHILE、END IF等。如果你有一个LR(2)解析器生成器,你可以解析Basic。LRSTAR解析器生成器可以创建LR(2)解析器。

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

https://stackoverflow.com/questions/56079928

复制
相关文章
css实现圆形的四种方法
是最简单的应用,并且得到了广泛的支持。该border-radius属性还将影响边框,阴影和元素的触摸/单击目标大小。
薛定喵君
2020/02/17
3K0
【SVG】Path 路径用法详解
SVG Path可用于绘制复杂的路径,如创建线条, 曲线, 弧形等等。其所有属性中,属性d是一个“命令+参数”的序列,用于描述路径,Path强大正在于d属性,因此掌握了d属性成了关键。
Yorkyu
2022/03/22
3.1K0
【SVG】Path 路径用法详解
用SVG实现一个优雅的提示框
Tooltips常被称为提示框(或信息提示框),提示框能够以较强的交互性、自由度为用户提供相应的提示信息。今天我们要聊的不是如何实现强大的交互行为,而是来看看如何以最好的方式来还原他们的视觉效果,并且能适用于不同的场景。
ConardLi
2020/06/10
2.5K0
用SVG实现一个优雅的提示框
一篇文章带你了解SVG 阴影
所有互联网的SVG滤镜定义在<defs>元素中。<defs>元素定义短并含有特殊元素(如滤镜)定义<filter>标签用来定义SVG滤镜。
前端进阶者
2021/03/03
9100
一篇文章带你了解SVG 阴影
SVG 路径动画简易指南
任何有开发经验的前端工程师都会考虑到不成体系的设备生态所带来的挑战。设备间不同的屏幕尺寸、分辨率和比例使得产品难以提供一致的体验,对于那些对产品有着像素级完美追求的人这种体验差异尤其显著! SVG(可缩放的矢量图形)完美地解决了上文中提到的部分问题。尽管 SVG 有它的局限性,但是在某些场景下是非常有用的,如果你有一个好的设计团队,你也可以基于SVG创建一些震撼的视觉体验,而不必担心给浏览器带来过重的渲染负担或阻碍页面的加载时间。
疯狂的技术宅
2019/03/27
3.6K0
SVG 路径动画简易指南
SVG 直线路径写法示例
大写字母表示到后面值为绝对值,小写字母表示后面值为相对当前点的值 画一条起点是(10, 10)终点点是 (20, 30) 的线
前端GoGoGo
2018/08/24
7560
CSS实用技巧总结
全名Don't Repeat Yourself,该原则适用于所有编程语言而不限于css。
Nealyang
2020/04/22
1.5K0
CSS实用技巧总结
打造高水平设计的必备利器Ai中文版illustrator-直装永久使用
Adobe illustrator是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件,很多有插画排版或者矢量插图 工作 需求的小伙伴们会经常和这款软件打交道,但是最近小编发现了这款软件的新功能,就是制作海报,小编相信有很多小伙伴们还不知道吧,那么接下来就看看小编为大家带来的这篇文章学习一下制作方法吧!
木子学Lee
2023/04/08
1.5K0
打造高水平设计的必备利器Ai中文版illustrator-直装永久使用
【整理】SpringBoot默认的各种路径(如静态资源路径,配置文件路径等)
传统的Java Web项目,一般是新建一个WebContent目录,然后所有页面,js等静态资源都放在里面。但是在SpringBoot的规范里,不需要这么做
RRT冻羊
2022/11/03
5.5K0
奇思妙想 CSS 文字动画
本文将会和这篇 -- CSS 奇思妙想边框动画类似,讲一些文字效果,利用不同的属性搭配,实现各式各样的文字动效。
Sb_Coco
2021/03/11
3.5K0
奇思妙想 CSS 文字动画
【CSS】1095- CSS filter 有哪些神奇用途
CSS filter 属性将模糊或颜色偏移等图形效果应用于元素形成滤镜,滤镜通常用于调整图像,背景和边框的渲染。它的值可以为 filter 函数 <filter-function> 或使用 url 添加的svg滤镜。
pingan8787
2021/10/08
1.2K0
【CSS】1095- CSS filter 有哪些神奇用途
CSS filter 有哪些神奇用途
CSS filter 属性将模糊或颜色偏移等图形效果应用于元素形成滤镜,滤镜通常用于调整图像,背景和边框的渲染。它的值可以为 filter 函数 <filter-function> 或使用 url 添加的svg滤镜。
coder_koala
2021/07/08
1.3K0
CSS filter 有哪些神奇用途
Flutter 绘制实践 | 路径篇 - 阴影模糊
说起 Flutter 绘制阴影,很多朋友可能都知道 Canvas 本身有 drawShadow 方法。可以根据入参的 Path 路径,绘制阴影。就像我们男人分不清口红色号一样,觉得口红就是红色,很多编程者也会觉得阴影就是影子。如果一个方法就能绘制出完美的阴影,也不会单独写篇文章。
张风捷特烈
2023/02/15
1.3K0
Flutter 绘制实践 | 路径篇 - 阴影模糊
SVG 动画精髓(上)
本文作者:ivweb villainthr TL;DR 本文主要是讲解关于 SVG 的一些高级动画特效,比如 SVG 动画标签,图形渐变,路径动画,线条动画,SVG 裁剪等。 例如:路径动画 图形
腾讯IVWEB团队
2017/07/06
3.7K0
SVG 动画精髓(上)
web 图像技术:前端引入图片的各种方式及其优缺点
前端开发人员在构建网站时需要做的一个决定是引入图片的方式。它可以是<img>标签,或者是通过CSS background 属性,还可以使用 SVG <image>。选择正确的方式是很重要的,它对性能和可访问性有很大的影响。
前端小智@大迁世界
2020/05/12
5.1K0
web 图像技术:前端引入图片的各种方式及其优缺点
如何在 CSS 中设计出漂亮的阴影?
然而,当我环顾网络时,很明显,大多数阴影并不像它们所希望的那样丰富,网络上覆盖着模糊的灰色盒子,看起来并不像影子。
唐志远
2023/08/17
5080
如何在 CSS 中设计出漂亮的阴影?
如何在Cloudera Manager中配置Yarn放置规则
Hadoop集群管理员希望能对集群Yarn作业的资源进行控制。根据不同的业务组或不同的用户,对Yarn的资源池进行划分,达到资源管控、任务管控的效果。通过CM可以进行Yarn动态资源的配置,这里Fayson主要介绍如何在Cloudera Manager中配置Yarn动态资源池的放置规则。
Fayson
2018/11/08
3.2K0
简单的canvas绘图
注意:默认情况下 <canvas> 元素没有边框和内容,width 和 height 属性定义的画布的大小.
江米小枣
2020/06/15
2.4K0
svg上实现图形移动
前两个参数分别是x轴半径和y轴半径,x-axis-rotation是绕x轴旋转角度,large-arc-flag(角度大小) 和sweep-flag(弧线方向),large-arc-flag决定弧线是大于还是小于180度,0表示小角度弧,1表示大角度弧。sweep-flag表示弧线的方向,0表示从起点到终点沿逆时针画弧,1表示从起点到终点沿顺时针画弧。
Enterprise_
2020/07/09
1K0
svg上实现图形移动
canvas绘制时钟 光明 | 黑暗主题
canvas时钟的绘制参考了 # Sunshine_Lin的# 为了让她10分钟入门canvas,我熬夜写了3个小项目和这篇文章
inline705
2021/12/09
7530
canvas绘制时钟 光明 | 黑暗主题

相似问题

C指针:*p++和p++差

43

取消引用后,*p++是否会递增?

50

等待(NULL)是否定义良好?

15

++*p++输出

22

什么是*p++=x

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文