Phân tích cú pháp () trong Python là gì?

Phân tích cú pháp JSON - Chuyển đổi từ JSON sang Python

Nếu bạn có một chuỗi JSON, bạn có thể phân tích cú pháp chuỗi đó bằng cách sử dụng phương thức

#initialize a string
input_string = 'Pencil[10Rs]/Rubber[5Rs]/Ruler[8Rs]/Sharpener[5Rs]'

#create a new lists by parsing the string using "/" delimiter
new_string=input_string.split["/", 2]

print["After string parsing: ",new_string]
0

Ví dụ

Chuyển đổi từ JSON sang Python

nhập json

# một số JSON.
x =  '{ "tên". "John", "tuổi". 30, "thành phố". "New York"}'

# phân tích x.
y = json. tải[x]

# kết quả là một từ điển Python.
print[y["age"]]

Tự mình thử »


Đôi khi, chúng tôi gặp phải tình huống dữ liệu mà chúng tôi quan tâm được phân phối trên toàn bộ chuỗi theo khối. Để trích xuất các đoạn này từ toàn bộ chuỗi, phân tích cú pháp chuỗi được sử dụng. Phân tích cú pháp chuỗi là quá trình chia chuỗi thành các mã thông báo bằng dấu phân cách để trích xuất thông tin mong muốn. Hướng dẫn này là về Cách phân tích một chuỗi trong python. Chúng ta sẽ tìm hiểu cách phân tích các chuỗi dữ liệu thành một danh sách để trích xuất thông tin mong muốn bằng các phương thức và chức năng khác nhau. Nếu bạn muốn tìm hiểu thêm về Lập trình Python, hãy truy cập Hướng dẫn lập trình Python

Trong bài viết này, chúng tôi sẽ đề cập đến các chủ đề sau

  • Phân tích chuỗi thành biến số nguyên hoặc float
  • Phân tích dữ liệu Chuỗi thành Danh sách

Phân tích chuỗi INTo số nguyên hoặc biến Float

Hàm int[] có thể được sử dụng để phân tích chuỗi đầu vào thành một biến số nguyên. Tương tự, để phân tích dữ liệu chuỗi thành một biến nổi, chúng ta có thể sử dụng hàm float[]. Ví dụ

#Program to parse a string into integer variable

#Take a string as an input from the user
var = input["Enter any number: "]

#print the datatype of the input string
print["Before parsing: "]
print[type[var]]

# Parse the string variable to integer
new_var=int[var]

#display the datatype of parsed variable
print["After parsing: "]
print[type[new_var]]

# Parse the string variable to float variable
new_var=float[var]

#display the datatype of parsed variable
print["After parsing: "]
print[type[new_var]]

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 

Hàm type[] hiển thị kiểu dữ liệu của biến

Phân tích dữ liệu Chuỗi thành Danh sách

các str. hàm split[] được sử dụng để phân tích một chuỗi thành danh sách. Dấu phân cách hoặc dấu tách được truyền dưới dạng tham số đầu vào cho chuỗi str. split[] tách chuỗi đầu vào bằng cách sử dụng dấu phân cách và trả về danh sách các chuỗi con. Giả sử bạn có một chuỗi 'Bút chì[10Rs], Cao su[5Rs], Thước kẻ[8Rs], Bút mài[5Rs]'. Bây giờ, bạn được yêu cầu hiển thị giá Cao su. Đoạn mã dưới đây trình bày cách sử dụng str. split[] để chuyển đổi một chuỗi đại diện của một danh sách thành một danh sách thực. Giả sử bạn có một str

#initialize a string
input_string = 'Pencil[10Rs],Rubber[5Rs],Ruler[8Rs],Sharpener[5Rs]'

#create a new lists by parsing the string using "," delimiter
new_string=input_string.split[","]

print["After string parsing: ",new_string]
print["The price of Rubber is: ",new_string[1]]

After string parsing:  ['Pencil[10Rs]', 'Rubber[5Rs]', 'Ruler[8Rs]', 'Sharpener[5Rs]']
The price of Rubber is:  Rubber[5Rs]

Sử dụng input_string. split[“,”], chúng ta đã chia chuỗi các mặt hàng thành một danh sách bao gồm các mặt hàng cùng với giá của chúng. Bây giờ, bạn có thể dễ dàng tìm thấy giá của bất kỳ mặt hàng nào. Bạn cũng có thể xác định số lần tách tối đa trong một chuỗi. Gọi hàm split[] tương tự và bây giờ chuyển hai đối số cho hàm này i. e. , str. phân tách [dấu phân cách, max_splits]. Ở đây, max_splits chỉ định số lần phân tách mà bạn muốn. Xem xét ví dụ trên. Giả sử bạn chỉ muốn hai phần tách

#initialize a string
input_string = 'Pencil[10Rs]/Rubber[5Rs]/Ruler[8Rs]/Sharpener[5Rs]'

#create a new lists by parsing the string using "/" delimiter
new_string=input_string.split["/", 2]

print["After string parsing: ",new_string]

After string parsing:  ['Pencil[10Rs]', 'Rubber[5Rs]', 'Ruler[8Rs]/Sharpener[5Rs]']

Có thể thấy từ đầu ra rằng chuỗi được chia thành hai phần bằng cách sử dụng hai dấu phân cách đầu tiên trong khi chuỗi còn lại giữ nguyên

Đây là một bài viết tương tự như một bài trước chúng tôi đã viết. Phân tích cú pháp trong Java, vì vậy phần giới thiệu giống nhau. Bỏ qua chương 3 nếu bạn đã đọc nó

Nếu bạn cần phân tích cú pháp một ngôn ngữ hoặc tài liệu từ Python, về cơ bản có ba cách để giải quyết vấn đề

  • sử dụng thư viện hiện có hỗ trợ ngôn ngữ cụ thể đó. ví dụ một thư viện để phân tích cú pháp XML
  • xây dựng trình phân tích cú pháp tùy chỉnh của riêng bạn bằng tay
  • một công cụ hoặc thư viện để tạo trình phân tích cú pháp. ví dụ ANTLR, mà bạn có thể sử dụng để xây dựng trình phân tích cú pháp cho bất kỳ ngôn ngữ nào

Sử dụng thư viện hiện có

Tùy chọn đầu tiên là tốt nhất cho các ngôn ngữ nổi tiếng và được hỗ trợ, như XML hoặc HTML. Một thư viện tốt thường bao gồm cả API để lập trình xây dựng và sửa đổi tài liệu bằng ngôn ngữ đó. Đây thường là nhiều hơn những gì bạn nhận được từ trình phân tích cú pháp cơ bản. Vấn đề là những thư viện như vậy không quá phổ biến và chúng chỉ hỗ trợ những ngôn ngữ phổ biến nhất. Trong các trường hợp khác, bạn không may mắn

Xây dựng trình phân tích cú pháp tùy chỉnh của riêng bạn bằng tay

Bạn có thể cần chọn tùy chọn thứ hai nếu bạn có nhu cầu cụ thể. Cả hai nghĩa là ngôn ngữ bạn cần phân tích cú pháp không thể được phân tích cú pháp bằng trình tạo trình phân tích cú pháp truyền thống hoặc bạn có các yêu cầu cụ thể mà bạn không thể đáp ứng khi sử dụng trình tạo trình phân tích cú pháp thông thường. Chẳng hạn, vì bạn cần hiệu suất tốt nhất có thể hoặc tích hợp sâu giữa các thành phần khác nhau

Công cụ hoặc thư viện để tạo trình phân tích cú pháp

Trong tất cả các trường hợp khác, tùy chọn thứ ba phải là tùy chọn mặc định, bởi vì tùy chọn này linh hoạt nhất và có thời gian phát triển ngắn hơn. Đó là lý do tại sao trong bài viết này, chúng tôi tập trung vào các công cụ và thư viện tương ứng với tùy chọn này

Ghi chú. văn bản trong blockquote mô tả một chương trình đến từ tài liệu tương ứng

Công cụ để tạo trình phân tích cú pháp

Chúng ta sẽ xem

  • các công cụ có thể tạo trình phân tích cú pháp có thể sử dụng được từ Python [và có thể từ các ngôn ngữ khác]
  • Thư viện Python để xây dựng trình phân tích cú pháp

Các công cụ có thể được sử dụng để tạo mã cho trình phân tích cú pháp được gọi là trình tạo trình phân tích cú pháp hoặc trình biên dịch trình biên dịch. Các thư viện tạo trình phân tích cú pháp được gọi là bộ kết hợp trình phân tích cú pháp

Trình tạo trình phân tích cú pháp [hoặc trình kết hợp trình phân tích cú pháp] không tầm thường. bạn cần một chút thời gian để học cách sử dụng chúng và không phải tất cả các loại trình tạo trình phân tích cú pháp đều phù hợp với mọi loại ngôn ngữ. Đó là lý do tại sao chúng tôi đã chuẩn bị một danh sách những người nổi tiếng nhất trong số họ, với phần giới thiệu ngắn cho từng người trong số họ. Chúng tôi cũng đang tập trung vào một ngôn ngữ mục tiêu. con trăn. Điều này cũng có nghĩa là [thường] bản thân trình phân tích cú pháp sẽ được viết bằng Python

Để liệt kê tất cả các công cụ và trình phân tích cú pháp thư viện có thể có cho tất cả các ngôn ngữ sẽ rất thú vị, nhưng không hữu ích lắm. Đó là bởi vì đơn giản là sẽ có quá nhiều lựa chọn và tất cả chúng ta sẽ bị lạc trong chúng. Bằng cách tập trung vào một ngôn ngữ lập trình, chúng tôi có thể cung cấp sự so sánh giữa các ứng dụng và giúp bạn chọn một tùy chọn cho dự án của mình

Những điều hữu ích cần biết về trình phân tích cú pháp

Để đảm bảo rằng tất cả các lập trình viên đều có thể truy cập danh sách này, chúng tôi đã chuẩn bị một giải thích ngắn gọn cho các thuật ngữ và khái niệm mà bạn có thể gặp phải khi tìm kiếm trình phân tích cú pháp. Chúng tôi không cố gắng cung cấp cho bạn những lời giải thích chính thức, mà là những lời giải thích thực tế

Cấu trúc của một trình phân tích cú pháp

Một trình phân tích cú pháp thường bao gồm hai phần. một lexer, còn được gọi là máy quét hoặc trình mã thông báo và trình phân tích cú pháp thích hợp. Không phải tất cả các trình phân tích cú pháp đều áp dụng lược đồ hai bước này. một số trình phân tích cú pháp không phụ thuộc vào từ vựng. Chúng được gọi là trình phân tích cú pháp không quét

Một từ vựng và một trình phân tích cú pháp hoạt động theo trình tự. lexer quét đầu vào và tạo mã thông báo phù hợp, trình phân tích cú pháp quét mã thông báo và tạo kết quả phân tích cú pháp

Hãy xem ví dụ sau và tưởng tượng rằng chúng ta đang cố phân tích một phép toán

437 + 734

Từ vựng quét văn bản và tìm '4', '3', '7' và sau đó là khoảng trắng ' '. Công việc của lexer là nhận ra rằng các ký tự đầu tiên tạo thành một mã thông báo loại NUM. Sau đó, lexer tìm thấy ký hiệu '+', tương ứng với mã thông báo thứ hai thuộc loại PLUS và cuối cùng, nó tìm thấy một mã thông báo khác thuộc loại NUM

Trình phân tích cú pháp thường sẽ kết hợp các mã thông báo do lexer tạo ra và nhóm chúng lại

Các định nghĩa được sử dụng bởi từ vựng hoặc trình phân tích cú pháp được gọi là quy tắc hoặc sản phẩm. Quy tắc lexer sẽ chỉ định rằng một chuỗi các chữ số tương ứng với mã thông báo loại NUM, trong khi quy tắc trình phân tích cú pháp sẽ chỉ định rằng chuỗi mã thông báo loại NUM, PLUS, NUM tương ứng với một biểu thức

Các trình phân tích cú pháp không dùng máy quét thì khác vì chúng xử lý trực tiếp văn bản gốc, thay vì xử lý danh sách các mã thông báo do một từ vựng tạo ra

Hiện tại, điển hình là tìm các bộ có thể tạo cả trình phân tích từ vựng và trình phân tích cú pháp. Trước đây, thay vào đó, việc kết hợp hai công cụ khác nhau trở nên phổ biến hơn. một để tạo từ vựng và một để tạo trình phân tích cú pháp. Đây là ví dụ về trường hợp của cặp đôi đáng kính lex & yacc. lex tạo lexer, trong khi yacc tạo trình phân tích cú pháp

Cây phân tích cú pháp và cây cú pháp trừu tượng

Có hai thuật ngữ có liên quan và đôi khi chúng được sử dụng thay thế cho nhau. cây phân tích cú pháp và cây cú pháp trừu tượng [AST]

Về mặt khái niệm chúng rất giống nhau

  • cả hai đều là cây. có một gốc đại diện cho toàn bộ đoạn mã được phân tích cú pháp. Sau đó, có các cây con nhỏ hơn đại diện cho các phần mã trở nên nhỏ hơn cho đến khi các mã thông báo đơn lẻ xuất hiện trong cây
  • sự khác biệt là mức độ trừu tượng. cây phân tích cú pháp chứa tất cả các mã thông báo xuất hiện trong chương trình và có thể là một bộ quy tắc trung gian. Thay vào đó, AST là một phiên bản được đánh bóng của cây phân tích cú pháp trong đó thông tin có thể được lấy hoặc không quan trọng để hiểu đoạn mã bị xóa

Trong AST, một số thông tin bị mất, chẳng hạn như nhận xét và ký hiệu nhóm [dấu ngoặc đơn] không được trình bày. Những thứ như nhận xét là không cần thiết đối với một chương trình và các biểu tượng nhóm được xác định ngầm định bởi cấu trúc của cây

Cây phân tích cú pháp là biểu diễn của mã gần với cú pháp cụ thể hơn. Nó hiển thị nhiều chi tiết về việc triển khai trình phân tích cú pháp. Chẳng hạn, thông thường một quy tắc tương ứng với loại nút. Cây phân tích cú pháp thường được người dùng chuyển đổi thành AST, có thể với một số trợ giúp từ trình tạo trình phân tích cú pháp

Một đại diện đồ họa của một AST trông như thế này

Đôi khi bạn có thể muốn bắt đầu tạo một cây phân tích cú pháp và sau đó lấy từ nó một AST. Điều này có thể hợp lý vì cây phân tích cú pháp dễ tạo hơn cho trình phân tích cú pháp [nó là biểu diễn trực tiếp của quá trình phân tích cú pháp] nhưng AST đơn giản hơn và dễ xử lý hơn theo các bước sau. Bằng cách làm theo các bước, chúng tôi có nghĩa là tất cả các hoạt động mà bạn có thể muốn thực hiện trên cây. xác thực mã, giải thích, biên dịch, v.v.

Văn phạm

Ngữ pháp là một mô tả chính thức của một ngôn ngữ có thể được sử dụng để nhận ra cấu trúc của nó

Nói một cách đơn giản là một danh sách các quy tắc xác định cách mỗi cấu trúc có thể được tạo thành. Ví dụ: quy tắc cho câu lệnh if có thể chỉ định rằng nó phải bắt đầu bằng từ khóa “if”, theo sau là dấu ngoặc đơn bên trái, biểu thức, dấu ngoặc đơn bên phải và câu lệnh

Một quy tắc có thể tham chiếu các quy tắc hoặc loại mã thông báo khác. Trong ví dụ về câu lệnh if, từ khóa “if”, dấu ngoặc đơn bên trái và bên phải là các loại mã thông báo, trong khi biểu thức và câu lệnh là tham chiếu đến các quy tắc khác

Định dạng được sử dụng nhiều nhất để mô tả ngữ pháp là Biểu mẫu Backus-Naur [BNF], cũng có nhiều biến thể, bao gồm Biểu mẫu Backus-Naur mở rộng. Biến thể Mở rộng có ưu điểm là bao gồm một cách đơn giản để biểu thị các lần lặp lại. Một quy tắc điển hình trong ngữ pháp Backus-Naur trông như thế này

 ::= __expression__

addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
7 thường là nonterminal, có nghĩa là nó có thể được thay thế bằng nhóm phần tử bên phải,
addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
8. Phần tử
addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
8 có thể chứa các ký hiệu không đầu cuối hoặc ký hiệu đầu cuối khác. Các ký hiệu đầu cuối chỉ đơn giản là những ký hiệu không xuất hiện dưới dạng
addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
7 ở bất kỳ đâu trong ngữ pháp. Một ví dụ điển hình của ký hiệu đầu cuối là một chuỗi ký tự, như “lớp”

Quy tắc đệ quy trái

Trong ngữ cảnh của trình phân tích cú pháp, một tính năng quan trọng là hỗ trợ các quy tắc đệ quy trái. Điều này có nghĩa là một quy tắc có thể bắt đầu bằng một tham chiếu đến chính nó. Tài liệu tham khảo này cũng có thể là gián tiếp

Xét ví dụ các phép tính số học. Một phép cộng có thể được mô tả là hai [các] biểu thức được phân tách bằng ký hiệu dấu cộng [+], nhưng một biểu thức cũng có thể chứa các phép cộng khác

________số 8

Mô tả này cũng phù hợp với nhiều bổ sung như 5 + 4 + 3. Đó là bởi vì nó có thể được hiểu là biểu thức [5] [‘+’] biểu thức[4+3]. Và khi đó bản thân 4 + 3 có thể được chia thành hai thành phần của nó

Vấn đề là loại quy tắc này có thể không được sử dụng với một số trình tạo trình phân tích cú pháp. Phương án thay thế là một chuỗi dài các biểu thức cũng quan tâm đến quyền ưu tiên của các toán tử

Một số trình tạo trình phân tích cú pháp hỗ trợ quy tắc đệ quy trái trực tiếp, nhưng không hỗ trợ quy tắc gián tiếp

Các loại ngôn ngữ và ngữ pháp

Chúng tôi chủ yếu quan tâm đến hai loại ngôn ngữ có thể được phân tích cú pháp bằng trình tạo trình phân tích cú pháp. ngôn ngữ thông thường và ngôn ngữ phi ngữ cảnh. Chúng tôi có thể cung cấp cho bạn định nghĩa chính thức theo hệ thống phân cấp ngôn ngữ Chomsky, nhưng nó sẽ không hữu ích lắm. Thay vào đó, hãy xem xét một số khía cạnh thực tế

Một ngôn ngữ thông thường có thể được xác định bởi một loạt các biểu thức chính quy, trong khi ngôn ngữ không có ngữ cảnh cần nhiều hơn thế. Một quy tắc ngón tay cái đơn giản là nếu ngữ pháp của một ngôn ngữ có các phần tử đệ quy thì đó không phải là ngôn ngữ thông thường. Chẳng hạn, như chúng tôi đã nói ở nơi khác, HTML không phải là ngôn ngữ thông thường. Trên thực tế, hầu hết các ngôn ngữ lập trình đều là ngôn ngữ phi ngữ cảnh

Thông thường với một loại ngôn ngữ tương ứng với cùng một loại ngữ pháp. Điều đó có nghĩa là có ngữ pháp thông thường và ngữ pháp phi ngữ cảnh tương ứng với ngôn ngữ thông thường và ngôn ngữ phi ngữ cảnh. Nhưng để làm phức tạp thêm vấn đề, có một loại ngữ pháp tương đối mới [được tạo ra vào năm 2004], được gọi là Ngữ pháp biểu thức phân tích cú pháp [PEG]. Những ngữ pháp này cũng mạnh như ngữ pháp phi ngữ cảnh, nhưng theo tác giả của chúng, chúng mô tả các ngôn ngữ lập trình một cách tự nhiên hơn

Sự khác biệt giữa PEG và CFG

Sự khác biệt chính giữa PEG và CFG là thứ tự các lựa chọn có ý nghĩa trong PEG, nhưng không phải trong CFG. Nếu có nhiều cách hợp lệ để phân tích cú pháp đầu vào, CFG sẽ không rõ ràng và do đó sai. Thay vào đó, với PEG, lựa chọn áp dụng đầu tiên sẽ được chọn và điều này tự động giải quyết một số điểm mơ hồ

Một điểm khác biệt nữa là PEG sử dụng trình phân tích cú pháp không quét. họ không cần một giai đoạn phân tích từ vựng hoặc từ vựng riêng biệt

Theo truyền thống, cả PEG và một số CFG đều không thể xử lý các quy tắc đệ quy trái, nhưng một số công cụ đã tìm ra cách giải quyết cho vấn đề này. Bằng cách sửa đổi thuật toán phân tích cú pháp cơ bản hoặc bằng cách để công cụ tự động viết lại quy tắc đệ quy trái theo cách không đệ quy. Một trong những cách này có nhược điểm. bằng cách làm cho trình phân tích cú pháp được tạo kém dễ hiểu hơn hoặc làm giảm hiệu suất của nó. Tuy nhiên, về mặt thực tế, ưu điểm của việc phát triển dễ dàng và nhanh hơn vượt trội hơn những nhược điểm

Nếu bạn muốn biết thêm về lý thuyết phân tích cú pháp, bạn nên đọc Hướng dẫn phân tích cú pháp. Thuật toán và thuật ngữ

Trình tạo trình phân tích cú pháp

Quy trình làm việc cơ bản của công cụ tạo trình phân tích cú pháp khá đơn giản. bạn viết một ngữ pháp xác định ngôn ngữ hoặc tài liệu và bạn chạy công cụ để tạo trình phân tích cú pháp có thể sử dụng được từ mã Python của bạn

Trình phân tích cú pháp có thể tạo ra AST mà bạn có thể phải tự duyệt qua hoặc bạn có thể duyệt qua các lớp sẵn sàng sử dụng bổ sung, chẳng hạn như Người nghe hoặc Khách truy cập. Thay vào đó, một số công cụ cung cấp cơ hội nhúng mã bên trong ngữ pháp để được thực thi mỗi khi quy tắc cụ thể được khớp

Thông thường, bạn cần một thư viện thời gian chạy và/hoặc chương trình để sử dụng trình phân tích cú pháp được tạo

bối cảnh miễn phí

Hãy xem các công cụ tạo trình phân tích ngữ cảnh miễn phí

ANTLR

ANTLR là một trình tạo trình phân tích cú pháp tuyệt vời được viết bằng Java, cũng có thể tạo trình phân tích cú pháp cho Python và nhiều ngôn ngữ khác. Ngoài ra còn có phiên bản beta cho TypeScript từ cùng một người đã tạo ra phiên bản C# được tối ưu hóa. ANTLR dựa trên thuật toán LL mới do tác giả phát triển và được mô tả trong bài báo này. Phân tích cú pháp LL[*] thích ứng. Sức mạnh của phân tích động [PDF]

Nó khá phổ biến vì nhiều tính năng hữu ích. ví dụ phiên bản 4 hỗ trợ các quy tắc đệ quy trái trực tiếp. Tuy nhiên, một giá trị gia tăng thực sự của một cộng đồng rộng lớn đó là số lượng lớn ngữ pháp có sẵn

Nó cung cấp hai cách để thực hiện AST, thay vì nhúng các hành động vào ngữ pháp. khách tham quan và thính giả. Cái đầu tiên phù hợp khi bạn phải thao tác hoặc tương tác với các phần tử của cây, trong khi cái thứ hai hữu ích khi bạn chỉ phải làm gì đó khi một quy tắc được khớp

Ngữ pháp điển hình được chia thành hai phần. quy tắc lexer và quy tắc phân tích cú pháp. Việc phân chia là ngầm định, vì tất cả các quy tắc bắt đầu bằng chữ cái viết hoa là quy tắc từ vựng, trong khi quy tắc bắt đầu bằng chữ cái viết thường là quy tắc trình phân tích cú pháp. Ngoài ra, ngữ pháp lexer và trình phân tích cú pháp có thể được xác định trong các tệp riêng biệt

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
3

Nếu bạn muốn tìm hiểu cách sử dụng ANTLR, bạn có thể xem hướng dẫn ANTLR khổng lồ này mà chúng tôi đã viết. Nếu bạn đã sẵn sàng trở thành nhà phát triển ANTLR chuyên nghiệp, bạn có thể mua khóa học video của chúng tôi để Xây dựng trình phân tích cú pháp và ngôn ngữ chuyên nghiệp bằng ANTLR. Khóa học được dạy bằng Python, vì vậy bạn sẽ cảm thấy như ở nhà

Chim sơn ca

Thư viện phân tích cú pháp hiện đại cho Python, triển khai Earley & LALR[1] và giao diện dễ dàng

Lark là trình tạo trình phân tích cú pháp hoạt động như một thư viện. Bạn viết ngữ pháp trong một chuỗi hoặc một tệp và sau đó sử dụng nó làm đối số để tự động tạo trình phân tích cú pháp. Lark có thể sử dụng hai thuật toán. Earley được sử dụng khi bạn cần phân tích tất cả ngữ pháp và LALR khi bạn cần tốc độ. Earley có thể phân tích ngữ pháp mơ hồ. Lark mang đến cơ hội tự động giải quyết sự mơ hồ bằng cách chọn tùy chọn đơn giản nhất hoặc báo cáo tất cả các tùy chọn

Ngữ pháp Lark được viết ở định dạng EBNF. Chúng không thể bao gồm các hành động. Điều này có nghĩa là chúng rõ ràng và có thể đọc được, nhưng bạn cũng phải tự mình duyệt qua cây kết quả. Mặc dù có một hàm có thể trợ giúp nếu bạn sử dụng thuật toán LALR. Về mặt tích cực, bạn cũng có thể sử dụng các ký hiệu cụ thể trong ngữ pháp để tự động tạo AST. Bạn có thể làm điều đó bằng cách loại bỏ các nút nhất định, hợp nhất hoặc biến đổi chúng

Ví dụ ngữ pháp sau đây cho thấy một tính năng hữu ích của Lark. nó bao gồm các quy tắc cho những thứ phổ biến, như khoảng trắng hoặc số

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
4

Lark đi kèm với một công cụ để chuyển đổi ngữ pháp Nearley sang định dạng riêng. Nó cũng bao gồm một chức năng hữu ích để chuyển đổi cây do trình phân tích cú pháp tạo ra trong một hình ảnh

Nó có một tài liệu đầy đủ, với các ví dụ và hướng dẫn có sẵn. Ngoài ra còn có một tài liệu tham khảo nhỏ

phân tích cú pháp

lrparsing là trình phân tích cú pháp LR[1] ẩn đằng sau giao diện Pythonic

Lrparsing là trình tạo trình phân tích cú pháp có ngữ pháp được định nghĩa là biểu thức Python. Các biểu thức này là thuộc tính của một lớp tương ứng với quy tắc của ngữ pháp truyền thống. Chúng thường được tạo động, nhưng thư viện cung cấp chức năng biên dịch trước bảng phân tích cú pháp

Với định dạng của chúng tùy thuộc vào Python, ngữ pháp lrparsing có thể dễ đọc đối với các nhà phát triển Python, nhưng chúng khó đọc hơn ngữ pháp truyền thống

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
5

Lrparsing cũng cung cấp một số chức năng cơ bản để in cây phân tích cú pháp và quy tắc ngữ pháp cho mục đích gỡ lỗi

Tài liệu thực sự tốt. nó giải thích mọi thứ bạn cần biết về thư viện và nó cũng cung cấp một số hướng dẫn về cách tạo ngữ pháp tốt [ví dụ:. giải quyết sự mơ hồ]. Ngoài ra còn có các ngữ pháp ví dụ khá phức tạp, chẳng hạn như ngữ pháp dành cho SQLite

PLY

PLY không cố gắng làm bất cứ điều gì hơn là cung cấp chức năng lex/yacc cơ bản. Nói cách khác, nó không phải là một khung phân tích cú pháp lớn hay một thành phần của một số hệ thống lớn hơn

PLY là một công cụ ổn định và được bảo trì với lịch sử lâu dài bắt đầu từ năm 2001. Nó cũng khá cơ bản, vì không có công cụ nào để tạo AST tự động hoặc bất kỳ thứ gì mà nhà phát triển C của thế kỷ trước sẽ định nghĩa là công cụ ưa thích. Công cụ này chủ yếu được tạo ra như một công cụ hướng dẫn. Điều này giải thích sự đơn giản của nó, nhưng nó cũng là lý do vì nó hỗ trợ rất tốt cho việc chẩn đoán hoặc bắt lỗi ngữ pháp

Ngữ pháp PLY được viết bằng mã Python ở định dạng giống BNF. Các chức năng của trình phân tích cú pháp và trình phân tích cú pháp có thể được sử dụng riêng. Ví dụ sau chỉ hiển thị từ vựng, nhưng trình phân tích cú pháp hoạt động theo cách tương tự

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
6

Tài liệu phong phú, rõ ràng, với nhiều ví dụ và giải thích về các khái niệm phân tích cú pháp. Tất cả những gì bạn cần, nếu bạn có thể vượt qua vẻ ngoài của '90

Có một cổng dành cho Python được gọi là TRẢ LỜI

PlyPlus

Plyplus là một trình phân tích cú pháp đa năng được xây dựng dựa trên PLY [LALR[1]] và được viết bằng Python. Plyplus có thiết kế hiện đại và tập trung vào sự đơn giản mà không mất điện

PlyPlus là một công cụ được xây dựng dựa trên PLY, nhưng nó rất khác so với nó. Các tác giả và cách viết tên khác nhau. So với cha của nó, tài liệu còn thiếu, nhưng các tính năng thì nhiều

Bạn có thể viết một ngữ pháp trong tệp

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
31 hoặc trong một chuỗi, nhưng nó luôn được tạo động. Định dạng dựa trên EBNF, nhưng ngữ pháp cũng có thể bao gồm các ký hiệu đặc biệt để đơn giản hóa việc tạo AST. Ký hiệu này cho phép loại trừ hoặc loại bỏ các quy tắc nhất định khỏi cây được tạo

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
8

PlyPlus bao gồm chức năng vẽ hình ảnh của cây phân tích cú pháp dựa trên pydot và graphviz. PlyPlus cũng có các tính năng độc đáo. Nó cho phép bạn chọn các nút trong AST bằng cách sử dụng bộ chọn tương tự như bộ chọn CSS được sử dụng trong phát triển web. Chẳng hạn, nếu bạn muốn điền vào tất cả các nút đầu cuối có chứa chữ 'n', bạn có thể tìm thấy chúng như thế này

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
9

Đây là một tính năng độc đáo có thể hữu ích, chẳng hạn như nếu bạn đang phát triển một công cụ phân tích tĩnh hoặc tái cấu trúc

pyleri

Python Left-Right Parser [pyleri] là một phần của họ các trình tạo trình phân tích cú pháp tương tự cho JavaScript, Python, C, Go và Java

Ngữ pháp cho Pyleri phải được định nghĩa trong các biểu thức Python là một phần của lớp. Sau khi được xác định, ngữ pháp có thể được xuất dưới dạng tệp xác định ngữ pháp trong Python hoặc bất kỳ ngôn ngữ được hỗ trợ nào khác. Ví dụ: bạn có thể xác định ngữ pháp bằng Python, xuất nó sang JavaScript và sau đó sử dụng phiên bản JavaScript của pylori để chạy nó. Bạn không thể làm ngược lại, tôi. e. , bạn không thể tạo ngữ pháp bằng JavaScript và xuất nó sang Python. Vì vậy, ngay cả khi bạn muốn sử dụng ngôn ngữ khác, tốt hơn hết là tạo ngữ pháp bằng Python và sau đó xuất nó sang ngôn ngữ đó

Ngoài tính năng thú vị này, Pyleri là một công cụ đơn giản và dễ sử dụng

#initialize a string
input_string = 'Pencil[10Rs],Rubber[5Rs],Ruler[8Rs],Sharpener[5Rs]'

#create a new lists by parsing the string using "," delimiter
new_string=input_string.split[","]

print["After string parsing: ",new_string]
print["The price of Rubber is: ",new_string[1]]
0

Trong điều kiện thực tế, có hai loại quy tắc phân tích cú pháp. đơn giản và sự kết hợp của những cái đơn giản. Những cái đơn giản về cơ bản là các mã thông báo được tạo bằng các biểu thức chính quy, trong khi những cái phức tạp được tạo bằng các hàm phân tích cú pháp sẵn sàng sử dụng [e. g. , Sequence để phân tích một chuỗi các phần tử]

Vì vậy, nó là sự giao thoa giữa trình tạo trình phân tích cú pháp và trình kết hợp trình phân tích cú pháp. Tuy nhiên, nó mạnh hơn bộ kết hợp trình phân tích cú pháp truyền thống và cũng có thể tạo cây phân tích cú pháp. Một tính năng thú vị khác là nó cung cấp một thuộc tính

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
32, liệt kê các yếu tố mà nó có thể chấp nhận tại vị trí cụ thể đó. Điều này rất hữu ích nếu bạn đang xây dựng chức năng tự động hoàn thành

Sự kết hợp giữa tính đơn giản của cú pháp và các tính năng mạnh mẽ này có thể khá hấp dẫn đối với những người thích thứ gì đó mạnh mẽ nhưng không quen với trình tạo trình phân tích cú pháp truyền thống. Đó là lý do tại sao chúng tôi tạo ra một hướng dẫn cho Pyleri. phân tích cú pháp một cách dễ dàng. Với cách này bạn có thể thử sử dụng ngay

CỌC

Sau khi trình phân tích cú pháp CFG là lúc để xem trình phân tích cú pháp PEG có sẵn cho Python

Hợp âm rải

Hợp âm rải là trình phân tích cú pháp gốc đệ quy với tính năng quay lui và ghi nhớ [a. k. a. trình phân tích cú pháp pacrat]. Ngữ pháp hợp âm rải dựa trên hình thức PEG

Tài liệu định nghĩa Arpeggio là trình thông dịch trình phân tích cú pháp, vì trình phân tích cú pháp được tạo động từ ngữ pháp. Trong mọi trường hợp, nó không hoạt động khác với nhiều trình tạo trình phân tích cú pháp Python khác. Một điểm đặc biệt của Hợp âm rải là bạn có thể xác định ngữ pháp ở định dạng PEG văn bản hoặc sử dụng các biểu thức Python. Trên thực tế, có hai phương ngữ của PEG, một phương ngữ có cú pháp giống Python rõ ràng hơn và phương ngữ kia là PEG truyền thống

Hợp âm rải tạo ra một cây phân tích cú pháp đơn giản, nhưng nó hỗ trợ việc sử dụng một khách truy cập. Người truy cập cũng có thể bao gồm hành động thứ hai để thực hiện sau khi tất cả các nút trên cây đã được xử lý. Điều này được sử dụng để xử lý hậu kỳ, ví dụ, nó có thể được sử dụng để xử lý tham chiếu ký hiệu

Ngữ pháp Hợp âm rải được xác định bằng ký hiệu PEG hoặc ký hiệu Python thường khá dễ đọc. Ví dụ sau sử dụng ký hiệu Python

 ::= __expression__
0

Có một số tùy chọn để gỡ lỗi. đầu ra dài dòng và nhiều thông tin cũng như việc tạo các tệp DOT của trình phân tích cú pháp. Các tệp DOT có thể được sử dụng để tạo trực quan hóa trình phân tích cú pháp, nhưng bạn sẽ phải tự gọi

Enter any number: 3246
Before parsing: 

After parsing: 

After parsing: 
33. Các tài liệu là toàn diện và tổ chức tốt

Hợp âm rải là nền tảng của một công cụ tiên tiến hơn để tạo DSL có tên là textX. TextX được tạo bởi cùng một nhà phát triển đã tạo ra Arpeggio và nó được lấy cảm hứng từ XText nổi tiếng hơn. Nếu bạn quan tâm đến văn bản, chúng tôi khuyên bạn nên đọc bài viết của chúng tôi Ngôn ngữ dành riêng cho miền nhanh trong Python có văn bản

Mái hiên

Canopy là trình biên dịch phân tích cú pháp nhắm mục tiêu Java, JavaScript, Python và Ruby. Nó lấy một tệp mô tả ngữ pháp biểu thức phân tích cú pháp và biên dịch nó thành một mô-đun trình phân tích cú pháp trong ngôn ngữ đích. Trình phân tích cú pháp được tạo không phụ thuộc thời gian chạy vào chính Canopy

Nó cũng cung cấp khả năng truy cập dễ dàng vào các nút cây phân tích cú pháp

Ngữ pháp Canopy có tính năng gọn gàng là sử dụng chú thích hành động để sử dụng mã tùy chỉnh trong trình phân tích cú pháp. Về mặt thực tế. bạn chỉ cần viết tên của một hàm bên cạnh một quy tắc và sau đó bạn triển khai hàm đó trong mã nguồn của mình

 ::= __expression__
1

Tệp Python chứa mã hành động

 ::= __expression__
2

chi li

Parsimonious nhằm mục đích trở thành trình phân tích cú pháp tra cứu tùy ý nhanh nhất được viết bằng Python thuần túy — và dễ sử dụng nhất. Nó dựa trên phân tích ngữ pháp biểu thức [PEG], có nghĩa là bạn cung cấp cho nó một loại ký hiệu EBNF đơn giản hóa

Parsimonious là một công cụ đơn giản được thiết kế cho tốc độ và mức sử dụng RAM thấp. Nó cũng là một công cụ không có tài liệu, thậm chí không có ví dụ đầy đủ. Trên thực tế, tệp README ngắn giải thích những điều cơ bản và chuyển hướng bạn đến Docstring để biết thêm thông tin cụ thể

Trong mọi trường hợp, Parsimonious là một công cụ hoạt động tốt cho phép bạn tự động tạo một ngữ pháp được xác định trong một tệp hoặc một chuỗi. Bạn cũng có thể xác định một khách truy cập để duyệt và chuyển đổi cây phân tích cú pháp. Vì vậy, nếu bạn đã quen thuộc với định dạng PEG, bạn không cần biết bất cứ điều gì khác để sử dụng nó một cách đầy đủ nhất

Một ngữ pháp Parsimonious có thể đọc được giống như bất kỳ ngữ pháp PEG nào khác

 ::= __expression__
3

pyPEG

pyPEG là một khung trình thông dịch trình phân tích cú pháp nội tại đơn giản và đơn giản cho Python phiên bản 2. 7 và 3. x

PyPEG là một khung để phân tích cú pháp và soạn thảo văn bản. Điều đó có nghĩa là bạn định nghĩa một ngữ pháp theo cú pháp mạnh mẽ như PEG, nhưng bạn làm điều đó bằng mã Python. Và sau đó bạn sử dụng ngữ pháp này để phân tích cú pháp và/hoặc soạn văn bản dựa trên ngữ pháp đó. Rõ ràng nếu bạn soạn thảo văn bản thì bạn phải tự cung cấp dữ liệu. Trong trường hợp này, nó hoạt động như một hệ thống mẫu

Cú pháp của PyPEG hơi dài dòng, nói thẳng ra là nó quá dài dòng để hiệu quả nếu bạn chỉ muốn sử dụng nó để phân tích cú pháp đơn giản. Nhưng nó là một thư viện tuyệt vời nếu bạn muốn phân tích và thao tác một số tài liệu ở một định dạng cụ thể. Chẳng hạn, bạn có thể sử dụng nó để chuyển đổi tài liệu ở định dạng này sang định dạng khác

 ::= __expression__
4

PyPEG không tạo ra cây tiêu chuẩn mà là cấu trúc dựa trên ngữ pháp đã xác định. Nhìn vào những gì xảy ra cho ví dụ trước

 ::= __expression__
5

TấtSu

TatSu [dành cho trình biên dịch ngữ pháp] là một công cụ lấy các ngữ pháp trong một biến thể của EBNF làm đầu vào và xuất ra các trình phân tích cú pháp PEG ghi nhớ [Packrat] trong Python

TatSu là sự kế thừa của Grako, một công cụ tạo trình phân tích cú pháp khác và nó có mức độ tương thích tốt với nó. Nó có thể tự động tạo trình phân tích cú pháp từ ngữ pháp hoặc biên dịch thành mô-đun Python

TatSu tạo trình phân tích cú pháp PEG, nhưng ngữ pháp được xác định trong một biến thể của EBNF. Mặc dù thứ tự của các quy tắc quan trọng như thường lệ đối với ngữ pháp PEG. Vì vậy, nó thực sự là một loại chéo giữa hai. Biến thể này bao gồm hỗ trợ xử lý tính kết hợp và đơn giản hóa cây hoặc mô hình đã tạo [sẽ nói thêm về điều đó sau]. Có hỗ trợ cho quy tắc đệ quy trái, nhưng thử nghiệm

 ::= __expression__
6

Ngữ pháp TatSu không thể bao gồm các hành động, có thể được định nghĩa trong một lớp Python riêng biệt. Thay vào đó, bạn phải chú thích ngữ pháp nếu bạn muốn sử dụng một mô hình đối tượng thay cho các hành động ngữ nghĩa. Mô hình đối tượng là một cách để tách quá trình phân tích cú pháp khỏi thực thể được phân tích cú pháp. Về mặt thực tế, thay vì làm điều gì đó khi một quy tắc nhất định phù hợp, bạn sẽ làm điều gì đó khi một đối tượng nhất định được xác định. Đối tượng này có thể được xác định bởi nhiều quy tắc

Ví dụ trích xuất sau đây định nghĩa một đối tượng Multiply tương ứng với quy tắc phép nhân

 ::= __expression__
7

Sau đó, mô hình đối tượng có thể được sử dụng cho cái mà TatSu gọi là walker [về cơ bản là khách truy cập vào mô hình]

 ::= __expression__
8

Mô hình đối tượng tương tự cũng có thể được sử dụng để tạo mã, chẳng hạn để chuyển đổi định dạng này sang định dạng khác. Nhưng để làm được điều đó rõ ràng là bạn không thể sử dụng lại khung tập đi mà bạn phải xác định một lớp mẫu cho từng đối tượng

TatSu provides also. một công cụ để dịch ngữ pháp ANTLR, đầu ra dấu vết phức tạp và biểu diễn đồ họa của cây bằng pygraphviz. Ngữ pháp ANTLR có thể phải được điều chỉnh thủ công để tôn trọng các ràng buộc PEG

Tài liệu đã hoàn tất. nó hiển thị tất cả các tính năng, cung cấp các ví dụ và thậm chí có phần giới thiệu cơ bản về các khái niệm phân tích cú pháp, như AST

mắt sáp

Waxeye là trình tạo trình phân tích cú pháp dựa trên phân tích ngữ pháp biểu thức [PEG]. Nó hỗ trợ C, Java, Javascript, Python, Ruby và Scheme

Waxeye có thể tạo điều kiện thuận lợi cho việc tạo AST bằng cách xác định các nút trong ngữ pháp sẽ không được đưa vào cây được tạo. Điều đó khá hữu ích, nhưng một nhược điểm của Waxeye là nó chỉ tạo ra AST. Theo nghĩa là không có cách nào để tự động thực hiện một hành động khi bạn khớp một nút. Bạn phải duyệt và thực hiện những gì bạn cần theo cách thủ công

Một tác dụng phụ tích cực của giới hạn này là ngữ pháp dễ đọc và rõ ràng. Họ cũng độc lập với bất kỳ ngôn ngữ nào

 ::= __expression__
9

Một tính năng đặc biệt của Waxeye là nó cung cấp một số trợ giúp để kết hợp các ngữ pháp khác nhau lại với nhau và sau đó nó tạo điều kiện thuận lợi cho tính mô đun hóa. Chẳng hạn, bạn có thể tạo một ngữ pháp chung cho các mã định danh, thường giống nhau trong nhiều ngôn ngữ

Waxeye có một tài liệu tuyệt vời dưới dạng sách hướng dẫn giải thích các khái niệm cơ bản và cách sử dụng công cụ cho tất cả các ngôn ngữ mà nó hỗ trợ. Có một vài ngữ pháp ví dụ

Trình kết hợp trình phân tích cú pháp

Chúng cho phép bạn tạo một trình phân tích cú pháp bằng cách kết hợp các hàm khớp mẫu khác nhau, tương đương với các quy tắc ngữ pháp. Chúng thường được coi là phù hợp nhất cho các nhu cầu phân tích cú pháp đơn giản hơn

Trong thực tế, điều này có nghĩa là chúng rất hữu ích cho tất cả các vấn đề nhỏ về phân tích cú pháp mà bạn tìm thấy. Nếu nhà phát triển điển hình gặp sự cố quá phức tạp đối với một biểu thức chính quy đơn giản, thì các thư viện này thường là giải pháp. Nói tóm lại, nếu bạn cần xây dựng một trình phân tích cú pháp, nhưng bạn không thực sự muốn, thì một trình kết hợp trình phân tích cú pháp có thể là lựa chọn tốt nhất của bạn

Một số độc giả đã chỉ cho chúng tôi funcparserlib, nhưng chúng tôi đã quyết định không đưa nó vào vì nó đã không được quản lý trong một vài năm

phân tích cú pháp. py, Parsy và Pyparsing

Một thư viện kết hợp trình phân tích cú pháp Python phổ quát được lấy cảm hứng từ thư viện Parsec của Haskell

Về cơ bản, đó là phạm vi của tài liệu về Parsec. py. Mặc dù có một vài ví dụ. Nếu bạn đã biết cách sử dụng thư viện Parsec gốc hoặc một trong nhiều bản sao của nó, bạn có thể thử sử dụng nó. Nó trông không tệ, nhưng việc thiếu tài liệu là một vấn đề đối với người dùng mới

Parsy là một cách dễ dàng để kết hợp các trình phân tích cú pháp nhỏ, đơn giản thành các trình phân tích cú pháp lớn hơn, phức tạp hơn. Nếu nó có ý nghĩa gì với bạn, thì đó là thư viện trình kết hợp trình phân tích cú pháp đơn nguyên cho ngữ pháp LL[infinity] theo tinh thần của Parsec, Parsnip và Parsimmon

Parsy là một dự án bị bỏ dở trong một thời gian, nhưng gần đây nó đã được khôi phục và tiếp nhận bởi một người bảo trì mới và hiện nó đang ở trong tình trạng tốt. Trong số những thứ khác, nhà phát triển mới đã đưa dự án vào thực tiễn viết mã gần đây [e. g. , phạm vi thử nghiệm]

Dự án có thể không mạnh bằng bộ kết hợp trình phân tích cú pháp “sức mạnh công nghiệp” như Parsec [bản gốc], nhưng nó có một vài tính năng hay. Chẳng hạn, bạn có thể tạo một hàm tạo để tạo một trình phân tích cú pháp. Nó hiện yêu cầu Python 3. 3 trở lên, đây chỉ là vấn đề đối với những người bị mắc kẹt với Python 2

Dự án hiện có nhiều tài liệu, ví dụ và hướng dẫn. Ví dụ sau lấy từ tài liệu và cho biết cách phân tích một ngày

addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
0

Mô-đun pyparsing là một cách tiếp cận khác để tạo và thực thi các ngữ pháp đơn giản, so với. cách tiếp cận lex/yacc truyền thống hoặc sử dụng các biểu thức chính quy. Mô-đun pyparsing cung cấp một thư viện các lớp mà mã máy khách sử dụng để xây dựng ngữ pháp trực tiếp trong mã Python

Pyparsing là một phần mềm ổn định và trưởng thành được phát triển trong hơn 14 năm, có nhiều ví dụ, nhưng vẫn còn khó hiểu và thiếu tài liệu. Mặc dù Pyparsing mạnh ngang bằng với bộ kết hợp trình phân tích cú pháp truyền thống, nhưng nó hoạt động hơi khác một chút và việc thiếu tài liệu thích hợp này khiến nó trở nên khó chịu

Tuy nhiên, nếu bạn dành thời gian để tự học, ví dụ sau đây cho thấy có thể dễ dàng sử dụng

addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
1

Thư viện Python liên quan đến phân tích cú pháp

Python cũng cung cấp một số thư viện hoặc công cụ khác liên quan đến phân tích cú pháp

Phân tích cú pháp Python bên trong Python

Có một trường hợp đặc biệt có thể được quản lý theo cách cụ thể hơn. trường hợp bạn muốn phân tích mã Python bằng Python. Khi nói đến Python, lựa chọn tốt nhất là dựa vào trình thông dịch Python của riêng bạn

Việc triển khai tham chiếu tiêu chuẩn của Python, được gọi là CPython, bao gồm một vài mô-đun để truy cập vào phần bên trong của nó để phân tích cú pháp. tokenize, trình phân tích cú pháp và ast. Bạn cũng có thể sử dụng trình phân tích cú pháp trong trình thông dịch PyPy

Phân tích cú pháp với Biểu thức chính quy và Tương tự

Thông thường, bạn sử dụng các thư viện và công cụ phân tích cú pháp khi cụm từ thông dụng không đủ. Tuy nhiên, có một thư viện tốt cho Python hơn là có thể kéo dài tuổi thọ và tính hữu dụng của các biểu thức chính quy hoặc sử dụng các phần tử có độ phức tạp tương tự

Trình phân tích cú pháp dựa trên Biểu thức chính quy để trích xuất dữ liệu từ các ngôn ngữ tự nhiên [. ]

Thư viện này về cơ bản chỉ cung cấp cho bạn cách kết hợp các Biểu thức chính quy với nhau và nối chúng với một số hàm gọi lại trong Python

Reparse là một công cụ đơn giản tuy nhiên có thể khá hữu ích trong một số tình huống nhất định. Bản thân tác giả nói rằng nó đơn giản hơn nhiều và ít tính năng hơn PyParsing hoặc Parboiled

Ý tưởng cơ bản là bạn xác định các biểu thức chính quy, các mẫu mà chúng có thể kết hợp và các hàm được gọi khi tìm thấy một biểu thức hoặc mẫu. Bạn phải xác định các hàm trong Python, nhưng các biểu thức và mẫu có thể được xác định trong Yaml, JSON hoặc Python

Trong ví dụ này từ các biểu thức và mẫu tài liệu được xác định trong Yaml

addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
2

Các trường như Matches dành cho con người, nhưng có thể được sử dụng để kiểm tra bằng Reparse

addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
3

Một hàm ví dụ trong Python cho mẫu

addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
4

Tệp đặt mọi thứ lại với nhau

addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
5

Phân tích dữ liệu nhị phân. Xây dựng

Thay vì viết mã mệnh lệnh để phân tích một đoạn dữ liệu, bạn khai báo xác định cấu trúc dữ liệu mô tả dữ liệu của mình. Vì cấu trúc dữ liệu này không phải là mã nên bạn có thể sử dụng nó theo một hướng để phân tích dữ liệu thành các đối tượng Pythonic và theo hướng khác để xây dựng các đối tượng thành dữ liệu nhị phân

Và đó là nó. Xây dựng. Bạn có thể phân tích cú pháp dữ liệu nhị phân ngay cả với một số trình tạo trình phân tích cú pháp [e. g. ANTLR], nhưng Constuct làm cho nó dễ dàng hơn nhiều. Nó là một loại DSL kết hợp với bộ kết hợp trình phân tích cú pháp để phân tích các định dạng nhị phân. Nó cung cấp cho bạn rất nhiều trường để quản lý dữ liệu nhị phân. ngoài những cái rõ ràng [e. g. float, chuỗi, byte, v.v. ], có một số chuyên dùng để quản lý dãy trường [sequence], nhóm trường [struct] và một số câu lệnh điều kiện

Nó cũng cung cấp các chức năng có sẵn để điều chỉnh hoặc xác thực [kiểm tra] dữ liệu và gỡ lỗi bất kỳ vấn đề nào bạn tìm thấy

Như bạn có thể thấy trong ví dụ sau, nó khá dễ sử dụng

addition       ::= expression '+' expression
multiplication ::= expression '*' expression
// an expression could be an addition or a multiplication or a number
expression     ::= addition | multiplication |// a number
6

Có rất nhiều tài liệu và thậm chí nhiều ngữ pháp ví dụ cho các loại định dạng khác nhau, chẳng hạn như hệ thống tệp hoặc tệp đồ họa

Tóm lược

Bất kỳ ngôn ngữ lập trình nào cũng có một cộng đồng khác với những đặc thù của nó. Những khác biệt này vẫn còn ngay cả khi chúng ta so sánh các sở thích giống nhau giữa các ngôn ngữ. Chẳng hạn, khi chúng ta so sánh các công cụ phân tích cú pháp, chúng ta có thể thấy cách các nhà phát triển Java và Python sống trong một thế giới khác

Các công cụ và thư viện phân tích cú pháp cho Python phần lớn sử dụng các ngữ pháp rất dễ đọc và dễ sử dụng. Nhưng điều thú vị nhất là chúng bao gồm rất nhiều năng lực và trường hợp sử dụng. Dường như có một dòng công cụ không bị gián đoạn có sẵn từ biểu thức chính quy, chuyển qua Reparse để kết thúc bằng TatSu và ANTLR

Đọc thêm

Nếu bạn muốn hiểu cách sử dụng ANTLR, bạn có thể đọc bài viết của chúng tôi Hướng dẫn ANTLR Mega

Đôi khi điều này có nghĩa là nó có thể gây nhầm lẫn, nếu bạn là một chuyên gia phân tích cú pháp đến từ một ngôn ngữ khác. Bởi vì một số trình tạo trình phân tích cú pháp thực sự tạo trình phân tích cú pháp, nhưng chúng hầu hết diễn giải chúng trong thời gian chạy. Mặt khác, với Python, bạn thực sự có thể tìm thấy thư viện hoặc công cụ hoàn hảo cho nhu cầu của mình. Và để giúp bạn với điều đó, chúng tôi hy vọng rằng so sánh này hữu ích cho bạn

Cập nhật. vì ban đầu chúng tôi viết bài này nên chúng tôi cũng đã viết một hướng dẫn về xây dựng ngôn ngữ bằng textX và VSCode. bạn có thể tìm thấy nó ở đây. Ngôn ngữ dành riêng cho miền nhanh trong Python với textX

Phương pháp phân tích cú pháp trong Python là gì?

Mô-đun trình phân tích cú pháp cung cấp giao diện cho trình biên dịch mã byte và trình phân tích cú pháp nội bộ của Python . Mục đích chính của giao diện này là cho phép mã Python chỉnh sửa cây phân tích cú pháp của biểu thức Python và tạo mã thực thi từ đây.

Làm cách nào để sử dụng phân tích cú pháp trong Python?

Phân tích cú pháp văn bản ở định dạng phức tạp bằng biểu thức chính quy .
Bước 1. Hiểu định dạng đầu vào. 123. .
Bước 2. Nhập các gói cần thiết. Chúng ta sẽ cần mô-đun Biểu thức chính quy và gói gấu trúc. .
Bước 3. Định nghĩa biểu thức chính quy. .
Bước 4. Viết trình phân tích cú pháp dòng. .
Bước 5. Viết trình phân tích tệp. .
Bước 6. Kiểm tra trình phân tích cú pháp

phân tích cú pháp được sử dụng để làm gì?

Phân tích cú pháp là chia một câu hoặc một nhóm từ thành các thành phần riêng biệt, bao gồm định nghĩa về chức năng hoặc hình thức của từng phần . Định nghĩa kỹ thuật ngụ ý cùng một khái niệm. Phân tích cú pháp được sử dụng trong tất cả các ngôn ngữ lập trình cấp cao.

Chủ Đề