Ragel 解析没有 EOF 分隔符的键值对

Ragel Parse Key Value Pairs Without delimiter for EOF

所以我有一个简单的字符串,我希望通过 ragel 状态机 运行。

key1=value1; key2="value2"; key3=value3

这是我的 ragel 的简化版本

# Key Value Parts
name = ( token+ )  %on_name ;
value = ( ascii+ -- (" " | ";" | "," | "\r" | "\n" | "\" | "\"" ) )  %on_value ;
pair = ( name "=" (value | "\"" value "\"") "; " ) ; ## ISSUE WITH FORCING ;
string  = ( pair )+ ;

# MACHINE
main := string >begin_parser @end_parser ;

我遇到的问题是在最后一个 key/value 对之后我永远不会有分号,所以我希望它是可选的,但是当我这样做时状态机发现了几个补丁的价值。有没有某种语法我可以说 pair 必须以 (";" | *eof*)?

结尾

我确实改变了,我的主线是这个,但这似乎是一个 hack,并不能真正与我想用这个状态机做的其他一些事情一起工作。

main := string >begin_parser @end_parser $/on_value;

我太专注于 Ragel 语法而没有考虑我是如何处理的。与其尝试在末尾添加一个可选的分号,不如在它已经处理了一个键值对之后在前面强制添加一个分号。

pair = ( name "=" (value | "\"" value "\"") ) ;
string  = pair ( "; " pair )* ;