为了账号安全,请及时绑定邮箱和手机立即绑定

golang 分词 panic with “panic: unexpected token XXX”

golang 分词 panic with “panic: unexpected token XXX”

Go
鸿蒙传说 2022-08-24 16:52:52
我正在学习分词,一个基于golang的解析器。完成本教程后,我决定创建一个简单的数组解析器,这是我的构造。首先,我需要一个AST来表示这个数组。为了简单起见,我只解析不带引号的字符串数组。(,例如){value1, value_two, value_3_here}type SimpleArray struct {    Arr []Values `"{" @@* "}"`}type Values struct {    Str string `@Ident`}现在我为输入字符串创建一个词法分析器var Lexer = stateful.MustSimple([]stateful.Rule{    {`Ident`, `[a-zA-Z][a-zA-Z_\d]*`, nil},    {`punct`, `[}{,]`, nil},    {`whitespace`, `\s+`, nil},})我下面有我的主要功能,有一个简单的测试用例s := "{key, value}"func main() {    var parser = participle.MustBuild(&SimpleArray{},        participle.Lexer(Lexer),    )    b := &SimpleArray{}    s := "{key, value}"    err := parser.ParseString("", s, b)    if err != nil {panic(err)}    repr.Println(b, repr.Indent("  "), repr.OmitEmpty(true))}但我惊慌失措。panic: 1:2: unexpected token "key"我认为 in 结构会抓住“密钥”,但事实并非如此,为什么会这样呢?我该如何解决这个问题?@IdentValues谢谢!
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

我看到两个问题,第一个是规则定义语法错误,第二个是规则本身的错误。


解析器无法解析任何内容,因为解析器仍然需要获取令牌才能开始第一个规则。词法分析器未传递第一个令牌的原因是因为规则的名称应大写 。小写规则(如 )中的标记由词法分析器读取,但不传递给解析器。{SimpleArray{punctPunctwhitespace


此外,还有另一个问题不允许您解析逗号。您需要修改规则以允许具有分隔逗号的其他项目。


更改以下内容:


type SimpleArray struct {

    Arr []Values `"{" @@* "}"`

}

自:


type SimpleArray struct {

    Arr []Values `"{" (@@ ("," @@)*)? "}"`

}

新规则的解释:

  • "{"以解析{

  • (...)?使列表可选(如果这是您实际想要的,如果没有,请删除此部分)

  • @@ ("," @@)*以递归方式解析一个或多个项目,以逗号分隔

  • "}"以解析}


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号