2010-06-23 125 views
0

我目前正在学习编译器设计中的词法分析。为了学习一个词法分析器的工作原理,我试图自己创建一个。我打算用Java构建它。在Java中构建词法分析器

词法分析器的输入是一个.tex文件,其格式如下。

\begin{document} 

    \chapter{Introduction} 

    \section{Scope} 

    Arbitrary text. 

    \section{Relevance} 

    Arbitrary text. 

    \subsection{Advantages} 

    Arbitrary text. 

    \subsubsection{In Real life} 

    \subsection{Disadvantages} 

    \end{document} 

词法分析器的输出应该是表的内容可能与在另一个文件中的页码。

1. Introduction 1 
    1.1 Scope   1 
    1.2 Relevance  2 
    1.2.1 Advantages 2 
     1.2.1.1 In Real Life 2 
    1.2.2 Disadvantages 3 

我希望这个问题是词法分析的范围之内。

我的词法分析器会读取.tex文件并检查'\',然后查找是否继续读取以检查它是否确实是切分命令之一。标志变量被设置为指示切片的类型。根据类型和深度,在切分命令之后的花括号中的单词是按照前缀以数字(如1.2.1)作为前缀进行读取和写入的。

我希望上述方法可以用于构建词法分析器。如果可以在词法分析器的范围内添加页码,我该怎么办?

+0

不是'1.2.1.1在真实生活中'而不是'1.2.1在真实生活中'? – 2010-06-23 14:53:57

+0

谢谢。我做了更正。 – primpap 2010-06-23 15:04:37

回答

2

你真的可以添加任何你想要的方式。我建议将.tex文件的内容存储在您自己的树形或类似地图的结构中,然后读入您的页码文件并适当地应用它们。

一个更古老的选择是编写第二个解析器,它解析第一个解析器和行号文件的输出并将它们正确地附加到它们上面。

这真的取决于你。由于这是一个学习练习,因此要尽量像其他人一样使用它。它是如何用户友好的?只有你可以使用的东西仍然适用于概念学习,但如果你曾经在现实世界中使用它,可能会导致混乱的做法!

+0

我并没有完全明白将内容存储为树状结构的第一点。你介意对此进行阐述吗?我希望在词法分析的范围内完成构建目录的整个过程,而不是使用解析器。 我正在考虑实施一种用户不太友好的方法,用户必须在每个页面的末尾插入'\ pagebreak'。 – primpap 2010-06-23 15:10:24

+1

'\ pagebreak'的语法根本不友好 - 对我来说这似乎相当合理。此外,在这种情况下,词法分析器和解析器之间几乎没有区别。你的词法分析器只是产生一个令牌 - 为了用这些令牌做一些你需要的分析器。如果你将它们组合成一个单一的实体,这很好,但它可能会限制你的道路。至于存储,考虑一个带有''loc'的TOCEntry对象的场景;字符串desc; int pagenum;'你创建一个树或TOCEntry的地图,例如'entries.add(新的TOCEntry(“1.2”,“Relavence”));'((接下来的评论继续) – corsiKa 2010-06-23 15:47:03

+0

其中显然是“1.2”和“relavence “是从你的输入生成的,而不是硬编码的......然后,一旦你阅读了你的页码文件,如果你有第2页的”1.2“,那么你可以(如果你使用带有loc的键的Map,去'entries.get ( “1.2”)。setPageNum(2);'显然这些是人为的,硬编码的例子,其输入将通过读入文件来动态变化。 – corsiKa 2010-06-23 15:48:43

0

你描述的实际上是一个词法分析器和解析器。这里的词法分析器的工作是返回标记并忽略空白。这里的标记是由'\'引入的各种关键字,'{','}'内的字符串和其他地方的任意文本。你订阅的其他东西都是解析和建树。