0

好吧,所以我必须用 java 编写一个 LaTeXParser,我将接收一个类似于下面这个的文件并读取它的有效性和错误。现在我不是真的在寻找帮助或代码,而是更多的概念理解,如何解决问题。我将使用 Stacks 来存储块并确保所有内容都正确排序。所以我的问题是,如何处理它?

例如,我是否应该首先获取所有“\begin{ _ }”并将它们放入堆栈,然后将它们与相应的“\end{}”一起弹出?我想知道使用基于字符串的大小写切换系统,当找到特定字符串时,它会在我的堆栈上根据该字符串执行必要的操作。

或者可能是 2 个相互抵消的堆栈,所有的 \begins 在一个中,\end 在另一个中,并且它们的 { _ _} 匹配,我开始将它们弹出等等。

所以,是的,只是想知道 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}

编辑:大声笑我认为每个人都想太多了,我不是在寻找任何可以识别和编译代码的东西,或者实际上通过这个文件执行 LATEX 语言的操作。我只是希望能够编写一个文本文件,就像上面的那个,让我的程序打开它,阅读它,然后说“嘿!这会工作,因为每个开始的块也会结束!” 或者“嘿,第 10 行有错误!” 不多也不少。只是一个简单的验证器/错误检查器,它使用堆栈来包含块,然后在找到结束时弹出它们等等。同样,我不是在寻找代码或讲义!我想要的只是一些解决这个问题的好主意和方法,也许充其量是一些伪代码结构!

例如......我正在考虑将这一切都包含在我的主类中的 1 个类中,并制作一个堆栈来保存文件中的所有字符串,这些字符串被编码为这样的“\begin{ _ }”然后当我找到相应的“ \end{ } ”只是将其弹出并从列表或其他内容中检查它。如果在文件运行结束时弹出每个开始块,则我有一个有效的 .txt 文件。

4

1 回答 1

2

尝试推出自己的解析器是一项艰巨的任务。有许多解析器生成器可以将一些繁忙的工作从任务中解脱出来。ANTLR是一种流行的 Java 语言。

您需要做的第一件事就是找出乳胶是哪种语言?更复杂的语言(如 C++)无法使用相同类型的解析器进行解析,而您可以使用这些解析器来解析更常规的语言。

下面的Jules Bean 帖子让我认为 Latex 比大多数编程语言更难解析。

我很确定它不是 LALR 语言。它依赖于上下文并且能够修改它自己的语法。我认为在不实际执行宏的情况下解析可能在技术上是不可能的。即你需要一个 TeX 状态机来全面解析它。

不过,“表现良好”的 LaTeX 可能是 LALR。

于 2013-03-06T20:00:12.527 回答