- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
Khi phát triển các chương trình OpenGL, tôi cần phải tự mình phân tích mã Shader kiểu `string` và trích xuất một số tên biến và tên chương trình con bên trong.
Vì tôi không thể tìm thấy trình phân tích cú pháp GLSL Shader có thể sử dụng được nên tôi đã viết Trình tạo LALR dựa trên cuốn sách của Tiger ("Nguyên tắc biên dịch hiện đại - Mô tả ngôn ngữ C"), thực tế bao gồm (bộ phân tích từ vựng + bộ phân tích cú pháp + khung định dạng) (LR(0 ), SLR(1), LALR(1), LR(1)) được tạo hoàn toàn tự động, hỗ trợ các hướng dẫn ưu tiên của yacc và các chức năng giải quyết xung đột Shift/Reduce, Giảm/Giảm.
Công cụ định dạng GLSL Shader trong bài viết này (link tải ở đây https://files.cnblogs.com/files/bitzhuwei/GLSL.Formatter.net8.0.rar?t=1735122490&download=true) sử dụng LALR Generator của tôi, được tạo theo ngữ pháp của GLSL4.60.8, như được mô tả bên dưới.
#extractor Translation_unit : external_declaration | Translation_unit external_declaration ; ' | 'uintConstant' | 'floatConstant' | 'boolConstant' | 'doubleConstant' | '(' biểu thức ')' ; biểu thức postfix_++' | biểu thức postfix_--' ; function_call: function_call_or_method: function_call_generic; function_call_generic: function_call_header_with_parameters ')' | function_call_header_no_parameters ')' ; _tiêu đề bài tập_biểu thức | function_call_header_with_parameters ',' bài tập_biểu thức ; function_call_header : function_identifier '(' ; function_identifier : type_specifier | postfix_biểu thức ; unary_express : postfix_biểu thức | '++' unary_biểu thức | '--' biểu thức unary_operator unary_biểu thức ; unary_operator : '+' | '-' | '!' | '~' ; biểu thức_unary | biểu thức_unary '*' biểu thức_unary | biểu thức_quan hệ '<' biểu thức quan hệ '>' shift_biểu thức quan hệ '<=' biểu thức quan hệ '>=' biểu thức quan hệ '; &' biểu thức đẳng thức ; bao gồm_or_biểu thức: biểu thức độc quyền_or_ | biểu thức bao gồm_or_ '|' biểu thức logic_and_bao gồm_or_biểu thức logic_and_biểu thức '&&' bao gồm biểu thức_or_ ; logic_and_biểu thức logic_xor_biểu thức logic_and_express ; biểu thức đơn_operator phân công_biểu thức ; '=' | '*=' | '%=' | '+=' | ' | '^=' | '|=' ; biểu thức : biểu thức gán | 'độ chính xác' độ chính xác_qualifier type_specifier ';' | type_qualifier 'identifier' '{' struct_declaration_list '}' ';' | type_qualifier 'identifier' '{' struct_declaration_list '}' 'identifier' ';' | '}' 'định danh' mảng_specifier ';' | type_qualifier ';' 'định danh' ';' | type_qualifier 'định danh' danh sách ';' ; định danh_list : ',' 'định danh' | định danh_list ',' 'định danh' ; function_declarator ')' ; | chức năng_header_with_parameters ',' tham số_declaration ; function_header :full_specified_type 'identifier' '(' ; tham số_declarator : type_specifier 'định danh' | type_specifier 'định danh' mảng_specifier ; tham số_declaration : type_qualifier tham số_declarator | tham số_declarator | type_qualifier tham số_type_specifier | tham số_type_specifier ; tham số_type_specifier : type_specifier ; init_declarator_list : single_declaration | init_declarator_list ',' 'identifier' | init_declarator_list ',' 'identifier' array_specifier | định danh' | 'mã định danh' array_specifier |type_specifier | type_qualifier type_specifier ; invariant_qualifier : 'invariant_qualifier : 'smooth' | 'noperspective' ; vòng loại_id ; 'định danh' | 'định danh' '=' biểu thức hằng số | 'được chia sẻ' ; chính xác_qualifier : 'type_qualifier | storage_qualifier : 'const' | vào' | 'ra' | 'vào' | 'trung tâm' | 'mẫu' | 'đồng nhất' | 'bộ đệm' | 'được chia sẻ' | 'dễ bay hơi' | 'chỉ đọc' | ' '(' type_name_list ')' ; type_name_list : 'type_name' | type_specifier_nonarray | type_specifier_nonarray array_specifier : '[' ']' | '[' biểu thức có điều kiện ']' | array_specifier '[' ']' | array_specifier '[' biểu thức có điều kiện ']' :'void' | 'float' | 'int' | 'uint' | 'vec2' | 'vec4' | 'dvec3' | ' | 'bvec3' | 'bvec4' | 'ivec2' | 'uvec3' | 'mat2' | 'mat3' | 'mat2x2' | 'mat2x4' | 'mat3x3' | ' | 'mat4x4' | 'dmat2' | 'dmat3' | 'dmat2x3' | 'dmat3x2' | 'dmat3x3' | 'dmat3x4' | 'dmat4x3' | 'atomic_uint' | ' | 'samplerCubeShadow' | 'sampler2DArray' | 'sampler2DArrayShadow' | 'sampler2DArray' | 'samplerCubeArray' | 'usampler3D' | 'usampler2DArray' | 'sampler1D' | 'sampler1DShadow' | 'sampler1DArray' | 'sampler2DRectShadow' | 'isampler2DRect' | 'usampler2DRect' | 'samplerBuffer2DMS' | 'sampler2DMSArray' | 'uimage2D' | 'image3D' | 'uimage3D' | 'imageCube' | 'uimageCube' | 'iimageBuffer' | 'image1D' ' | 'image1DArray' | 'iimage1DArray' | 'uimage1DArray' | 'image2DRect' | 'iimage2DRect' | 'image2DArray' | 'iimage2DArray' | 'imageCubeArray' | 'image2DMSArray' ' | 'iimage2DMSArray' | 'uimage2DMSArray' | struct_specifier | 'type_name' ; độ chính xác_qualifier : 'highp' | 'trung bình' struct_specifier'struct' 'type_name'/* 'identifier' */ '{' struct_declaration_list '}' | 'struct' '{' struct_declaration_list '}' ; struct_declaration_list : struct_declaration_list struct_declaration ; struct_declarator_list ';' ; struct_declarator_list : struct_declarator_list ',' struct_declarator : 'identifier' | 'identifier' array_specifier ; : trình khởi tạo | trình khởi tạo_list ',' trình khởi tạo ; khai báo; câu lệnh: câu lệnh phức hợp | câu lệnh đơn giản; câu lệnh đơn giản: câu lệnh khai báo | câu lệnh lựa chọn | câu lệnh switch_label | câu lệnh iteration_new_scope: câu lệnh ghép_no_new_scope | câu lệnh đơn giản */ /* hợp nhất thành câu lệnh ghép_statement_no_new_scope : '{' '}' | '{' câu lệnh_list '}' ; */ câu lệnh_list : câu lệnh | biểu thức câu lệnh ';' Selection_rest_statement : câu lệnh 'khác' câu lệnh điều kiện : biểu thức | switch_statement : 'switch' '(' biểu thức ')' '{' switch_statement_list '}' ; switch_statement_list : trống | Statement_list ; case_label : 'case' biểu thức ':' | 'mặc định' ':' ; 'điều kiện ')' câu lệnh/* câu lệnh_no_new_scope */ | 'do' câu lệnh 'while' '(' biểu thức ')' ';' for_init_statement for_rest_statement ')' câu lệnh/* câu lệnh_no_new_scope */ ; for_init_statement : biểu thức_statement | conditionopt : điều kiện | trống ; biểu thức điều kiện ';' ;' | 'trở lại' ';' | 'trở lại' biểu thức ';' ';' ; // câu lệnh từ vựng // không cần:'struct' 'identifier' '{' struct_declaration_list '}' // bây giờ tôi đã đổi nó thành 'struct' 'type_name' '{' struct_declaration_list '}' // chỉ định danh bên cạnh 'struct' là loại do người dùng xác định và phải là mã thông báo 'type_name' %%<'struct'>[a-zA-Z_][a-zA-Z0-9_]*%% 'intConstant' %%[-+]?[0-9]+%% 'intConstant' %%0x[0-9A-Fa-f]+%% 'uintConstant' %%[-+]?[0-9]+[ uU]%% 'uintConstant' %%0x[0-9A-Fa-f]+[uU]%% 'floatConstant' %%[-+]?[0-9]+([.][0-9]+)?([Ee][-+]?[0-9]+)?[fF]%% 'boolConstant' %%true/[^a-zA-Z0-9_]%% 'boolConstant' %%false/[^a-zA-Z0-9_]%% 'doubleConstant' %%[-+]?[0-9]+([.][0-9]+)?([Ee][-+]?[0-9]+)?%% 'mã định danh' %%[ a-zA-Z_][a-zA-Z0-9_]*%% %grammarName GLSL %blockComment trên %inlineComment on
Với cú pháp phân tích cú pháp, có một luồng từ Danh sách
Cụ thể, những gì được định nghĩa loại cần làm chỉ là thêm hoặc xóa một số khoảng trắng ký tự được xác định rõ nhất (cách cấu hình, tab, dòng mới) và sẽ không sửa đổi đổi nội dung có ý nghĩa ngữ pháp. Trong C#, . will be format as. Và. will be format as. Mã nguồn có cùng ý nghĩa nhưng lại có kết quả dạng khác nhau. Điều này hơi phức tạp. Hãy chia nhỏ vấn đề và thực hiện từng bước một. BlockComment, các nhận xét một dòng inlineComment và các ký tự khoảng trắng gốc trong mã nguồn. Tại thời điểm này, if(x>0){t=x;x=0;} phải được định dạng là: Nói cách khác, mỗi phần của cú pháp cây có thể xác định định dạng của nó. Bây giờ hãy xem xét các nhận xét thích hợp có thể xuất hiện ở bất kỳ đâu trong Danh sách
Miễn là thu lợi nhuận được thực hiện mỗi khi Mã thông báo được xuất ra từ cú pháp cây (không quan trọng cái gì được trả về), thì lợi nhuận thu được có thể được hoàn thành đồng bộ với trình duyệt qua Danh sách
Bây giờ có thể định dạng bằng nhận xét, nhưng vẫn chưa giải quyết được vấn đề: có thể có một số dòng trống (tức là dòng mới) giữa dòng trước và mã hóa dòng tiếp theo, sẽ bị bỏ qua trong định dạng ở trên. Thuật toán định dạng hoàn chỉnh sẽ tạo ra ý tưởng của phương pháp trên và được cải tiến như sau: Mỗi cú pháp khối `Node` Bao gồm các yêu cầu của cấp trên trực tiếp và đưa ra các yêu cầu cho từng cấp dưới trực tiếp tiếp theo. lần. Thành viên có thể tải công cụ trong liên kết để xem hiệu ứng Ngoài ra còn có một số mẫu shader. . GLSL Shader ( LALR cú pháp phân tích) kết thúc tại đây. biết thêm về định dạng thuật toán của GLSLShader ( LALR cú pháp phân tích), vui lòng tìm bài viết CFSDN hoặc tiếp tục Duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai .nếu (x >0) {t = x;x = 0 }
nếu (x > 0) {t = x = 0;
nếu (x > 0) {t = x= 0;
nếu (x > 0) {t = x = 0;
nếu (x > 0) {t = x = 0;
Duyệt qua `Danh sách
Cú pháp khối `Node` phải xuất ra bao nhiêu dòng mới và khoảng trắng trước khi xuất ra `Token` đầu tiên bên trong nó theo cấp độ `Node` được yêu cầu on information. khoảng trắng trước. mối liên hệ giữa nó và `Token` trước đó (có bao nhiêu khoảng trắng và dòng mới được phân tách)), sau đó xuất ra nội dung chính của nó .
Tôi là một lập trình viên xuất sắc, rất xuất sắc!