问题描述
我正在尝试解析这样的一行
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)* }