0

我正在寻找有关包含多级大括号的文本的帮助

例如这个文本:

{{abc|{cde|fgh}} bb|cc}

我想获得

{abc bb|cde bb|fgh bb|cc}

有了这个

pp {vv {ff|ii|nn|aa} | {ee|hh|rr} } xx {{abc|{cde|fgh} bb|cc}

结果是

pp {vv ff|vv ii|vv nn|vv aa | ee|hh|rr} xx {abc bb|cde bb|fgh bb|cc}

这个想法是把带有几级大括号的文本只放一层大括号。

我怎样才能做到这一点?我想在 C# 中执行此操作。

4

4 回答 4

1

我只会给你基本的想法,而不是为你编写代码。

在最外面的{}'s 内为字符串的每个部分构建一棵树(嗯,有点像一棵树)(a {b} c {d}将有 2 棵树 - 一棵 for{b}和一棵 for {d})。紧随其后的每个元素都必须是该元素的子元素。每当有多个选项时,它们中的每一个都必须是前一个节点的子节点,并且它们中的每一个都必须有下一个节点作为子节点。

因此,例如,{a {b|c} d e | f}您将拥有:

         -> b -
        /      \
  -> a -        -> d -> e
 /      \      /
/        -> c -
\
 \
  -> f

然后从根生成所有路径,例如使用深度优先搜索

路径是-> a -> b -> d -> e-> a -> c -> d -> e-> f所以
我们有{a b d e | a c d e | f}

实施提示:

堆栈可能是跟踪节点的好主意。

在 's之前和之后有空白的中间节点可能是明智{}的(相信我,这将使它更容易实现)。

所以{{a|b} {c|d}}看起来像:

       -> a -        -> c -
      /      \      /      \
-> . -        -> . -        -> .
      \      /      \      /
       -> b -        -> d -
于 2013-11-06T14:17:34.150 回答
1

词法分析器规则(我使用NLT格式):

"|" -> PIPE;
/[a-z]+/ -> ID;
/[ ]+/ -> WS;
"{" -> LBRACE;
"}" -> RBRACE;
%EOF -> EOF;

和解析器:

s -> n:node { n };
node -> (PIPE- n:node)+ { new SeqNode("|",n) }
      | (WS- n:node)+ { new SeqNode(" ",a) }
      | LBRACE n:node RBRACE { new BracesNode(seq) }
      | id:ID { new SeqNode("",new string[]{id}) }
      ;  

我正在脑海中写下这个;-)。

定义SeqNodeBracesNode得到一棵树。接下来遍历它,并计算您点击 BracesNode 的次数——当计数器显示“第一次”时,如果更多,则重新创建大括号——忽略它们。

于 2013-11-07T07:22:18.727 回答
0

您需要一个非正则表达式语法解析器才能将文本解析为一系列标记。请参阅如何在 C# 中编写解析器?有关编写此类解析器的建议。

与此相比,重新格式化标记(可能通过二叉表达式树)应该相当简单。

于 2013-11-06T12:57:46.507 回答
0

如果大括号外面有操作符,其优先级高于内部操作符的最低优先级,则保留大括号,否则丢弃它们

于 2013-11-06T19:02:58.393 回答