Я не уверен, что вы подразумеваете под 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
Хитрость в том, чтобы правильно определить контексты входа / выхода.Мне кажется, что вы можете массировать свою грамматику так, чтобы нетерминалы соответствовали контекстам, и это облегчило бы ее.