Tôi có bộ chuyển đổi bbcode -> html phản hồi sự kiện thay đổi trong vùng văn bản. Hiện nay, điều này được thực hiện bằng cách sử dụng một loạt các biểu thức chính quy, và có một số trường hợp bệnh lý. Tôi đã luôn luôn muốn làm sắc nét bút chì trong ngữ pháp này, nhưng không muốn bị cạo râu. Nhưng ... gần đây tôi đã trở thành nhận thức của pegjs, mà dường như một thực hiện khá đầy đủ của thế hệ phân tích cú pháp PEG. Tôi có hầu hết các ngữ pháp được chỉ định, nhưng bây giờ lại tự hỏi liệu đây có phải là một sử dụng thích hợp của một trình phân tích cú pháp toàn diện hay không.Sử dụng Phân tích cú pháp PEG để phân tích cú pháp BBCode: pegjs hoặc ... cái gì?
câu hỏi cụ thể của tôi là:
Như ứng dụng của tôi dựa vào dịch những gì tôi có thể sang HTML và rời khỏi phần còn lại dưới dạng văn bản thô, không thực hiện bbcode sử dụng một phân tích cú pháp có thể thất bại trên một lỗi cú pháp có ý nghĩa ? Ví dụ:
[url=/foo/bar]click me![/url]
chắc chắn sẽ được dự kiến thành công khi đã đóng dấu ngoặc đóng trên thẻ đóng. Nhưng người dùng sẽ thấy gì trong thời gian chờ đợi? Với regex, tôi chỉ có thể bỏ qua những thứ không phù hợp và coi nó là văn bản bình thường cho mục đích xem trước. Với một ngữ pháp chính thức, tôi không biết liệu điều này là có thể bởi vì tôi đang dựa vào việc tạo HTML từ một cây phân tích cú pháp và những gì không phân tích cú pháp là ... cái gì?Tôi không rõ nơi thực hiện các phép biến đổi. Trong một trình phân tích cú pháp dựa trên lex/yacc, tôi sẽ có các tệp tiêu đề và các ký hiệu biểu thị loại nút. Trong pegjs, tôi nhận được mảng lồng nhau với văn bản nút. Tôi có thể phát ra mã đã dịch như là một hành động của trình phân tích cú pháp được tạo bởi pegjs, nhưng nó có vẻ giống như một mùi mã để kết hợp một trình phân tích cú pháp và một bộ phát. Tuy nhiên, nếu tôi gọi
PEG.parse.parse()
, tôi nhận lại một cái gì đó như thế này:
[
[
"[",
"img",
"",
[
"/",
"f",
"o",
"o",
"/",
"b",
"a",
"r"
],
"",
"]"
],
[
"[/",
"img",
"]"
]
]
được đưa ra một ngữ pháp như:
document
= (open_tag/close_tag/new_line/text)*
open_tag
= ("[" tag_name "="? tag_data? tag_attributes? "]")
close_tag
= ("[/" tag_name "]")
text
= non_tag+
non_tag
= [\n\[\]]
new_line
= ("\r\n"/"\n")
Tôi viết tắt ngữ pháp, tất nhiên, nhưng bạn Có được ý tưởng. Vì vậy, nếu bạn nhận thấy, không có thông tin theo ngữ cảnh trong mảng mảng cho tôi biết loại nút nào tôi có và tôi còn lại để so sánh chuỗi lại thậm chí nghĩ rằng trình phân tích cú pháp đã thực hiện việc này. Tôi hy vọng có thể xác định callbacks và sử dụng các hành động để chạy chúng trong khi phân tích cú pháp, nhưng có thông tin có sẵn trên Web về cách người ta có thể làm điều đó.
Tôi có đang sủa nhầm cây không? Tôi có nên quay trở lại quá trình quét regex và quên phân tích cú pháp không?
Cảm ơn
Steve, câu hỏi của bạn rất thú vị (+1), tôi chỉ muốn làm điều tương tự trong phần mở rộng: phân tích cú pháp BBCode trong văn bản (không may đây là định dạng mà diễn đàn vẫn đang sử dụng) và tạo "sống "xem trước từ văn bản đã nhập bằng PEG.js hoặc bất kỳ nội dung nào khác ngoại trừ cụm từ thông dụng. Bạn đã quản lý để tạo ngữ pháp cho trình phân tích cú pháp BBCode chưa? Bạn không thể chia sẻ giải pháp của mình thông qua GitHub hay bất cứ thứ gì khác? Điều đó sẽ giúp tôi rất nhiều. Cảm ơn rất nhiều trước! – Sk8erPeter
Tôi đã sử dụng [trình phân tích cú pháp bbcode của patorjk] (https://github.com/patorjk/Extendible-BBCode-Parser). Hoạt động tốt và có thể được điều chỉnh theo nhu cầu của riêng bạn nếu bạn có các thẻ đặc biệt. –
Cảm ơn, tôi đã thấy thư viện này, nhưng nó sử dụng các biểu thức chính quy, mà tôi muốn tránh, bởi vì về mặt lý thuyết, phân tích BBCode bằng cách sử dụng cụm từ thông dụng không thể thực hiện được mà không có lỗi ([»» link] (http: // kore- nordmann.de/blog/do_NOT_parse_using_regexp.html)) trong một số trường hợp, ví dụ khi lồng ghép chúng vào nhau, vv Đó là lý do tại sao tôi muốn làm điều đó bằng cách sử dụng phân tích cú pháp biểu thức ngữ pháp biểu thức. Vì vậy, bạn không cố gắng cải tiến ngữ pháp mà bạn đã bắt đầu? :) Bạn không thể chia sẻ cơ sở của nó? :) – Sk8erPeter