使用森林复制解析树中的非 epsilon 终端节点

使用森林复制解析树中的非 epsilon 终端节点

我正在使用该forest包绘制形式语法的解析树,并希望将所有非 Epsilon 的终端复制到底部并用虚线连接到原始节点。通过阅读森林文档,我得到了一个有点实用的最小示例,但缺少两个基本的东西:首先,它不复制原始节点的内容并使用“x”作为占位符,并且它目前无法检测 Epsilon 节点并省略对这些节点的复制。

MWE.tex:

\documentclass[paper=a4, fontsize=11pt]{scrartcl}
\usepackage{forest}

\begin{document}
\begin{forest}
    before typesetting nodes={
        where n children=0{
            append={
                [x,tier=terminal,edge=dotted]
            }
        }{}
    }
    [\(S\)
        [\(S_0\)
            [\(0\)]
            [\(S_0\)
                [\(0\)]
                [\(S_0\)
                    [\(0\)]
                    [\(S_0\)
                        [\(0\)]
                        [\(S_0\)
                            [\(0\)]
                        ]
                    [\(1\)]
                    ]
                [\(1\)]
                ]
            [\(1\)]
            ]
            [\(1\)]
        ]
        [\(S_1\)
            [\(2\)]
            [\(S_1\)
                [\(\epsilon\)]
            ]
        ]
    ]
\end{forest}
\end{document}

MWE.tex 生产:

MWE.tex 生成的解析树

期望结果:

所需的解析树

答案1

以下序言可以达到这一目的:

before typesetting nodes={
  where n children=0{
    if content={\(\epsilon\)}{}{
      append={
        [x,tier=terminal,edge=dotted,content/.pgfmath=content("!u")]
      }
    }
  }{}
}

答案2

最初为版本 1 编写的代码森林但使用版本 2 可以编译成功。


作为补充Sašo Živanović 的回答,请注意,如果使用math content,则不需要在树的每个节点内指定数学模式:

\documentclass[tikz,border=10pt]{standalone}

\usepackage{forest}

\begin{document}
\begin{forest}
  before typesetting nodes={
    where n children=0{
      if content={\epsilon}{}{
        append={
          [,math content, tier=terminal, edge=dotted, content/.pgfmath=content("!u")]
        }
      }
    }{}
  },
  for tree={
    math content
  }
  [S
        [S_0
            [0]
            [S_0
                [0]
                [S_0
                    [0]
                    [S_0
                        [0]
                        [S_0
                            [0]
                        ]
                    [1]
                    ]
                [1]
                ]
            [1]
            ]
            [1]
        ]
        [S_1
            [2]
            [S_1
                [\epsilon]
            ]
        ]
    ]
\end{forest}
\end{document}

只需更少的输入就能获得相同的结果

相关内容