如何将关键字与害虫进行匹配?

问题描述

我正在尝试解析这样的一行

MyTupleComponent str,str

有语法

cname = _{ (ASCII_ALPHANUMERIC | "_")+ }

ints = { "i8" | "i16" | "i32" | "i64" | "i128" | "isize" }
uints = { "u8" | "u16" | "u32" | "u64" | "u128" | "usize" }
strings = { "str" | "String" }
types = { strings | ints | uints }

tuple_component = { cname ~ (types ~ ("," ~ types)?)+ }

但最终是

Err(Error { variant: ParsingError { positives: [types],negatives: [] },location: Pos(20),line_col: Pos((1,21)),path: None,line: "MyTupleComponent str,str",continued_line: None })

有人知道为什么规则不正确匹配吗?

解决方法

你可以走两条路:

正如@ZachThompson 指出的那样,定义 WHITESPACE。如果这样做,请将 cname 设为原子,以防止它捕获字母数字和空格。

这个测试语法看起来不错:

WHITESPACE = _{ " " }
cname = @{ (ASCII_ALPHANUMERIC | "_")+ }

ints = { "i8" | "i16" | "i32" | "i64" | "i128" | "isize" }
uints = { "u8" | "u16" | "u32" | "u64" | "u128" | "usize" }
strings = { "str" | "String" }
types = { strings | ints | uints }

tuple_component = { cname ~ (types ~ ("," ~ types)?)+ }

file = { tuple_component ~ EOI }

否则,您可以手动计算空间。这种方法也可以,但不能随着语法的增长而扩展。

附言您是否打算解析 MyTupleComponent str,str str,str 之类的表达式,而不用逗号将第二个元组与第一个元组分开?它目前解析得很好。您可能希望将规则简化为

tuple_component = { cname ~ types ~ ("," ~ types)* }