当前位置: 首页 > 知识库问答 >
问题:

如何处理lexer中作为有限自动机实现的空白?

祁远
2023-03-14

我为一种简单的编程语言创建了lexer。现在,我使用确定性有限自动机代替正则表达式(Java中的正则表达式)。自动机工作得很好,只是它不会报告错误,例如,如果我在源代码中有moduleclouds(module和clouds都是关键字)。相反,它将创建两个令牌,称为KW_模块和KW_云。有人可能会说,如果自动装置处于KW_模块的最终状态,我可以展望空白。但这并不能解决问题,因为在语言中,我可以有8-6(不被空格分隔)这样的东西,可以正确地翻译成标记INT-DASH INT。

我知道在解析器的语法中处理空白不是一个好主意。

我的自动机实现为矩阵(行是状态,列是字母表中的字符,单元格是过渡状态)。当自动机进入最终状态时,我将自动机重置为从开始状态开始。

我相信问题是因为这种编程语言不使用分号。例如:

单元云;

相反,它使用空白来分隔线:模块云

提前谢谢。

问候。

共有1个答案

叶鸿煊
2023-03-14

FWIW,我所研究的解析器通过要求关键字也是语法定义的正确标识符来处理这个问题。

例如,如果标识符定义为一个字符,后跟更多字符或数字,则任何关键字也必须符合该模式。然后,lexer只会将标记视为潜在关键字,前提是它已经被归类为ident。

不过,我很想听听其他人是如何处理这个问题的。

 类似资料:
  • 这里的“自动机”指的是”确定有限状态自动机”。而自动机是信息学奥林匹克竞赛、计算机科学中被广泛使用的一个数学模型,其思想在许多字符串算法中都有涉及,学习自动机有助于理解上述算法,但是学习自动机前一定要先了解基础图论的相关知识,这样才更好理解自动机。 自动机(确定有限状态自动机)是由一个非空有限状态的集合Q、一个输入字母表 Σ(非空有限字符的集合)、一个转移函数(单值映射)、一个开始状态、一个接受状

  • 本文向大家介绍Linux有限状态机FSM的理解与实现,包括了Linux有限状态机FSM的理解与实现的使用技巧和注意事项,需要的朋友参考一下 有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。FSM是一种逻辑单元内部的一种高效编程方法,在服务器编程中,服务器可以根据不同状态或者消息类型进行相应的处

  • 本文向大家介绍权限管理如何实现?相关面试题,主要包含被问及权限管理如何实现?时的应答技巧和注意事项,需要的朋友参考一下 1)前端控制: 前端的控制比较简单,从后台获取到用户的权限之后,可以存在session或者cookie中,然后在页面加载的时候,通过session或者cookie中存的权限来选择让该功能展现或者禁用。 前端实现代码详细参见:http://blog.csdn.net/liuweid

  • 我正在尝试运行正则表达式来捕获以下字符串的键和值: 下面是每种类型的一些语法注释,如下所示: > 键:一串字母,无空格 值: 可能有引号,例如“EvokeObjects” 引号内可能有空格 引号内可能有特殊字符,例如“hello/world@!18” 可能有一个函数,如string("ExtResource(5 )"). 函数字符串将在括号内包含空格 我已经在引号内有空格: 因此,这将与< cod

  • 我的应用程序支持所有方向,除了肖像向上向下。在我的视图层次结构中,我有一个AVCaptureVideoPreviewLayer作为俯视图中的一个子层,即UIImageView。然后,在视图层次结构的下方是几个显示控件的覆盖视图。 覆盖视图可以在方向改变的情况下正常工作,但我不知道如何使用这个AVCaptureVideoPreviewLayer。我希望它的行为像照相机应用程序一样,这样preview

  • Java8集合提供了以流形式获取集合的特性。然而,一旦我们调用stream()方法,我们就会以stream的形式获得集合的当前内容。如果我的集合在流处理过程中增长怎么办?流上的操作可能会用更多的数据更新集合。有没有一个简单有效的方法来处理这种情况?