我想做的是一个解释器,该解释器接收纯的 LaTeX 文件作为输入,并返回一个“英语”字符串。 例如。
输入:
$$ sum _ {i} = 0} ^ 3 \ frac {i} {3} $$
输出:
i的总和等于0到3,由“ i”除以3。
输入:
$ e ^ {i \ pi} + 1 = 0 $
输出: e提高到pi的i的幂,再加上一个等于零的值
我以为解决方案可能是FDA,但我意识到该法规确实非常繁琐。
是否有更好的技术或算法可以做到这一点?谢谢。
P.D我不确定这是否是问这个问题的正确部分,如果不是,请告诉我。
答案 0 :(得分:0)
我不确定FDA是什么意思(也许是确定性有限自动机?),但无论如何,您可以通过为表达式编写无上下文语法,将其编译为解析器,通过来获取解析树,然后编写一个方法来对解析树进行有序遍历,并在此过程中输出所有内容的英语版本。作为一个超级懒惰的例子:
<line> := $$ <expr> $$
<expr> := sum _ {<token>} = <expr>} ^ <expr> \ <expr>
<expr> := frac {<expr>} {<expr>}
<expr> := <token>
<token> := i | 0 | 1 | 3
然后您的表达式将解析为
__________<line>__________
/ | \
$$ <expr> $$
_________|_________________________________________________
/ | | | | | | \
sum _ { <token> } = <expr> } ^ <expr> \ <expr>
/ / / |
i <token> <token> |
/ / |
0 3 |
_____________________________________________________________/
/ | | | |
frac { <expr> } { <expr> }
| |
<token> <token>
| |
i 3
处理此问题的方法将是为该语言定义语义,这几乎是从一种语言到另一种语言的映射。语义将根据我们进行的派生来跟踪树中的当前上下文,并使用它来确定翻译。所以:
<line>: setting line context
$$: has no meaning in line context
<expr>: setting expression context
sum _ {: emit "sum of" and enter sum context
<token>: enter token context
i: emit "i"
} =: emit "from"
<expr>: enter expression context
<token>: enter token context
0: emit "0"
} ^: emit "to"
<expr>: enter expression context
<token>: enter token context
3: emit "3"
\: emit "of" in sum context
<expr>: enter expression context
frac {: enter frac expr context
<expr>: enter expression context
<token>: enter token context
i: emit "i"
} {: emit "over"
<expr>: enter expression context
<token>: enter token context
3: emit "3"
}: has no meaning in frac expr context
诀窍是正确进入/退出上下文。在我看来,您可以完善自己的语法,以便非终结符直接对应于上下文,这将使其变得简单。