0

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

键1=值1;键2=“值2”;键3=值3

这是我的 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 ;

我遇到的问题是在最后一个键/值对之后我永远不会有分号,所以我希望它是可选的,但是当我这样做时,状态机会为该值找到几个补丁。是否有某种语法我可以说 pair 必须以 a 结尾(";" | *eof*)

我确实改变了,我的主线对此,但它似乎是一个黑客,并不能真正适用于我想用这个状态机做的其他一些事情。

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

1 回答 1

1

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

pair = ( name "=" (value | "\"" value "\"") ) ;
string  = pair ( "; " pair )* ;
于 2016-11-28T21:18:16.867 回答