Đây là một phần của một loạt các câu hỏi tập trung vào một dự án gọi là Dự án Trừu tượng, nhằm mục đích trừu tượng hóa các khái niệm được sử dụng trong thiết kế ngôn ngữ dưới dạng khung.
Một trang khác liên quan đến nó liên quan đến gõ cấu trúc có thể được xem ở đây . Chủ đề meta liên quan đến một cuộc điều tra về khung và vị trí thích hợp để đăng có thể được tìm thấy ở đây .
Làm thế nào dễ dàng để sử dụng Khung phát triển ngôn ngữ?
Tôi đã viết các khung tạo mã quy mô lớn, bao gồm khả năng gửi kết quả đến trình biên dịch dành riêng cho ngôn ngữ. Chủ đề về tính dễ sử dụng xuất phát từ một ví dụ khung như vậy: CodeDOM hoặc Mô hình đối tượng tài liệu mã.
Đó là một khung được viết bởi Microsoft mô tả các cấu trúc mã phổ biến, nhưng thường bỏ qua rất nhiều (ép buộc biểu thức) và có xu hướng hơi trừu tượng trong việc thể hiện các cấu trúc nhất định của nó, để phát ra mã xấu dựa trên những gì bạn đang làm: trước đó CodeDOM kém xử lý phát ra PrivateImplementationType
vào CodeMemberMethod
, khi loại được sử dụng là một giao diện chung. CodeDOM là lý do ban đầu của tôi để viết trình tạo mã đầu tiên của tôi.
Một điều tôi đang cố gắng làm, để đơn giản hóa khung công tác, là giảm số lượng công việc bạn cần làm và tập trung vào các hành động so với các loại cụ thể tạo nên các hành động đó.
Đây là sự so sánh song song về cách thức hoạt động của khung công tác:
//Truncated...
/* *
* From a project that generates a lexer, this is the
* state->state transition character range selection logic.
* */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
* 'start' <= nextChar && nextChar <= 'end'
* */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));
Mã VersDOM:
//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));
Trọng tâm của khung là những người đam mê ngôn ngữ, cũng như những người quan tâm đến việc tạo mã hoặc ứng dụng. Tập trung vào việc biên dịch, tạo mã và phát triển ngôn ngữ, khung nên tập trung vào tính dễ sử dụng hay sức mạnh thô?
Mục tiêu chính của tôi là tăng tính khả dụng của các công cụ như vậy, vì vậy những người quan tâm đến miền không yêu cầu nhiều kinh nghiệm trong lĩnh vực lý thuyết ngôn ngữ trước khi họ có thể bắt đầu làm việc với các dự án tập trung vào ngôn ngữ của mình.
Cho rằng tôi là tác giả của khung, quan điểm của tôi về "khả năng sử dụng" là sai lệch. Vì vậy, tôi phải hỏi người khác nếu trọng tâm và mục tiêu có ý nghĩa với những người khác không liên quan đến dự án.