1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

18 574 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 117 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

Ý Kiến Của Giáo Viên

Trang 2

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

Trang 4

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!

Trang 5

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!

Trang 6

 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!

Trang 7

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:

Trang 8

 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++;

Trang 9

}

else

{

if (cutLength > 0)

{

string st = LineContent.Substring(cutSart - cutLength + 1, cutLength); try

{

int a = Convert.ToInt32(st);

_tmp.Add(newclsStrucLetter(st, TypeLetter.So));

}

catch {

try

{

Decimal a = Convert.ToDecimal(st);

_tmp.Add(newclsStrucLetter(st, TypeLetter.SoThuc));

}

catch

{

_tmp.Add(newclsStrucLetter(st, TypeLetter.Unkhown));

}

}

}

switch (LineContent[i])

{

case '{':

_tmp.Add(newclsStrucLetter("{", TypeLetter.NgoacNhonMo)); break;

case '}':

_tmp.Add(newclsStrucLetter("}", TypeLetter.NgoacNhonDong)); break;

case '(':

_tmp.Add(newclsStrucLetter("(", TypeLetter.NgoacDonMo));

_sumNgoac++;

break;

case ')':

_tmp.Add(newclsStrucLetter(")", TypeLetter.NgoacDonDong)); _sumNgoac ;

break;

case '+':

_tmp.Add(newclsStrucLetter("+", TypeLetter.Cong));

break;

case '-':

_tmp.Add(newclsStrucLetter("-", TypeLetter.Tru));

break;

case '*':

_tmp.Add(newclsStrucLetter("*", TypeLetter.Nhan));

break;

Trang 10

case '/':

_tmp.Add(newclsStrucLetter("/", TypeLetter.Chia));

break;

case ',':

_tmp.Add(newclsStrucLetter(",", TypeLetter.Phay));

break;

case '=':

_tmp.Add(newclsStrucLetter("=", TypeLetter.Gan));

break;

case ';':

_tmp.Add(newclsStrucLetter(";", TypeLetter.ChamPhay));

break;

case '<':

_tmp.Add(newclsStrucLetter(">", TypeLetter.NhoHon));

break;

case '>':

_tmp.Add(newclsStrucLetter(">", TypeLetter.LonHon));

break;

}

cutSart = -1;

cutLength = 0;

}

}

if (cutLength > 0)

{

string st = LineContent.Substring(cutSart - cutLength + 1, cutLength);

_tmp.Add(newclsStrucLetter(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 ==

_tmp[i].TypeContent = TypeLetter.TenHam;

elseif (_tmp[i].Letter == "ham")

_tmp[i].TypeContent = TypeLetter.Ham;

elseif (_tmp[i].Letter == "dieukien")

_tmp[i].TypeContent = TypeLetter.DieuKien;

elseif (_tmp[i].Letter == "nguoclai")

_tmp[i].TypeContent = TypeLetter.NguocLai;

Trang 11

elseif (_tmp[i].Letter == "lap")

_tmp[i].TypeContent = TypeLetter.Lap;

elseif (_tmp[i].Letter == "dung")

_tmp[i].TypeContent = TypeLetter.Logic;

elseif (_tmp[i].Letter == "sai")

_tmp[i].TypeContent = TypeLetter.Logic;

elseif (_tmp[i].Letter == "va")

_tmp[i].TypeContent = TypeLetter.Va;

elseif (_tmp[i].Letter == "hoac")

_tmp[i].TypeContent = TypeLetter.Hoac;

elseif (_tmp[i].Letter == "nguoclaidieukien")

_tmp[i].TypeContent = TypeLetter.NguocLaiDieuKien;

elseif (Program.KeyWord.IndexOf("|" + _tmp[i].Letter + "|") > -1)

_tmp[i].TypeContent = TypeLetter.KeyWord;

else

_tmp[i].TypeContent = TypeLetter.Bien;

}

}

}

 Code biên dịch

publicvoid Build()

{

_rctResult.Clear();

_rctDetail.Clear();

lst = newList<clsLine>();

string[] arr = _rct.Text.Replace("\t", "").Split('\n');

for (int i = 0; i < arr.Length; i++)

{

if (arr[i].Trim() != "")

lst.Add(newclsLine(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

{

Trang 12

if (lst[0].LstLetter[0].Letter != "ham" || lst[0].LstLetter[1].TypeContent !=

lst[0].LstLetter[lst[0].LstLetter.Count - 1].TypeContent !=

thrownewException("");

}

catch

{

clsError.ErrorStruct(0);

}

}

void Tinh(clsLine line, refint Index)

{

int i;

switch (line.LstLetter[0].TypeContent)

{

caseTypeLetter.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;

thrownewException(ex.Message + "\nỞ dòng số '" + line.Line +

"'");

}

break;

}

break;

caseTypeLetter.DieuKien:

Trang 13

caseTypeLetter.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;

caseTypeLetter.NguocLai:

if (_isBuild)

break;

if (_go.Count > 0 && _go[_go.Count - 1] == false)

Index = GetNextNgoacDong(Index);

break;

caseTypeLetter.Lap:

break;

caseTypeLetter.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 =

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;

}

Trang 14

}

void TinhDieuKien(clsLine line, refint Index)

{

_go.Add(false);

bool _Co = true;

do

{

int i = GetLastIndexOfLineByChar(line, "(", 1);

if (i == -1 && _Co)

clsError.ErrorStruct(line.Line);

elseif (i == -1)

{

break;

}

_Co = false;

int j = GetIndexOfLineByChar(line, ")", i + 1);

if (j == -1)

{

Program.currLine = line.Line;

thrownewException("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;

elseif (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);

Trang 15

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);

Trang 16

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);

}

}

Ngày đăng: 17/07/2015, 17:58

TỪ KHÓA LIÊN QUAN

w