Y2L Sharp – Ngôn ngữ lập trình (thông dịch) đơn giản viết trên C#

Đây là một dự án mẫu về phương pháp hiện thực một ngôn ngữ lập trình đơn giản với tên gọi Y2L #. Phiên bản hiện tại 0.9 hỗ trợ các kiểu dữ liệu cơ bản bool, int, double, string, void và mảng 1 chiều. Chương trình thiếu phần kiểm tra cú pháp và còn nhiều hạn chế.

 

 

 

Version 0.9:

Download Sourcecode+demo (VC# 2010)

Để tạo một trình biên dịch bạn có thể sử dụng kĩ thuật Reflection Emit, phân rã câu lệnh và biểu thức để thực hiện tương tự như thông dịch.

Bài viết liên quan:

C# – Chuyển chuỗi biểu thức thành Expression Tree

Giao diện chương trình:

Ngữ pháp:

"Name" = Y2L#
"Version" = 1.0
"Start Symbol" = <Program>
"Case Sensitive" = True

{LETTER} = {Letter}
{DIGIT} = {Digit}
{ALPHA_NUMERIC} = {DIGIT} + {LETTER}
{HEX_DIGIT} = {DIGIT} + [a-fA-F]
{String Char} = {Printable} - ["]

Indentifier                   = {LETTER}{ALPHA_NUMERIC}*

! ============================================================
! Literals
! ============================================================

IntegerLiteral            = {DIGIT}+
RealLiteral               = {DIGIT}*.{DIGIT}
StringLiteral             = '"'{String Char}*'"'

OtherLiteral              =   {ALPHA_NUMERIC}+

<Literal>                  ::= true
			     | false
                             | IntegerLiteral
                             | RealLiteral
                             | StringLiteral

! ============================================================
! Comment
! ============================================================

Comment Line = '//'

! ============================================================
! Type
! ============================================================

<Type>        ::= bool
                  | int
                  | double
                  | void
		  | string
! ============================================================
! Expressions
! ============================================================

 <Expression List>    ::= <Expression>
		| <Expression List> ',' <Expression>
<Expression>  ::= <Expression> '='  <Add Exp>
               |  <Expression> '<'  <Add Exp>
               |  <Expression> '<=' <Add Exp>
               |  <Expression> '>=' <Add Exp>
               |  <Expression> '==' <Add Exp>    !Equal
               |  <Expression> '!=' <Add Exp>    !Not equal
               |  <Add Exp>

<Add Exp>     ::= <Add Exp> '+' <Mult Exp>
               |  <Add Exp> '-' <Mult Exp>
               |  <Mult Exp>

<Mult Exp>    ::= <Mult Exp> '*' <Unary Exp>
               |  <Mult Exp> '/' <Unary Exp>
               |  <Unary Exp>

<Unary Exp>  ::= '-' <Primary Exp>
               |  <Primary Exp>

<Primary Exp>
       ::= Indetifier
        |  Indetifier '[' <Expression> ']'
        |  <Function Call>
        |  <Literal>

! ============================================================
! Block & Declaration
! ============================================================

<Program>              ::= module Indentifier '(' <Formal Param List> ')' <Block>

<Variable Dec>     	::= <Type> Indentifier
                             | <Type> Indentifier '=' <Expression>
                             | <Type> Indentifier '[' <Expression> ']'

<Function Dec>     		::= function <Type> Indentifier '(' ')' <Block>
                             | <Type> Indentifier '(' <Formal Param List> ')' <Block>

<Formal Param List>               ::= <Formal Param>
                             | <Formal Param List> ',' <Formal Param>

<Formal Param>             ::= <Type> Indentifier

<Function Call>            ::= Indentifier '(' ')'
                             | Indentifier '(' <Expression List> ')'

 <Block>
       ::= '{' <Statement List> '}'
        |  '{' '}'

! ============================================================
! Statements
! ============================================================

<Statement List>
       ::= <Statement List>; <Statement>
        |  <Statement>

<Statement>
       ::= if       '(' <Expression> ')' <Block>
        |  if       '(' <Expression> ')' <Block> else <Block>
        |  if       '(' <Expression> ')' <Block> <Then Statement> else <Block>
        |  for      '(' <Variable Dec> ';' <Expression> ';' <Statement> ')' <Block>
        |  while    '(' <Expression> ')' <Block>
        |  <Normal Statement>

<Then Statement>
       ::= elseif '(' <Expression> ')' <Block>
	| elseif '(' <Expression> ')' <Block> <Then Statement>

<Normal Statement>
       ::= return <Expression> ';'
	| <CSharp Statement>
	| <Variable Dec> ';'

<CSharp Statement>
        ::= '#' '[' OtherLiteral ']'(' ')' ';'
	| '#' '[' OtherLiteral ']' '(' <Expression List> ')' ';'

One thought on “Y2L Sharp – Ngôn ngữ lập trình (thông dịch) đơn giản viết trên C#

  1. Pingback: Một ngôn ngữ lập trình đơn giản! | ĐHTH3TLT

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s