鉴于我已经实现了基本的正则表达式匹配器,如何实现词法分析器?

2023-12-29

我正在尝试实现一个词法分析器来娱乐。我已经实现了一个基本的正则表达式匹配器(首先将模式转换为 NFA,然后转换为 DFA)。现在我对如何继续一无所知。

我的词法分析器将获取令牌列表及其相应的正则表达式。用于创建词法分析器的通用算法是什么?

我考虑过对所有正则表达式进行“或”运算,但随后我无法确定匹配的是哪个特定标记。即使我扩展我的正则表达式模块以在匹配成功时返回匹配的模式,我如何在匹配器中实现前瞻?


假设你有一个有效的正则表达式,regex_match它返回一个布尔值(如果字符串满足正则表达式则为 True)。首先,您需要有一个有序的标记列表(每个标记都带有正则表达式)tokens_regex,顺序很重要,因为顺序将规定优先级.

一种算法可以是(这不一定是唯一的):

  1. 写一个程序next_token它接受一个字符串,并返回第一个标记、其值和剩余字符串(或者 - 如果是非法/忽略字符 - None,则有问题的字符和剩余字符串)。注意:这必须尊重优先级,并且应该找到最长的标记。
  2. 写一个程序lex递归调用next_token.

.

像这样(用 Python 编写):

tokens_regex = [ (TOKEN_NAME, TOKEN_REGEX),...] #order describes precedence

def next_token( remaining_string ):
    for t_name, t_regex in tokens_regex: # check over in order of precedence
        for i in xrange( len(remaining_string), 0, -1 ): #check longest possibilities first (there may be a more efficient method).
            if regex_match( remaining_string[:i], t_regex ):
                return t_name, remaining_string[:i], remaining_string[i:]
    return None, remaining_string[0], remaining_string[1:] #either an ignore or illegal character

def lex( string ):
    tokens_so_far = []
    remaining_string = string
    while len(remaining_string) > 0:
        t_name, t_value, string_remaining = next_token(remaining_string)
        if t_name is not None:
            tokens_so_far.append(t_name, t_value)
        #elif not regex_match(t_value,ignore_regex):
            #check against ignore regex, if not in it add to an error list/illegal characters
   return tokens_so_far

为了改进词法分析器,需要添加一些内容:忽略正则表达式、错误列表和位置/行号(对于这些错误或标记)。

玩得开心!祝你制作解析器好运:)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

鉴于我已经实现了基本的正则表达式匹配器,如何实现词法分析器? 的相关文章

  • 正则表达式和 ios5 stringByMatching ==> NSRegularExpression

    如何使用等效的 NSRegularExpression 更改此行 NSString encodedPoints apiResponse stringByMatching points capture 1L 谢谢 请记住 您需要 iOS 4
  • 如何发现“贪婪”算法?

    我正在读一本关于 贪婪 算法 但我很难发现它们解决真正的 顶级程序员 问题 If I know给定的问题可以用 贪婪 算法来解决 因此编写解决方案非常容易 然而 如果我没有被告知这个问题是 贪婪的 我就无法发现它 用 贪婪 算法解决的问题有
  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • 期望最大化算法的数值示例[重复]

    这个问题在这里已经有答案了 由于我不确定给出的公式 有人可以提供 EM 算法的简单数字示例吗 一个非常简单的具有 4 或 5 个笛卡尔坐标的坐标就可以了 那这个呢 http en wikibooks org wiki Data Mining
  • C#中如何从字符串中提取十进制数

    string sentence X10 cats Y20 dogs 40 fish and 1 programmer string digits Regex Split sentence D 对于此代码 我在数字数组中获取这些值 10 20
  • C# 验证用户输入(如信用卡号)

    这是为了一个任务 我需要为三明治店创建一个程序 其中一部分是验证用户的付款信息 本次作业的指导方针是 信用卡号码必须为16位数字 前 4 位数字必须是以下数字之一 1298 1267 4512 4567 8901 8933 到期日期必须为
  • 给定一个零索引数组 & 该数组的平衡索引[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给出一个由 N 个整数组成的零索引数组 A 该数组的平衡索引是任何整数 P 满足 0 P 例如 考虑以下由 N 8 个元素组成的数组
  • 循环中的递归算法复杂度(运行时间)

    我想了解您对如何检测以下递归算法的 T n 运行时间 的意见 Charm 是一种用于发现事务数据库中频繁闭项集的算法 频繁闭项集列表是在一组交易 tids 中多次出现的频繁项 例如面包和牛奶是经常一起购买的物品 它们是通过将索引为 i 的当
  • 对产品列表进行分类的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表或多或少相同的产品的列表 例如 在下面的列表中 它们都是希捷硬盘 希捷硬盘 500Go 适用于笔记本电脑的希捷硬盘 120
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 不支持的 Perl 语法:`(?<`

    我想解析 cmd gpg list keys 的结果以将其显示在浏览器上 cmd输出是这样的 pub rsa3072 2021 08 03 SC expires 2023 08 03 07C47E284765D5593171C18F00B1
  • 为字符串列表创建正则表达式

    I have extracted a series of tables from the scientific literature which consist of columns each of which is a distinct
  • 为什么路径压缩不会改变 UnionFind 中的排名?

    我正在研究 UnionFind 的实现 并从这里进行排序和路径压缩http en wikipedia org wiki Disjoint set data struct Disjoint set forests http en wikipe
  • 使用 sed 替换复杂模式

    我想使用 sed 命令替换模式 要删除的图案如下所示 带有一个空格 var 0xaae8 x6A x6F x69 x6E x72 x65 x76 x65 x72 x73 x65 x73 x70 x6C x69 x74 x3E x74 x70
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • 证明字符串算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 awk 将特定子字符串与正则表达式匹配

    我正在处理特定的文件名 并且需要从中提取信息 文件名的结构类似于 20100613 M4 28007834 005 F RANDOMSTR raw gz RANDOMSTR 是最多 22 个字符的字符串 并且可能包含 或不包含 格式为 W
  • 具有条件的重复行 pandas dataframe python

    我的数据框有问题 我的 df 是 product power brand product 1 3 x 1500W brand A product 2 2x1000W 1x100W product 3 1x1500W 1x500W brand
  • 如何强制 Perl 按需重新编译使用“/o”编译的正则表达式?

    技术问题 给定一个正则表达式 my regEx qr whatever myVar oxi Notice o for compile once 强制重新编译的最有效方法是什么一经请求 例如 当我从程序逻辑中知道 myVar值改变 而不下降

随机推荐

  • TabLayout 指示器定制

    i have been searching how to change the indicator in Tablayout to be circular like this 但我不知道该怎么做 请帮忙 来自源代码 https androi
  • 让 Textmate 识别 Ruby 版本升级

    我使用了以下说明http bparanj blogspot com 2010 06 installing ruby 191 on snow leopard html http bparanj blogspot com 2010 06 ins
  • 无法访问类“android.arch.core.util.Function”

    您好 我无法创建代码实现 错误如标题所示 Transformations switchMap mLiveData listOfDamages gt doSth or Transformations map liveData doSth 我无
  • 页面上的猫头鹰轮播和引导选项卡

    我正在尝试使用引导程序和猫头鹰轮播构建一个页面 猫头鹰轮播适合网站的目的 而不是引导版本 所以我有一个选项卡结构 我想在每个页面上放置一个轮播 但是我所有的尝试都失败了 这是我的代码 div ul class nav nav tabs li
  • 使用 ByteBuddy 定义泛型类型的字段

    我刚刚开始使用 ByteBuddy 并且正在研究几个示例以掌握它的窍门 我试图通过此练习完成的任务是用 ByteBuddy 替换一些使用 ASM 的代码 到目前为止 我在非泛型类型方面取得了成功 例如 我可以轻松定义一个字段 如下所示 bu
  • SQL Server AND 和 OR 优先级[重复]

    这个问题在这里已经有答案了 我正在调试一些代码并遇到了这个 有人可以帮助我根据 SQL Server 顺序将此语句放在括号中吗 是我一个人这样 还是编码不好 WHERE T1 C1 VAR1 AND T1 C2 VAR2 AND T1 C3
  • 相对质数

    如何在c 中创建一个函数来确定两个输入的数字是否互质 没有公因数 例如 1 3 有效 但 2 4 无效 吉姆 克莱 Jim Clay 的不谨慎评论促使其付诸行动 以下是六行代码的欧几里得算法 bool RelativelyPrime int
  • 如何随机化列表并迭代随机列表(bash)

    我编写了一个小 bash 脚本 用于读取文本文件中的命令 每行一个 目前 脚本 如下所示 正在按顺序执行命令 即按照文件中输入的顺序 我希望帮助修改下面的脚本 以便它将命令读入数组 然后在迭代随机列表之前随机化该数组 即列表 这是我到目前为
  • java.io.IOException 已建立的连接被主机中的软件中止[重复]

    这个问题在这里已经有答案了 当我对远程服务器执行一个 servlet 调用时 我经常收到此错误 运行 java application1 用很少的数据调用 application2 的 servlet 调用 应用程序 2 必须返回一些数据
  • 在代码隐藏中创建样式

    有谁知道如何在代码隐藏中创建 wpf 样式 我在网络或 MSDN 文档上找不到任何内容 我已经尝试过这个但它不起作用 Style s new Style typeof TextBlock s RegisterName Foreground
  • 如何使用 POST 方法发送 pandas 数据帧并在 Hug/其他 REST API 框架中接收它? pickle.loads 发送后无法取消pickle

    如何使用发送 pandas DataFramePOST method 例如 以下拥抱服务器 http www hug rest 听一个POST使用 pickled pandas DataFrame 请求并响应 import hug impo
  • 如何通过切片范围有效索引一维 numpy 数组

    我有一个大的一维数据数组 我有一个starts发生重要事件的数据的索引数组 我想获得一个范围数组 以便获得长度的窗口L 每个起始点一个starts 虚假样本数据 data np linspace 0 10 50 starts np arra
  • Spring Boot中获取请求头

    如何从调用我的 Springboot 应用程序的应用程序获取当前请求的标头和正文 我需要提取这些信息 不幸的是这不起作用 我尝试使用此代码示例获取当前请求 https stackoverflow com a 26323545 5762515
  • 使用 SwiftUI 将单个引脚添加到 Mapkit

    如何使用 Xcode 11 GM SwiftUI 在地图上添加简单的图钉 我的代码如下 这里显示了以坐标为中心的地图 但我只想显示其他坐标的一个引脚 import SwiftUI import MapKit struct ContentVi
  • iOS:使用 Swift 修剪音频文件?

    我必须将音频文件和录制的语音合并 例如录制的语音是47秒 我必须将 4 分钟的音频歌曲剪切或修剪到 47 秒 并合并音频文件 var url NSURL if self audioRecorder nil url self audioRec
  • 访问器属性错误:无法重新定义不可配置的属性“状态”

    我正在尝试定义一个对象并创建一个访问器属性 for it HTML
  • Java 中的泛型是什么? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我真的不明白泛型的意义 它们有什么作
  • 使用 bash 脚本设置 java ProcessBuilder 环境

    我一直在使用 ProcessBuilder 成功调用具有各种环境变量的进程env put VAR value 现在我想获取一些 bash 脚本来设置一大堆在 java 中未预先确定的环境变量 有人知道一个简单的方法来做到这一点吗 bash支
  • 如果未填写表单字段,则阻止表单提交

    我有这个代码
  • 鉴于我已经实现了基本的正则表达式匹配器,如何实现词法分析器?

    我正在尝试实现一个词法分析器来娱乐 我已经实现了一个基本的正则表达式匹配器 首先将模式转换为 NFA 然后转换为 DFA 现在我对如何继续一无所知 我的词法分析器将获取令牌列表及其相应的正则表达式 用于创建词法分析器的通用算法是什么 我考虑