Tải bản đầy đủ (.doc) (18 trang)

Đề tài Ngôn Ngữ Lập Trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (188.66 KB, 18 trang )

Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
Ý Kiến Của Giáo Viên






























1
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
MỤC LỤC
Trang
Lời mở đầu 3
Phân tích thiết kế hệ thống! 4
1.1 Phân tích hệ thống 4
1.2 Các cấu trúc được khai báo trong chương trình 6
1.3 Các hàm và chức năng của hàm 6
1.4 Thuật toán cơ bản 7
1.5 Các kiểu dữ liệu trong ngôn ngữ 16
1.6 Bảng phân công công việc 17
2
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
3
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
LỜI MỞ ĐẦU
Ngôn ngữ lập trình là một môn học nền tảng,cung cấp cho sinh viên những
kiến thức cơ bản của ngôn ngữ lập trình, qua đó sinh viên có thể hiểu rõ hơn về
các ngôn ngữ lập trình cụ thể (C/C++,Pascal, C#, Java…), sử dụng chúng một
cách tốt hơn và trên cơ sở kết hợp với lý thuyết chương trình dịch để tạo ra một
ngôn ngữ mới. Đồng thời, cung cấp các xu hướng lập trình để sinh viên có thể
tiếp cận nhanh với chúng và có được sự lựa chọn một ngôn ngữ lập trình phù
hợp khi cần giải quyết các đề án tin học trong thực tế.
Từ những điều trên, chúng em mong muốn viết ra một ngôn ngữ lập trình
mới,sử dụng tiếng Việt, gần gũi và dễ sử dụng dựa trên ngôn ngữ lập trình C++.
Tuy có thể còn một vài hạn chế, song ngôn ngữ mới xây dựng bộ biên dịch và
thông dịch, đảm bảo độ chính xác trong các tính tóan, dễ viết và dễ đọc
Chúng em xin chân thành cảm ơn!
4

Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
PHÂN TÍCH, THIẾT KẾ HỆ THỐNG
Mô tả chức năng chương trình :
Chương trình là một ngôn ngữ lập trình cho phép người dùng có thể viết các
thuật toán, các giải thuật… Ngoài ra, chương trình không phải là một trình biên dịch
mà nó còn cung cấp cho người dùng một giao diện đồ họa, dễ hiểu, ngắn ngọn, xúc
tích!
1.1. Phân tích hệ thống :
Ngôn ngữ lập trình có hỗ trợ cả giao diện gôm có các thành phần: Các kiểu
dữ liệu, xử lý dữ liệu, xử lý tô màu!
a) Các kiểu dữ liệu
 Kiểu số nguyên: dùng để lưu trữ các số nguyên, có thể âm!
 Kiểu số thực: dùng để lưu trữ các số thực trong đó có cả các số
nguyên!
5
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
 Kiểu ký tự: dùng để lưu các ký tự trong bảng mã ASCI, ngoài ra
nó còn có thể lưu trữ các ký tự kiểu UNICODE
 Kiểu chuỗi dùng để lưu một dãy ký tự liên tiếp nhau! Kiểu chuỗi
thực sự là một mảng các ký tự liên tiếp nhau!
 Kiểu logic: là kiểu dữ liệu dùng để lưu dạng đúng hoặc sai!
b) Xử lý tô màu
Dùng để tô màu các giá trị tr5ong
c) Phân tích dữ liệu
Đây là phần quan trọng nhất của bất cứ ngôn ngữ lập trình! Một ngôn
ngữ lập trình có tốt hay không điều do phần này quyết định!
6
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
Bao gồm các phần sau!
 Phân tích toàn bộ hệ thống: dùng để lưu trữ cấu trúc do người lập

trình tạo nên! Tại đây nó có thể kiểm tra lỗi của chương trình!
 Phân tích theo dòng dùng để phân tích cấu trúc của 1 dòng trong
chương trình! Phân tích theo dòng là con của phân tích toàn bộ hệ
thống!
 Biến lưu trữ: dùng để lưu danh sách biến!
1.2. Các cấu trúc được khai báo trong chương trình!
 TypeVar: dùng để định danh các kiểu dữ liệu là gì!
 TypeLetter: dùng để định danh các loại từ là gì!
o Ví dụ: Biến, Hàm, …
 clsStrucLetter: Dùng để lưu cấu trúc của một từ, bao gồm: từ và
TypeLetter
 clsLine: Dùng để lưu cấu trúc của một dòng, bao gồm: danh sách các
clsStrucLetter, số dòng, nội dung của dòng, nhãn của dòng (dùng trong
những câu lệnh goto)
 clsBuild: Tập hợp các clsLine lại với nhau
 clsAnalysis: dùng trong việc tô màu các từ khóa! Mỗi khi thay đổi một ký tự
trong editor thì việc tô màu sẽ bắt đầu nhiêm vụ của mình!
1.3. Các hàm và chức năng của hàm:
1.3.1. Các hàm tác động đến đối tượng:
7
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
 void _rct_KeyPress: dùng để cảm nhận sự thay đổi của Editor mà có những
biện pháp tô màu thật hiệu quả!
 Void to_mau: dùng đê tô màu toàn bô Editor
1.3.2. Hàm tạo xử lý
1.3.2.1. Public
 public void Build(): dùng để kiểm tra dòng dữ liệu mà người lập trình vô có
bị lỗi gì hay không!
 public void Run(): dùng để thực thi câu lệnh!
1.3.2.2. Private

 void Tinh() : Dùng để tính từng dòng dữ liệu
 int GetNextNgoacDong(): dùng để trả về dấu “{“ kế tiếp nằm ở dòng nào!
 void TinhDieuKien(): dùng để kiểm tra điều kiện if có đúng hay không!
 string TinhLogic(): dùng để tính hai giá trị logic với nhau!
 void TinhToan(): dùng để tính các giá trị của từng dòng!
 bool TinhNgoac(): dùng để tính giá trị trong ngoặc sau đó mới tính các giá
trị bình thường!
 void AnalysisLetter(): dùng để cắt các ký tự ra và phân tích những ký tự đó
thuộc loại nào!
1.4. Thuật tóan cơ bản :
Chương trình tiến hành cắt hết tất cả các từ!
Sau đó đi phân tích từ trên xuống với các cấu trúc từ mới vừa phân tích!
* Code mô phỏng cho ý tưởng trên
 Code tách các ký tự
void AnalysisLetter(string LineContent)
{
int cutSart = -1;
int cutLength = 0;
for (int i = LineContent.Length - 1; i > -1; i )
{
int c = LineContent[i];
if ((c > 96 && c < 123) || (c > 64 && c < 91) || (c > 47 && c < 58) ||
LineContent[i] == '.')
{
if (cutSart == -1)
cutSart = i;
cutLength++;
8
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
}

else
{
if (cutLength > 0)
{
string st = LineContent.Substring(cutSart - cutLength + 1, cutLength);
try
{
int a = Convert.ToInt32(st);
_tmp.Add(new clsStrucLetter(st, TypeLetter.So));
}
catch {
try
{
Decimal a = Convert.ToDecimal(st);
_tmp.Add(new clsStrucLetter(st, TypeLetter.SoThuc));
}
catch
{
_tmp.Add(new clsStrucLetter(st, TypeLetter.Unkhown));
}
}
}
switch (LineContent[i])
{
case '{':
_tmp.Add(new clsStrucLetter("{", TypeLetter.NgoacNhonMo));
break;
case '}':
_tmp.Add(new clsStrucLetter("}", TypeLetter.NgoacNhonDong));
break;

case '(':
_tmp.Add(new clsStrucLetter("(", TypeLetter.NgoacDonMo));
_sumNgoac++;
break;
case ')':
_tmp.Add(new clsStrucLetter(")", TypeLetter.NgoacDonDong));
_sumNgoac ;
break;
case '+':
_tmp.Add(new clsStrucLetter("+", TypeLetter.Cong));
break;
case '-':
_tmp.Add(new clsStrucLetter("-", TypeLetter.Tru));
break;
case '*':
_tmp.Add(new clsStrucLetter("*", TypeLetter.Nhan));
break;
9
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
case '/':
_tmp.Add(new clsStrucLetter("/", TypeLetter.Chia));
break;
case ',':
_tmp.Add(new clsStrucLetter(",", TypeLetter.Phay));
break;
case '=':
_tmp.Add(new clsStrucLetter("=", TypeLetter.Gan));
break;
case ';':
_tmp.Add(new clsStrucLetter(";", TypeLetter.ChamPhay));

break;
case '<':
_tmp.Add(new clsStrucLetter(">", TypeLetter.NhoHon));
break;
case '>':
_tmp.Add(new clsStrucLetter(">", TypeLetter.LonHon));
break;
}
cutSart = -1;
cutLength = 0;
}
}
if (cutLength > 0)
{
string st = LineContent.Substring(cutSart - cutLength + 1, cutLength);
_tmp.Add(new clsStrucLetter(st, TypeLetter.Unkhown));
}
UpdateType();
for(int i = _tmp.Count - 1; i> -1; i )
{
_letter.Add(_tmp[i]);
}
}
void UpdateType()
{
for (int i = _tmp.Count - 1; i > -1; i )
{
if (_tmp[i].TypeContent == TypeLetter.Unkhown)
{
if (i == _tmp.Count - 2 && _tmp[_tmp.Count - 1].TypeContent ==

TypeLetter.Ham)
_tmp[i].TypeContent = TypeLetter.TenHam;
else if (_tmp[i].Letter == "ham")
_tmp[i].TypeContent = TypeLetter.Ham;
else if (_tmp[i].Letter == "dieukien")
_tmp[i].TypeContent = TypeLetter.DieuKien;
else if (_tmp[i].Letter == "nguoclai")
_tmp[i].TypeContent = TypeLetter.NguocLai;
10
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
else if (_tmp[i].Letter == "lap")
_tmp[i].TypeContent = TypeLetter.Lap;
else if (_tmp[i].Letter == "dung")
_tmp[i].TypeContent = TypeLetter.Logic;
else if (_tmp[i].Letter == "sai")
_tmp[i].TypeContent = TypeLetter.Logic;
else if (_tmp[i].Letter == "va")
_tmp[i].TypeContent = TypeLetter.Va;
else if (_tmp[i].Letter == "hoac")
_tmp[i].TypeContent = TypeLetter.Hoac;
else if (_tmp[i].Letter == "nguoclaidieukien")
_tmp[i].TypeContent = TypeLetter.NguocLaiDieuKien;
else if (Program.KeyWord.IndexOf("|" + _tmp[i].Letter + "|") > -1)
_tmp[i].TypeContent = TypeLetter.KeyWord;
else
_tmp[i].TypeContent = TypeLetter.Bien;
}
}
}
 Code biên dịch

public void Build()
{
_rctResult.Clear();
_rctDetail.Clear();
lst = new List<clsLine>();
string[] arr = _rct.Text.Replace("\t", "").Split('\n');
for (int i = 0; i < arr.Length; i++)
{
if (arr[i].Trim() != "")
lst.Add(new clsLine(i + 1, arr[i]));
}
if (lst.Count > 2)
{
if (lst[1].LstLetter.Count != 1)
clsError.ErrorStruct(1);
}
else
{
clsError.ErrorStruct(0);
}
int n = GetNextNgoacDong(0);
try
{
11
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
if (lst[0].LstLetter[0].Letter != "ham" || lst[0].LstLetter[1].TypeContent !=
TypeLetter.TenHam || lst[0].LstLetter[2].TypeContent != TypeLetter.NgoacDonMo ||
lst[0].LstLetter[lst[0].LstLetter.Count - 1].TypeContent !=
TypeLetter.NgoacDonDong)
throw new Exception("");

}
catch
{
clsError.ErrorStruct(0);
}
}
void Tinh(clsLine line, ref int Index)
{
int i;
switch (line.LstLetter[0].TypeContent)
{
case TypeLetter.KeyWord:
switch (line.LstLetter[0].Letter)
{
case "so":
for (int j = 1; j < line.LstLetter.Count; j++)
{
if (line.LstLetter[j].TypeContent == TypeLetter.Bien)
{
ThemBien(line.LstLetter[j].Letter, TypeVar.So);
}
}
break;
case "sothuc":
try
{
for (int j = 1; j < line.LstLetter.Count; j++)
{
if (line.LstLetter[j].TypeContent == TypeLetter.Bien)
{

ThemBien(line.LstLetter[j].Letter, TypeVar.SoThuc);
}
}
}
catch (Exception ex)
{
Program.currLine = line.Line;
throw new Exception(ex.Message + "\nỞ dòng số '" + line.Line +
"'");
}
break;
}
break;
case TypeLetter.DieuKien:
12
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
case TypeLetter.NguocLaiDieuKien:
int en = line.LstLetter.Count - 1;
TinhToan(line, 1, ref en);
for (i = 1; i < line.LstLetter.Count; i++)
if (line.LstLetter[i].TypeContent == TypeLetter.Bien)
line.LstLetter[i].Letter = ReturnValuelstVar(line, i);
TinhDieuKien(line, ref Index);
break;
case TypeLetter.NguocLai:
if (_isBuild)
break;
if (_go.Count > 0 && _go[_go.Count - 1] == false)
Index = GetNextNgoacDong(Index);
break;

case TypeLetter.Lap:
break;
case TypeLetter.Bien:
try
{
string a = lstVar[line.LstLetter[0].Letter].Name;
}
catch
{
clsError.ErrorNotKhaoBao(line.Line, line.LstLetter[0].Letter);
}
i = GetIndexOfLineByChar(line, ";", 0);
if (i > -1 && i < line.LstLetter.Count - 1)
clsError.ErrorThieuDau(line.Line, ";");
i = GetIndexOfLineByChar(line, "=", 0);
if (i == -1)
clsError.ErrorThieuDau(line.Line, "=");
if (line.LstLetter[line.LstLetter.Count - 1].Letter != ";")
clsError.ErrorThieuDau(line.Line, ";");
TinhNgoac(line, i + 1);
int end = line.LstLetter.Count - 2;
TinhToan(line, i + 1, ref end);
if (end > i + 1)
clsError.ErrorStruct(line.Line);
if (lstVar[line.LstLetter[0].Letter].Type == TypeVar.So)
lstVar[line.LstLetter[0].Letter].Value =
Convert.ToDouble(ReturnValuelstVar(line, end)).ToString("0");
else
lstVar[line.LstLetter[0].Letter].Value = ReturnValuelstVar(line, end);
if (_isBuild == false)

_rctDetail.AppendText("Dòng số '" + line.Line + "', Biến '" +
line.LstLetter[0].Letter + "' = " + lstVar[line.LstLetter[0].Letter].Value + "\n");
break;
}
13
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
}
void TinhDieuKien(clsLine line, ref int Index)
{
_go.Add(false);
bool _Co = true;
do
{
int i = GetLastIndexOfLineByChar(line, "(", 1);
if (i == -1 && _Co)
clsError.ErrorStruct(line.Line);
else if (i == -1)
{
break;
}
_Co = false;
int j = GetIndexOfLineByChar(line, ")", i + 1);
if (j == -1)
{
Program.currLine = line.Line;
throw new Exception("Thiếu dấu ')' ở dòng số '" + line.Line + "'");
}
if (j - i < 4)
clsError.ErrorStruct(line.Line);
j ;

i++;
if (line.LstLetter[i].TypeContent == TypeLetter.Logic &&
line.LstLetter[j].TypeContent == TypeLetter.Logic)
break;
else if (line.LstLetter[i].TypeContent == TypeLetter.Logic ||
line.LstLetter[j].TypeContent == TypeLetter.Logic)
clsError.ErrorStruct(line.Line);
double n = Convert.ToDouble(line.LstLetter[i].Letter);
double m = Convert.ToDouble(line.LstLetter[j].Letter);
bool _flag = false;
string st = line.LstLetter[i + 1].Letter;
if (line.LstLetter[i + 2].TypeContent == TypeLetter.LonHon ||
line.LstLetter[i + 2].TypeContent == TypeLetter.NhoHon || line.LstLetter[i +
2].TypeContent == TypeLetter.Gan)
st += line.LstLetter[i + 2].Letter;
switch (st)
{
case "==":
_flag = (n == m);
break;
case "<":
_flag = (n < m);
14
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
break;
case ">":
_flag = (n > m);
break;
case "<=":
_flag = (n <= m);

break;
case ">=":
_flag = (n >= m);
break;
case "!=":
_flag = (n != m);
break;
default:
clsError.ErrorStruct(line.Line);
break;
}
line.LstLetter[i - 1].TypeContent = TypeLetter.Logic;
line.LstLetter[i - 1].Letter = _flag ? "dung" : "sai";
for (int k = j + 1; k >= i; k )
{
line.LstLetter.RemoveAt(k);
}
} while (true);
int a;
do
{
a = GetLastIndexOfLineByChar(line, "va", 1);
if (KiemTraBool(line, a))
{
line.LstLetter[a - 1].Letter = TinhLogic(line.LstLetter[a - 1].Letter,
line.LstLetter[a + 1].Letter, TypeLetter.Va);
line.LstLetter[a - 1].TypeContent = TypeLetter.Logic;
line.LstLetter.RemoveAt(a + 1);
line.LstLetter.RemoveAt(a);
}

else
break;
} while (true);
do
{
a = GetLastIndexOfLineByChar(line, "hoac", 1);
if (KiemTraBool(line, a))
{
line.LstLetter[a - 1].Letter = TinhLogic(line.LstLetter[a - 1].Letter,
line.LstLetter[a + 1].Letter, TypeLetter.Hoac);
line.LstLetter[a - 1].TypeContent = TypeLetter.Logic;
line.LstLetter.RemoveAt(a + 1);
15
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
line.LstLetter.RemoveAt(a);
}
else
break;
} while (true);
for (int i = line.LstLetter.Count - 1; i > -1; i )
if (line.LstLetter[i].TypeContent == TypeLetter.NgoacDonDong ||
line.LstLetter[i].TypeContent == TypeLetter.NgoacDonMo)
line.LstLetter.RemoveAt(i);
if (_isBuild)
return;
if (line.LstLetter[1].Letter == "sai")
{
a = GetNextNgoacDong(Index);
Index = a;
if (lst[Index + 1].LstLetter[0].Letter.IndexOf("nguoclai") > -1)

_go[_go.Count - 1] = true;
else
_go.RemoveAt(_go.Count - 1);
}
}
16
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
1.5. Các kiểu dữ liệu trong ngôn ngữ!
 Các kiểu dữ liệu thông dụng :
 -so (tương đương integer trong C#) : đây là kiểu rất thông dụng mà giá trị
của nó là tất cả các số nguyên nằm trong phạm vi của máy tính.
 -sothuc : giá trị của nó là tất cả các số thực nằm trong phạm vi của máy tính.
 -kitu (tương đương char trong C#) : giá trị của nó là các kí tự.
 -chuoi (tương đương string trong C#) : kiểu này dùng để chứa dãy các kí
tự, hay còn gọi là chuỗi, để tạo thành một câu hay một cụm từ.
 Từ khóa thông dụng :
 -ham (tương đương void trong C#)
 -dieukien (tương đương if trong c#)
 -nguoclai (tương đương else trong C#)
 -nguoclaidieukien ( tương đương elseif trong C#)
 -dung (tương đương true trong C#)
 -sai ( tương đương false trong C#)
 Các kí hiệu :
 -va ( tương đương && trong C#)
 -hoac ( tương đương || trong C#)
17
Đề tài: Ngôn Ngữ Lập Trình GVHD: Th.S Tôn Long Phước
Bảng phân công công việc
Tên thành viên Công việc
Trần Thị Hồng Thắm

Viết class dùng để bắt sự kiện xảy ra, tô màu các từ
khóa cho chương trình
Đinh Thị Bích Hằng Đảm nhận việc xử lý cho các Form
Nguyễn Minh Thành
Viết các class phân tích các từ và biên dịch chương
trình
18

×