我可以使用什么结构或机制来生成LaTeX解释器?

问题描述 投票:1回答:1

我想要做的是,一个解释器接收纯LaTeX文件作为输入,并返回一个“英文”字符串。例如。

输入:

$$ sum _ {i} = 0} ^ 3 \ frac {i} {3} $$

输出:

从i等于0到3的总和,从“i”除以3。

输入:

$ e ^ {i \ pi} + 1 = 0 $

输出:e增加到i乘以pi的幂,再加上一等于零

我认为解决方案可能是FDA,但我意识到代码将是非常广泛和费力的。

有没有更好的技术或算法来做到这一点?谢谢。

P.D我不确定这是否是正确的问题,如果不是,请告诉我。

latex interpreter automaton
1个回答
0
投票

我不确定你的意思是什么(也许是确定性的有限自动机?)但无论如何,你可以通过为表达式编写无上下文语法,将其编译成解析器,运行输入来获取解析树,然后编写一个方法,对遍历解析树进行顺序遍历,并在整个过程中输出所有内容的英文版本。作为一个超级懒惰的例子:

<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

诀窍是让进入/退出的上下文正确。在我看来,你可以按摩你的语法,以便非终结符直接对应上下文,这将使它变得容易。

© www.soinside.com 2019 - 2024. All rights reserved.