这听起来像是一个很棒的个人项目。您将学到很多关于编译器的基本部分如何工作的知识。我会跳过尝试使用解析器生成器;如果这是为了你自己的启迪,你会从头开始学习更多。
这种系统的工作方式是我们如何理解自然语言的形式化。如果我给你一句话:“这只狗,Rover,吃了他的食物。”,你要做的第一件事就是把它分解成单词和标点符号。“The”、“SPACE”、“dog”、“COMMA”、“SPACE”、“Rover”……那是“tokenizing”或“lexing”。
接下来要做的是分析标记流以查看句子是否符合语法。英语的语法非常复杂,但这句话很简单。主语-同位语-动词-宾语。这就是“解析”。
一旦你知道这个句子是合乎语法的,你就可以分析这个句子以真正从中获得意义。例如,您可以看到这句话的三个部分——主语、同位语和宾语中的“他”——都指的是同一个实体,即狗。你可以弄清楚,狗是吃东西的东西,食物是被吃东西的东西。这是语义分析阶段。
然后编译器有一个人类没有的第四阶段,即他们生成代表语言中描述的动作的代码。
所以,做这一切。首先定义你的语言的标记是什么,为每个标记定义一个基类和一堆派生类。(IdentifierToken、OrToken、AndToken、ImpliesToken、RightParenToken...)。然后编写一个方法,该方法接受一个字符串并返回一个 IEnumerable'。那是你的词法分析器。
其次,弄清楚你的语言的语法是什么,并编写一个递归下降解析器,将 IEnumerable 分解成一个抽象语法树,代表你语言中的语法实体。
然后编写一个分析器,查看那棵树并计算出一些东西,比如“我有多少不同的自由变量?”
然后编写一个代码生成器,生成评估真值表所需的代码。吐IL似乎有点过头了,但如果你想成为真正的爱好者,你可以。让表达式树库为您做这件事可能更容易;您可以将解析树转换为表达式树,然后将表达式树转换为委托,并评估委托。
祝你好运!