ruby – 平衡圆括号的简单Ragel示例?
这是语法的起点:
%%{ machine xo; char = "x" | "o"; group = "(" char* ")"; main := group; }%% 例如,它处理(xxxx(oo)()xx).如何扩展它以允许嵌套组;例如(XXXX(O(X)O)()XX? 我知道递归通常不是由一台Ragel机器支持的.所以这不起作用: group = "(" ( char | group )* ")"; 从Ragel State Machine Compiler User Guide (PDF)开始:(为了强调而添加了粗体文字):
从a mailing list discussion on nested brackets开始,提到了相同的三种方法:
你能在Ruby中指出我的每个例子 – 最好是使用上面的例子吗?谢谢! 解决方法
使用fcall / fret的一般模式如下:
balanced = [^(){}[]] | '(' @{ fcall balancedTokensParen; } | '[' @{ fcall balancedTokensBracket; } | '{' @{ fcall balancedTokensBrace; }; balancedTokensParen := balanced* ')' @{ fret; }; balancedTokensBracket := balanced* ']' @{ fret; }; balancedTokensBrace := balanced* '}' @{ fret; }; 所以你的案子可以作为 char = [xo]; group = '(' @{ fcall group_rest; }; group_rest := (char|group)* ')' @{ fret; }; main := group; 词法分析器函数应该包含堆栈数组,你必须手动检查顶部以确保没有未闭合'(‘: stack = [] %% write init; %% write exec; if top > 0 cs = %%{ write error; }%% end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |