You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于#lang brag的解析器能否匹配token值而非类型?

在Brag中匹配特定取值的Token

你遇到的这个报错根源其实很好理解:Brag对规则里的字符串字面量有默认处理逻辑——当你直接写"start"时,它会默认把这个字符串当成token类型名(也就是认为你定义了一个名为'start的token),但你的实际需求是匹配WORD类型token中取值为"start"的实例,这就导致Brag混淆了:它找不到名为start的token类型,又误以为你可能把start当作了非终结符(但你根本没定义这个非终结符),所以抛出了那个冲突错误。

那怎么解决这个问题呢?你需要明确告诉Brag:我要匹配的是**类型为WORD、取值为"start"**的token,而不是名为start的token类型。在Brag里可以通过直接写出token的完整形式来实现,也就是用(token WORD "start")替换规则里的"start"。

修改后的代码如下:

#lang brag

program : sexpr* startt* layout
sexpr : SEXPR
; 替换原有的"start"为明确的token匹配规则
startt : (token WORD "start") WORD "[" WORD* "=>" sexpr "]"
layout : elem*
elem : info | text | sexpr
info : "{" text "}"
text : WORD*

这样修改后,Brag就会准确识别:这里需要匹配的是一个WORD类型的token,并且它的取值必须是"start",不会再把"start"当成未知的token类型或非终结符。

最后要确认你的词法分析器(lexer)确实生成了形如(token 'WORD "start")的token,而不是把"start"单独生成为'start类型的token——这是确保解析正常工作的前提。

内容的提问来源于stack exchange,提问作者Ploppz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:53:41