我的意思是标题中的???
因为我不完全确定。让我解释一下情况。
我不是计算机科学专业的学生。我从来没有做任何编译器课程。到目前为止,我曾经认为编译器编写者或编写编程器的学生非常出色,因为他们必须用编写编译器的任何语言编写编译器的Parser组件。这不是一件容易的事吗?
我正在处理信息检索问题。我想要的编程语言是Python。
Parser Nature:
http://ir.iit.edu/~dagr/frDocs/fr940104.0.txt是示例语料库。该文件包含大约50个带有XML样式标记的文档。 (你可以在上面的链接中看到它)。我需要记下其他一些其他值,例如<DOCNO> FR940104-2-00001 </DOCNO>
&amp; <PARENT> FR940104-2-00001 </PARENT>
我只需要索引文档的<TEXT> </TEXT>
部分,其中包含我需要删除的一些不同的标记以及许多要忽略的<!-- -->
条评论和一些{{} 1}}字符实体。我不知道为什么语料库知道它既不是由浏览器呈现也不是由适当的XML文档呈现的。
我想过使用任何Python XML解析器并提取所需的文本。但经过一番搜索后,我发现JavaCC parser source code (Parser.jj)找到了同一个语料库here。快速查看JavaCC后跟Compiler-compiler,发现所有编译器编写器都没有我想象的那么好。他们使用Compiler-compiler以所需语言生成解析器代码。 Wiki说输入到编译器 - 编译器的输入是一种语法(通常在BNF中)。这就是我失去的地方。
&hyph; &space; &
答案 0 :(得分:2)
为什么称之为“XML风格”标记? - 对我来说,这看起来非常标准/基本的XML。 尝试elementTree或lxml。而不是编写解析器,而是使用已经存在的稳定且经过良好强化的库。
答案 1 :(得分:1)
你不能从(n E)BNF语法构建解析器 - 更不用说整个编译器 - 它只是语法,即语法(和一些语法,如Python的基于缩进的块规则,不能完全模仿它,而不是语义。您可以使用单独的工具来实现这些方面,也可以使用更高级的框架(如C ++中的Boost :: Spirit或Haskell中的Parsec)来统一两者。
JavaCC(与yacc一样)负责生成解析器,即从源代码中读取令牌的子程序。为此,他们将(E)类似BNF的符号与用所得语法编写的代码混合(例如构建一个解析树) - 在本例中为Java。当然可以组成另一种语言 - 但由于现有语言可以相对较好地处理这些任务,因此它将毫无意义。并且由于编译器的其他部分可能是用同一种语言手工编写的,因此留下“我得到了令牌,我该怎么做才能解决它们”是有意义的。部分给写下这些其他部分的人;)
我从来没有听说过“PythonCC”,谷歌也没有听到(好吧,这是谷歌代码上的“pythoncc”项目,但它的描述只是说“pythoncc是一个试图为Python脚本生成优化机器代码的程序“自从三月以来没有任何承诺。”你的意思是any of these python parsing libraries/tools?但我不认为有一种方法可以自动将javaCC代码转换为Python等价物 - 但整个过程看起来很简单,所以如果你深入了解并通过javaCC解析一下[你选择的python库/工具],你或许可以翻译它......