如何开始用java或c#为学校项目创建一个小型编译器?

本文关键字:创建 一个 小型 编译器 项目 开始 何开始 java 为学校 | 更新日期: 2023-09-27 18:12:55

为了我的期末考试(大学毕业),我被要求创建一个小型编译器,有以下要求:

学生必须开发一个包含所有设计部分的基本编译器这符合它(词法分析,句法分析,解析等)。这个编译器将有一个界面,显示2个面板,一个图形表示(A)和代码表示(B)。用户将能够在面板(a)中绘制几何形状,程序将显示在面板B中,为该形状生成的代码,如果是用户在(B)中输入代码,它将显示(A)中的形状。

这个编译器必须处理至少7个原语(我猜这意味着)命令)。几何形状必须从基元中创建。学生必须包含一个原语来旋转形状。

所以问题是我们从来没有深入研究过编译器,只是非常基本的理论,我只有20天的时间来完成这个!!我很确定他们想让我不及格,因为我问教授什么是原始的,他说他不会回答这个问题,因为那是我想通过的课程词汇的一部分。

这里的问题是:

我该如何开始,如何在。net中创建这个东西或者如何创建一组很小的指令来创建几何形状?

是否有类似的要求,以它为例,修改它?

注:我是。net c#开发人员(技能不错)。我知道C和Java的基础知识。我正在阅读有关解析器生成器(ANTLR, lex &YACC, Ray),但是没有基本的教程,有很多新的术语,比如BNF语法(这是什么,一种语言,一个txt文件?)这是如此困难,因为没有简单的方法来开始,或c#的样本。我不想用C或c++来做这个项目因为它是使用图形的而且我的C知识很基础,我担心我做不到,我想用。net

如何开始用java或c#为学校项目创建一个小型编译器?

与其说这是一个编译器,不如说是一个解释器/设计器。但是我离题了。

基本上你被要求创建的是一个"绘图命令语言",以及一个可以解释该命令语言的程序。对于"绘图命令语言"通常期望做的一个例子,看一下LOGO。

你需要做的是定义一组简单的指令(原语),这些指令将在适当的组合下绘制形状。您还必须包含一个原语来旋转形状。以下是维基百科在适当上下文中对"原始"的定义。通过这样做,你正在创建一个"语言"和一个"运行时";理论上,您可以将命令保存在文件中,然后将它们重新加载到程序中并重新运行它们以生成相同的形状。

有三种主要的方法:

  • 定义基元来绘制不同类型的线(直线、曲线、实线、虚线等),并设置绘制下一条线的颜色。这可能会让你创建原语只是为了创建原语;你的主要原语将是"设置颜色"answers"绘制线条"。

  • 定义基元来绘制各种预定义的形状(直线、圆形、矩形、五边形、六边形等)。这可能是你的同学会做的,这既要花一段时间,又不是很实用。

  • 实现像LOGO一样的"乌龟绘图"。会有一个光标("海龟")以某种方式呈现在屏幕上,它的当前位置和去向是绘制线条的组成部分。

我个人喜欢最后一个想法;你需要原语来移动海龟,标记线条的开始和结束位置,设置颜色,旋转,清除等:

  • MVUP x -将海龟向上移动x像素
  • MVDN x -将海龟向下移动x像素
  • MVLT x -将海龟向左移动x像素
  • MVRT x -向右移动x像素
  • SETC r g b -设置线条颜色为RGB值
  • STLN -在海龟的位置标记一行的开始
  • ENDL -在海龟的位置标记一行的末尾;导致使用当前设置的颜色从头到尾绘制线条。
  • RTCL x -顺时针旋转画布x度(这需要一些矩阵数学,你会失去任何你画的东西,在旋转后落在画布外面)
  • RTCC x -逆时针旋转画布x度(同上)
  • CNTR -将海龟放置在画布的正中央。在定义开始的初始位置时非常有用,或者避免反转一些复杂的动作以回到中心并再次绘制。
  • CLRS -从垫上删除所有绘制的线。这和CNTR应该是"程序"中绘制任何特定形状的前两个命令,但是如果省略它们,程序可以通过在之前的输出上运行来迭代地构建自己,以创建分形图案。

我只给了你11个基本的命令,可以用来在画布上移动光标,随意画线,可以画出用户想要的任何2D形状。你也可以使用一个前-后-转-左-右的模型,就像乌龟是一个机器人一样,但这可能会使它变得更加复杂(还记得YAGNI吗?它将对你的事业大有帮助。

一旦你掌握了一门语言,你必须让它以两种方式工作;首先,程序必须知道如何解释输入到文本框中的指令,以便在绘图板上绘制/重绘制形状,其次,程序必须接受绘图板上的鼠标输入,将这些命令解释为移动海龟/标记开始或结束/设置颜色,并将这些命令输入到文本框中。这是你的项目,我把它的实现留给你。

我建议你实现Context-Free Art。

将绘图转换为代码会比较难看——你将不可避免地在固定位置描述一组固定的形状。你所有的同学都会这样做。

但是通过实现上下文无关的语法,您将能够从代码生成绝对令人惊叹的图片。这会让你非常满意,并激励你去完善和通过,然后你就会留下一些可以炫耀的东西。

听起来这个练习是关于生成和解析SVG之类的东西。听起来教授也不完全清楚编译器是什么。从文本到图形的翻译可能是编译器的一些学术定义,但它肯定没有反映任何现实世界的意义(尽管在图形编程语言方面做了很多工作)。

可能是为了满足"compiler"您可以将SVG的一个子集(它是文本的)转换为生成图形的JavaScript命令。对于"原始的"的含义你可以谷歌一下。算是吧,表现出一些主动性。

然后你可以用HTML做你的用户界面,这比我能想到的任何东西都更符合时间框架。从本质上讲,这将类似于Google Documents Draw,除了将绘图表示为SVG。

相关文章: