带“的golang分词恐慌”;恐慌:意外标记XXX“;
我正在学习,一个基于golang的解析器。读完教程后,我决定创建一个简单的数组解析器,下面是我的构造 首先,我需要一个AST来表示这个数组。为了简单起见,我只解析不带引号的字符串数组。(带“的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
{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[]值“{”(@(“,@)*”)?“}”`
}
对新规则的解释:
来解析“{
{
使列表可选(如果这是您真正想要的,如果不是,请删除此部分)(…)?
递归解析一个或多个项目,以逗号分隔@(“,”@)*
来解析“}”
}