我想要做的是,一个解释器接收纯LaTeX文件作为输入,并返回一个“英文”字符串。例如。
输入:
$$ sum _ {i} = 0} ^ 3 \ frac {i} {3} $$
输出:
从i等于0到3的总和,从“i”除以3。
输入:
$ e ^ {i \ pi} + 1 = 0 $
输出:e增加到i乘以pi的幂,再加上一等于零
我认为解决方案可能是FDA,但我意识到代码将是非常广泛和费力的。
有没有更好的技术或算法来做到这一点?谢谢。
P.D我不确定这是否是正确的问题,如果不是,请告诉我。
我不确定你的意思是什么(也许是确定性的有限自动机?)但无论如何,你可以通过为表达式编写无上下文语法,将其编译成解析器,运行输入来获取解析树,然后编写一个方法,对遍历解析树进行顺序遍历,并在整个过程中输出所有内容的英文版本。作为一个超级懒惰的例子:
<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
诀窍是让进入/退出的上下文正确。在我看来,你可以按摩你的语法,以便非终结符直接对应上下文,这将使它变得容易。