Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带“的golang分词恐慌”;恐慌:意外标记XXX“;_Go_Parsing_Lexer - Fatal编程技术网

带“的golang分词恐慌”;恐慌:意外标记XXX“;

带“的golang分词恐慌”;恐慌:意外标记XXX“;,go,parsing,lexer,Go,Parsing,Lexer,我正在学习,一个基于golang的解析器。读完教程后,我决定创建一个简单的数组解析器,下面是我的构造 首先,我需要一个AST来表示这个数组。为了简单起见,我只解析不带引号的字符串数组。({value1,value2,value3},e.t.) 类型SimpleArray结构{ Arr[]值“{@*}”` } 类型值结构{ Str字符串'@Ident` } 现在我为输入字符串创建一个Lexer var Lexer=stateful.MustSimple([]stateful.Rule){ {`I

我正在学习,一个基于golang的解析器。读完教程后,我决定创建一个简单的数组解析器,下面是我的构造

首先,我需要一个AST来表示这个数组。为了简单起见,我只解析不带引号的字符串数组。(
{value1,value2,value3}
,e.t.)

类型SimpleArray结构{
Arr[]值“{@*}”`
}
类型值结构{
Str字符串'@Ident`
}
现在我为输入字符串创建一个Lexer

var Lexer=stateful.MustSimple([]stateful.Rule){
{`Ident`,`[a-zA-Z][a-zA-Z\ud]*`,nil},
{`punct`,`[}{,]`,nil},
{`whitespace`、`s+`、nil},
})
下面是我的主要功能,有一个简单的测试用例
s:=“{key,value}”

func main(){
var parser=participle.MustBuild(&SimpleArray{},
分词Lexer(Lexer),
)
b:=&SimpleArray{}
s:=“{key,value}”
err:=parser.ParseString(“,s,b)
如果err!=nil{panic(err)}
repr.Println(b,repr.Indent(“”),repr.empty(true))
}
但我有点恐慌

panic:1:2:意外的令牌“key”
我认为
Values
struct中的
@Ident
将捕获“键”,但它不是,为什么?我怎样才能解决这个问题


谢谢

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

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

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

更改以下内容:

类型SimpleArray结构{
Arr[]值“{@*}”`
}
致:

类型SimpleArray结构{
Arr[]值“{”(@(“,@)*”)?“}”`
}
对新规则的解释:

  • “{
    来解析
    {
  • (…)?
    使列表可选(如果这是您真正想要的,如果不是,请删除此部分)
  • @(“,”@)*
    递归解析一个或多个项目,以逗号分隔
  • “}”
    来解析
    }

这有点道理,但就我的情况而言,小写字母“punct”不是说,如果解析器看到“{”、“}”、“,”就忽略它们并继续。这样我的解决方案仍然有效,不是吗?@YiLuo文档指出,“为了方便起见,任何以小写字母开头的规则都将从输出中删除。”因此,lexer读取它,但不将其传递给解析器。然而,解析器需要这些标记。lexer和解析器是独立的,所以让我更新我的答案以提供澄清。