基于#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
相关产品推荐
相关产品推荐

