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

时间:2019-03-01 20:06:43

标签: latex interpreter automaton

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

输入:

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

输出:

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

输入:

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

输出: e提高到pi的i的幂,再加上一个等于零的值

我以为解决方案可能是FDA,但我意识到该法规确实非常繁琐。

是否有更好的技术或算法可以做到这一点?谢谢。

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

1 个答案:

答案 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

诀窍是正确进入/退出上下文。在我看来,您可以完善自己的语法,以便非终结符直接对应于上下文,这将使其变得简单。