首页 > 其他分享 >报错信息中出现了 error: unexpected token: `::` 似乎是不能解析`::`

报错信息中出现了 error: unexpected token: `::` 似乎是不能解析`::`

时间:2024-12-28 11:30:46浏览次数:6  
标签:unexpected Keyword Token token lalrpop 报错 枚举 Rust

processing file `/root/EuclidOLAP/olap-core/src/parser.lalrpop`
  /root/EuclidOLAP/olap-core/src/parser.lalrpop:24:10: 24:11 error: unexpected token: `::`

  --- stderr
        Token::Keyword("&00000000".to_string())
             ~~
  LALRPOP code generation failed with error: invalid data
  
你看,报错信息中出现了 error: unexpected token: `::`
似乎是不能解析`::`

UUUUUUUUUUUUUUUUUUUUUUUUUU
报错信息表明,lalrpop 在处理 :: 时遇到了问题。lalrpop 并不直接支持在语法规则中使用 Rust 的路径(即 ::)语法来引用 Rust 中的类型和构造函数。它期望的是直接处理来自词法分析器的 token 类型,而不是像 Rust 语法那样的路径表示。

为了解决这个问题,我们需要在 lalrpop 语法规则中避免使用 ::,并按照 lalrpop 期望的格式来处理这些类型。可以通过以下几种方式进行修复:

解决方法

方法一:通过 lalrpop 中的规则传递 Token 类型

如果你在 lalrpop 中引用 Rust 中的 Token 类型,应该避免使用 :: 直接访问 Rust 枚举的变体。你可以通过传递原始的 token 而不是在 lalrpop 中直接构造 token。

lalrpop 中,你应该首先使用 nom 或其他方式生成 Token 流,并将这些 Token 作为输入传递给 lalrpop。然后,在 lalrpop 规则中,你仅仅需要根据传递的 token 类型进行匹配。

假设你已经通过 nom 构造了一个 Token::Keyword,你可以像下面这样修改 lalrpop 文件:

  1. lalrpop 中,直接使用 token 类型,而不是 :: 访问构造函数。

例如,在 lalrpop 语法规则中,可以通过 Token::Keyword 来直接匹配已经通过词法分析器生成的 token,而不是在规则中进行构造。

// 假设 Token::Keyword 在语法中已经作为 token 类型存在
KeywordToken: Token = {
    Token::Keyword(String)
};

你不需要在 lalrpop 文件中通过 :: 调用 Token::Keyword。在 lalrpop 中,Token 应该已经是通过词法分析器解析出来的类型,而你只需要通过模式匹配来识别它。

方法二:通过 lalrpop 规则直接匹配 token 字面量

如果 Token::Keyword 是你自己定义的一个枚举,并且它在 Rust 代码中已经作为字面量存在,你可以将规则修改为匹配这些字面量,而不是直接在 lalrpop 中调用 Rust 枚举的构造函数。

例如,你可以使用 nom 解析器生成 token 后,在 lalrpop 中匹配特定的字面量:

KeywordToken: Token = {
    Token::Keyword("&00000000".to_string())
};

在这种方式下,你就不需要依赖 :: 来构造 token,而是通过直接在规则中定义字面量值来进行匹配。

方法三:在 build.rs 中生成代码前处理 Token 枚举

另一种做法是,你可以考虑在 Rust 代码中将 Token 枚举转换为一个可以被 lalrpop 理解的格式。在 build.rs 文件中处理 Token 枚举的转换,确保它能够在 lalrpop 中正确工作。

例如,在 Rust 代码中使用 nom 生成 token 流后,传递这些 token 给 lalrpop,让 lalrpop 通过模式匹配来解析。

结论

最主要的改动是:不要在 lalrpop 文件中直接使用 :: 来引用 Rust 中的类型和构造函数。相反,应该通过词法分析器生成的 token 流来在 lalrpop 规则中匹配这些 token 类型,而不是在 lalrpop 语法中手动构造它们。

标签:unexpected,Keyword,Token,token,lalrpop,报错,枚举,Rust
From: https://www.cnblogs.com/Tifahfyf/p/18637326

相关文章

  • git:报错: Diverging branches can't be fast-forwarded
    一,报错信息:hint:Divergingbranchescan'tbefast-forwarded,youneedtoeither:hint:hint:gitmerge--no-ffhint:hint:or:hint:hint:gitrebasehint:hint:Disablethismessagewith"gitconfigadvice.divergingfalse"fatal:Notposs......
  • Centos7下yum安装报错问题解决方法Cannot find a valid baseurl for repo: base/7/x86
    Cannotfindavalidbaseurlforrepo:base/7/x86_64 目录Cannotfindavalidbaseurlforrepo:base/7/x86_64 原因如下:1.网络问题2.错误的YUM源配置3.代理设置问题 原因如下:1.网络问题首先,检查系统的网络连接是否正常,可以通过以下命令测试:ping......
  • 微信小程序上传图片报错:uploadFile:fail url not in domain list
    上传图片时,在微信开发工具中可以正常上传成功,手机上预览也可上传成功。小程序发布成功后,上传失败,提示“uploadFile:failurlnotindomainlist”。错误信息如下:解决方案:1、在微信管理公众平台|小程序-开发-开发管理-服务器域名下的服务器配置uploadFile合法域名,没有添加服务器......
  • yarn install 安装报错:Workspaces can only be enabled in private projects.
    在本地运行项目的时候,使用yarninstall安装模块依赖的时候,遇到报错:Workspacescanonlybeenabledinprivateprojects.一、原因分析报这个错误是因为你使用了yarn的workspace,但并未将工程标记为private。二、解决办法在项目根目录中的package.json文件中添加p......
  • 大语言模型的token和向量
    现在大语言模型火了,像ChatGPT什么的,能回答问题、写文章,。但它们为啥这么聪明呢?这就和向量、Token有关系。那怎么通过向量、Token来理解我们的问题呢。看完这篇文章就知道了tokenToken就像是语言里的小积木,是文本中最小有意义的部分。英文里,单词常常就是Token,不过有时候......
  • 【YashanDB知识库】启动yasom时报错:sqlite connection error
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7817893.html?templateId=1718516【标题】启动yasom时报错:sqliteconnectionerror【问题分类】安装部署【关键字】错误码sqlite3.Error、yasom启动失败、共享集群、unabletoopendatabasefile【......
  • Microsoft GraphRAG: Token使用量とコストの簡易分析
    MicrosoftGraphRAG:Token使用量とコストの簡易分析背景前提条件サンプルテキストChunk分割方法抽出するエンティティ・タイプ使用するLLMとコスト設定分析結果1.CreateBaseTextUnits2.ExtractGraph3.CreateFinalCommunityReports4.GenerateTextEmbedding......
  • mongodb常见报错
    mongodb常见报错目录mongodb常见报错MongoDB异常MongoCursorNotFoundException背景:问题分析:解决方案方案一:null方案二:方案三:方案四:MongoDB异常MongoCursorNotFoundException报错内容:om.mongodb.MongoCursorNotFoundException:Queryfailedwitherrorcode-5Causedby:......
  • Eclipse Jgit 不支持高版本 openssh 私钥的结局方法 (jsch 报错 invalid privatekey
    替换jsch依赖<dependency><groupId>org.eclipse.jgit</groupId><artifactId>org.eclipse.jgit.ssh.jsch</artifactId><version>7.1.0.202411261347-r</version><ex......
  • rust-analyzer 引入含有openssl包报错(openssl未找到)问题解决方案
    1.下载openssl编译后的包https://slproweb.com/products/Win32OpenSSL.html选择完全包2.安装注意下面这一步把dll安装到/bin所在的同级目录一路回车,最后的捐款可以不选3.设置环境变量经过实验,主要的环境变量有3个OPENSSL_DIR="C:\ProgramFiles\OpenSSL-Win64"这......