
附件:
您所在的用户组无法下载或查看附件最近,编译原理老师留了第一个实验---让做一个简单的编辑器(估计以后都会在这个基础上进行扩展)
大概的要求是这样的:
实验一 源程序的输入和预处理
一、实验目的掌握字符处理的方法,理解设计为独立子程序的好处,为词法分析做好准备。
二、实验内容首先编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);然后编制一个预处理子程序,去掉输入串中的回车符、换行符和跳格符等编辑性文字;把多个空白符合并为一个;去掉注释;并记录行号。假定 SAMPLE 语言采用自由格式书写,空白符作为分隔符,可以使用注解,用/*……*/或者{……}标识,但注解不能插在单词内部,注解要在一行内结束,若一行结束,没有遇到注释后面的结束标记,自动认为注释也结束。
三、实验报告要求1、写出编程思路、源代码;2、写出上机调试时发现的问题,以及解决的过程;3、写出所使用的测试数据;4、谈谈体会。//-------------------这个实验不具备什么太难之处,粗略分析主要是读文件,截串,替换字符,合并空格.我用c#写了几个版本(只是在功能上有些区别),以下是版本1.共享给大家看看,顺道指点一下.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;
namespace bianam
{
///
/// 作者:cyj
/// 时间:2007-09-16
///
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
}
///
/// 编译按钮事件
///
//////private void dbug_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
bianyi.Text = "";
string str = yuanchengxu.Text.ToString();
string[] ss = str.Split(new string[] { "\r\n" }, StringSplitOptions.None);
string yuanma, conec = "";
for (int i = 0; i < ss.Length; i++)
{
string hao = Regex.Replace(ss[i].ToString().Trim(), " +", " ");
int n = hao.IndexOf("//");
if (n >= 0)
{
if (hao.StartsWith("//"))
{
hao = "注释";
}
else
{
//int n = hao.IndexOf("//");
int m = hao.Length - n;
hao = hao.Substring(0, n) + "注释";
}
}
int h = hao.IndexOf("/*");
if (h >= 0)
{
if (hao.StartsWith("/*"))
{
hao = "注解";
}
else
{
//int n = hao.IndexOf("//");
hao = "注解";
}
}
bianyi.Text = hao;
// bianyi.Text = Regex.Replace(hao, @"( )\1+", "$1", RegexOptions.None);
int j = i + 1;
yuanma = "第" + j.ToString() + "行" + ":" + hao + "\r\n";
listBox1.Items.Add(yuanma);
listBox1.SelectedIndex = i;
Thread.Sleep(300);
conec += yuanma;
}
bianyi.Text = conec;
}
///
/// open按钮事件
///
//////private void btnopen_Click(object sender, EventArgs e)
{
try
{
string filenames;
openFileDialog1.ShowDialog();
filenames = openFileDialog1.FileName;
StreamReader sr = new StreamReader(filenames, System.Text.Encoding.GetEncoding(936));
yuanchengxu.Text = sr.ReadToEnd().ToString();
sr.Close();
}
catch (Exception ee)
{
}
// openFileDialog1.OpenFile
}
}
}
代码里还有一个问题我没有解决---由于使用了线程控制listbox输出,所以,在编译时窗体不能接受任何事件,否则就没有响应了,希望高手能指点一下.