Какую структуру или механизм я могу использовать для генерации интерпретатора LaTeX? - PullRequest
0 голосов
/ 01 марта 2019

То, что я пытаюсь сделать, это интерпретатор, который получает на вход чистый LaTeX файл и возвращает строку «на английском».Например.

Ввод:

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

Ввод:

Сумма от i, равного нулю до трех, от "i", деленного на три.

Входные данные:

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

Выходные данные: e повышается до степени i, умноженной на pi, плюс один равен нулю

Я думал, что решением может быть FDA, но я понял, что кодбыло бы действительно обширным и трудоемким.

Есть ли лучший метод или алгоритм для этого?Спасибо.

PD Я не уверен, что это правильный раздел, чтобы спросить об этом, если нет, пожалуйста, скажите мне.

1 Ответ

0 голосов
/ 05 апреля 2019

Я не уверен, что вы подразумеваете под 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

Хитрость в том, чтобы правильно определить контексты входа / выхода.Мне кажется, что вы можете массировать свою грамматику так, чтобы нетерминалы соответствовали контекстам, и это облегчило бы ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...