0

それでは、LaTeXParser を Java で作成する必要があります。以下のようなファイルを取り込んで、有効性とエラーを確認します。今、私は実際に助けやコードを探しているのではなく、概念的な理解、つまり問題に対処する方法を探しています。スタックを使用してブロックを保存し、すべてが適切にソートされるようにします。だからあなたへの私の質問は、それをどのように処理するのですか?

たとえば、最初にすべての「\begin{ _ }」を取得してスタックに入れ、対応する「\end{}」でポップする必要がありますか? 特定の文字列が見つかったときに、スタック上でその文字列に基づいて必要なアクションを実行する、文字列ベースのケース スイッチ システムを使用することを考えていました。

または、互いに打ち消し合う 2 つのスタック、すべての \begins と \ends が別のものにあり、それらの { _ _} が一致している場合、それらをポップアウトし始めます。

そうそう、この問題について私がどのように考えるべきか、またどのように対処すべきかについて、SOF の頭脳明晰な人々が何を言わなければならなかったのか、ただただ疑問に思っています。ご意見ありがとうございます。

\documentclass{article}
\usepackage{amsmath, amssymb, amsthm}
\begin{document}
    {\Large \begin{center} Homework Problems \end{center}}\begin{itemize}\item\end{itemize}
    \begin{enumerate}
            \item Prove: For all sets $A$ and $B$, $(A - B) \cup
                    (A \cap B) = A$.
                    \begin{proof}
                            \begin{align}
                                    & (A - B) \cup (A \cap B) && \\
                                    & = (A \cap B^c) \cup (A \cap B) && \text{by
                                    Alternate Definition of Set Difference} \\
                                    & = A \cap (B^c \cup B) && \text{by Distributive Law} \\
                                    & = A \cap (B \cup B^c) && \text{by Commutative Law} \\
                                    & = A \cap U && \text{by Union with the Complement Law} \\
                                    & = A && \text{by Intersection with $U$ Law}
                            \end{align}
                    \end{proof}
            \item If $n = 4k + 3$, does 8 divide $n^2 - 1$?
                    \begin{proof}
                            Let $n = 4k + 3$ for some integer $k$. Then
                            \begin{align}
                                    n^2 - 1 & = (4k + 3)^2 - 1 \\
                                    & = 16k^2 + 24k + 9 - 1 \\
                                    & = 16k^2 + 24k + 8 \\
                                    & = 8(2k^2 + 3k + 1) \text{,}
                            \end{align}
                            which is certainly divisible by 8.
                    \end{proof}
    \end{enumerate}
\end{document}

編集:笑誰もがこの方法を考えすぎていると思いますyyyyy、私はコードを認識してコンパイルしたり、このファイルを介して LATEX 言語のアクションを実際に実行したりするものを探していません。上記のようなテキスト ファイルを作成し、それをプログラムで開いて読み取らせ、「開始するすべてのブロックも終了するので、これでうまくいくだろう!」と言うことができるようにしたいだけです。または「10行目にエラーがあります!」それ以上でもそれ以下でもありません。スタックを使用してブロックを格納し、最後が見つかったときにブロックをポップする単純なバリデーター/エラー チェッカーです。繰り返しますが、私はコードや配布資料を探しているわけではありません! 私が望むのは、この問題に対処するための良いアイデアと方法、せいぜい疑似コードの構造化だけです!

たとえば...これをすべてメインの1つのクラスに含め、「 \begin{ _ }」のようにコード化されたファイル内のすべての文字列を保持するスタックを作成することを考えていました。対応する " \end{ } " を見つけて、それをポップアウトして、リストか何かからチェックアウトしました。ファイルの実行が終了するまでにすべての開始ブロックがポップされた場合、有効な .txt ファイルがあります。

4

1 に答える 1

2

独自のパーサーを作成しようとするのは大変な作業です。多忙な作業の一部をタスクから解放するパーサー ジェネレーターが多数あります。ANTLRは Java で人気のあるものです。

最初に行う必要があることの 1 つは、言語 latex がどのような種類のものかを調べることです。C++ のようなより複雑な言語は、上記のような通常の言語に使用できるのと同じ種類のパーサーでは解析できません。

次のJules Bean の投稿から、ラテックスはほとんどのプログラミング言語よりも解析が難しいと思われます。

LALR言語ではないことは確かです。コンテキストに依存し、独自の構文を変更できます。実際にマクロを実行せずに解析することは、おそらく技術的に不可能だと思います。つまり、完全に一般的に解析するには TeX ステート マシンが必要です。

ただし、「行儀の良い」LaTeXはおそらくLALRです。

于 2013-03-06T20:00:12.527 に答える