Compiler construction 编写编译器

Compiler construction 编写编译器,compiler-construction,bison,yacc,flex-lexer,bibtex,Compiler Construction,Bison,Yacc,Flex Lexer,Bibtex,我基本上需要为bibtex文件制作一个编译器,这样就可以查询给定的bibtex数据库。现在我熟悉了理论的某些方面,比如自动机、语法、SLR、LR(1)和LALR解析。然而,我仍然觉得所有这些都是理论和抽象的,因为我从未应用过。 如果有人能概括出构建编译器所需的坚实步骤,那将大有裨益。我可能会使用flex和bison/yacc,所以如果你能让我知道设计过程是如何进行的,在哪个阶段生成什么文件,每个阶段的输出是什么,以及总体上事情是如何联系在一起的,我可能会对事情是如何完成的有一个更实际的看法 谢谢

我基本上需要为bibtex文件制作一个编译器,这样就可以查询给定的bibtex数据库。现在我熟悉了理论的某些方面,比如自动机、语法、SLR、LR(1)和LALR解析。然而,我仍然觉得所有这些都是理论和抽象的,因为我从未应用过。 如果有人能概括出构建编译器所需的坚实步骤,那将大有裨益。我可能会使用flex和bison/yacc,所以如果你能让我知道设计过程是如何进行的,在哪个阶段生成什么文件,每个阶段的输出是什么,以及总体上事情是如何联系在一起的,我可能会对事情是如何完成的有一个更实际的看法


谢谢

我不是编译器专家,但我知道这本书实际上被认为是任何想编写编译器的人的必读之书。是的,封面已经过时了,但据我所知,它仍然有许多与代码编译相关的好模式:

您确定要将bibtex数据库编译成可执行文件吗?如果查询是您唯一想要的,那么将bibtex数据库转换为关系数据库并使用SQL进行查询将更有意义。当然,您仍然需要首先解析bibtex,并从中生成SQL代码,有些人会称之为“编译”,但它远没有前面提到的龙之书中的内容复杂

Bibtex语法非常简单,因此您可以选择任何解析方法。对于这样一个简单的语法,我甚至不会费心使用解析器生成器,而是会编写一个递归下降解析器。根据您选择的语言,这可能非常简单(例如,如果您将Haskell与Parsec结合使用,甚至是C#)

如果你的另一个目标是学习像bison和flex这样过时的工具,那么,当然,他们也会做这项工作,但这是一种过分的手段


编辑:关于经典的lex/yacc方法的最佳实用阅读是

是的,我指的是那本书,但再一次,整个概念对我来说是抽象的,可能是因为我没有看到任何步骤的输出。这是一个学习任务,所以我必须遵循给定的规范。另外,我可能会使用C语言。@Achint,这是否意味着您也必须实现一种查询语言?我将编辑我的答案。规范是这样的:我必须开发一个编译器,将任何BIBTEX数据库文件编译成C/C++/Java/Python/Lisp程序,该程序随后可以编译成可执行文件,然后运行,以回答任何关于BIBTEX数据库文件中条目的查询。此外,必须使用flex和bison。我可以将数据库编译成另一种形式的数据库,并使用一些通用的C/C++/Java/Python/Lisp来查询它,但我不能使用代码查询原始的Bibtex数据库。我必须提交一个.l和.y文件,并将它们作为我的输出运行。@achit,然后您显然还必须设计和实现某种查询语言,将其嵌入到编译的代码中。遗憾的是,在可能的目标列表中没有C#,否则就可以使用它自己的LINQ。但您可以使用Lisp模拟相同的行为。如果您的规范没有强制您使用C和bison,那么您最好使用Lisp,比如说,规范不强制使用C,但我认为bison是必须的:(或者可能是yacc,但我肯定其中之一。我不清楚具体的阶段是如何进行的。我必须在哪里嵌入查询语言的代码?根据我现在的理解,我需要使用flex/lex编写一个词法分析器,它将给出标记的输出,并且我需要根据BIBTEX生成一个正确的语法语法,并使用yacc/bison编写一个解析器,该解析器将接收令牌输入,并告诉我字符串是否被接受,并输出一个语法树?可能是