Định Nghĩa Parsing Là Gì?

Theo phương thức truyền thống cuội nguồn thì lúc lập trình viên smartphone khi tạo ra 1 ứng dụng mà cần liên quan đến tài liệu thì sẽ rất cần phải kèm theo một website developer để tạo ra 1 backend để hoàn toàn có thể kết nối cho cơ sơ dữ liệu cũng tương tự làm việc trên nó. Như vậy những lập trình viên cầm tay sẽ rất cần được đợi hóng backend với viết ra các service giao hàng cho các bước yêu cầu. Ví như cứ theo mô dường như vậy khi làm những gì cũng phải dựa vào vào website develop cùng khi cần chỉnh sửa gì thì chỉ có đợi backend và nhiều khi việc backend trả giá bán trị ra làm sao thì chỉ biết như vậy. Điều này khiến cho các lập trình sẵn viên mobile khó năng động và luôn phải hóng đợi. Điều này giờ đã có giải quyết bằng phương pháp các lập trình viên sản phẩm điện thoại sẽ thao tác trực tiếp sang một serice trung gian chuyên xử lý dự liệu là Parse. Trong nội dung bài viết này tôi xin phía dẫn những bạn một cách cơ bản làm quen thuộc với việc thực hiện Parse cho việc lập trình mang đến mobile (Android) với Backend (Php).

Bạn đang xem: Định nghĩa parsing là gì?

Trước lúc đi vào cụ thể tôi xin giới thiệu qua cho các bạn Parse là gì và cung cấp gì cho chúng ta. Bạn có thể vào trực tiếp home của Parse để hoàn toàn có thể tìm hiểu cũng tương tự đăng ký cho bản thân 1 tài khoản trọn vẹn miễn phí. Lúc vào home của Parse bạn cũng có thể thấy Parse hỗ trợ cho bọn họ 3 dịch vụ chính đó là:

Xử lý dữ liệu: Sẽ hỗ trợ cho ứng dụng của chúng ta lưu trữ dữ liệu, làm cho việc dễ dãi với cơ sở tài liệu đồng thời hoàn toàn có thể dễ dàng trao đổi dữ liệu từ server cho Parse.Push notification: Đây là một dịch vụ rất thuận tiện cho những nhà cải tiến và phát triển mobile do Parse cung cấp sẵn câu hỏi Push notification một cách thuận lợi và vô cùng đơn giản và dễ dàng (Tôi vẫn nói rõ hơn khi hướng dẫn làm việc với Android).Thống kê: Đây là dịch vụ để công ty phát triển nắm bắt được sự cải cách và phát triển của ứng dụng mình có tác dụng ra để sở hữu những phương án cách tân và phát triển tiếp theo.

Một điều đáng nhắc đến nữa là Parse hỗ trợ cho lập trình viên cỗ thư viện không hề thiếu cho gần như tổng thể các ngôn ngữ lập trình cho Mobile (i
Os, Android, Windows Phone, Unity, Xamarin, ..), mang đến web hay ứng dụng desktop (Os
X, Windows, Php, Unity,..). Thực thụ mọi bạn lập trình viên đều có thể làm việc với Parse do được cung cấp tài liệu hướng dẫn không thiếu cho từng ngữ điệu lập trình trên đây.

Để hợp tác vào có tác dụng quen với Parse tôi sẽ giới thiệu 1 yêu ước khá dễ dàng và đơn giản đó là sẽ tạo ra 1 Object là Blog gồm các trường là name - author - content. Các bước yêu mong phía backend (Php) thì nên quản trị được những Blog này và khi thêm mới sẽ nhờ cất hộ 1 thông tin về các client về Blog new được thêm này. Còn về phía Client (Android App) đang hiển thị các Blog và hiển thị thông báo và click vào đó thì vẫn ra list những Blog bao gồm cả Blog new được thêm.

Tạo ứng dụng mới tự Parse

Sau khi đk mới 1 tài khoản họ đã ban đầu có thể sử dụng Parse cho các bước của mình, thứ nhất ta yêu cầu tạo 1 ứng dụng mới. Sau khi App bắt đầu được tạo nên thì trên màn hình thống trị App ta vào phần Setting rồi vào phần Keys.

Tại đây ứng dụng sẽ sinh ra các Key đến mục đích làm việc của lập trình. Ví dụ như Backend Php sẽ buộc phải đến Application Id, REST API Key cùng Master Key, Android thì nên Application ID cùng Clinet Key

Backend

Để thiết lập và áp dụng Parse cho Php ta rất cần được cài Composer trước kế tiếp tạo 1 file là composer.json tất cả nội dung như sau:

"require": "parse/php-sdk" : "1.1.*" Sau đó tải về Parse bởi lệnh composer install . Sau khoản thời gian chạy ngừng thì ta sẽ sở hữu được thư viện Parse trong thư mục Vendor. Với ở đây để gia công việc cùng với Parse, tôi tạo thêm một file có tên là parse.php trong folder vendor vừa sinh ra. Ngôn từ file kia như sau

require "autoload.php";//Load tổng thể thư viện và các hàm của Parseuse ParseParse
Object;use ParseParse
Query;use ParseParse
ACL;use ParseParse
Push;use ParseParse
User;use ParseParse
Installation;use ParseParse
Exception;use ParseParse
Analytics;use ParseParse
File;use ParseParse
Cloud;use ParseParse
Client;class Parse //Để chạy được Parse thì cần 3 thông số được nhập ở dưới đây là app_id, rest_id cùng master_id private $_app_id = ""; private $_rest_key = ""; private $_master_key = ""; private $_object_name = ""; //Khởi tạo thành class với thương hiệu của Object, tên Object hoàn toàn có thể để trống public function __construct($s
Object = "") $this->_object_name = $s
Object; $this->init(); //Hàm khởi tạo ra Parse public function init() Parse
Client::initialize($this->_app_id, $this->_rest_key, $this->_master_key); /** Hàm gửi push notification đến rất nhiều máy di động cầm tay có áp dụng đến Parse $s
Message: Là nội dung thông tin gửi đến những máy client. Parse bao gồm cung cấp cho người dùng gửi push notification mang đến những người dùng chọn thanh lọc và có 2 cách tinh lọc là Chanel và Advance Targeting. Ở đấy là dùng cách Advancer Targetting với việc gửi cho toàn bộ các trang bị */ public function send
Push
Notification($s
Message) $data = array("alert" => $s
Message); $this->init(); $query = Parse
Installation::query(); Parse
Push::send(array( "where" => $query, "data" => $data )); /** Hàm thêm dữ liệu vào object, tài liệu truyền vào là những mảng với key là filed cùng value là cực hiếm còn chuyển vào Hàm trả về id của object vì Parse có mặt */ public function add($a
Vals = <>) $o
Object = new Parse
Object($this->_object_name); foreach ($a
Vals as $s
Field => $val) $o
Object->set($s
Field, $val); try $o
Object->save(); return $o
Object->get
Object
Id(); catch (Parse
Exception $ex) return false; /** Hàm lấy toàn bộ dữ liệu của 1 Object */ public function get
List() $query = new Parse
Query($this->_object_name); $results = $query->find(); return $results; /** Hàm lấy tổng thể thông tin của một Item vừa vào Id của Parse đã cung ứng lúc thêm new Hàm trả về là 1 Object */ public function get
Item
By
Id($s
Object
Id) $query = new Parse
Query($this->_object_name); return $query->get($s
Object
Id); /** Hàm cập nhật dữ liệu vào object, dữ liệu truyền vào là những mảng với key là filed cùng value là cực hiếm còn gửi vào Hàm trả về cống phẩm với thông tin mới update */ public function update($a
Vals, $s
Object
Id) if ($o
Object = $this->get
Item
By
Id($s
Object
Id)) foreach ($a
Vals as $s
Field => $val) $o
Object->set($s
Field, $val); $o
Object->save(); return $o
Object->fetch(); /** Xóa 1 công trình từ database cùng với id của Parse */ public function delete($s
Object
Id) if ($o
Object = $this->get
Item
By
Id($s
Object
Id)) $o
Object->destroy(); return true; Giờ khi cần thao tác làm việc với Parse ta chỉ cần thêm mẫu require "vendor/parse.php";. Theo yêu ước của đề bài xích đưa ra thì họ sẽ đề nghị 2 trang là screen danh sách các Blog cùng xóa từng Blog và màn hình hiển thị thứ 2 cho việc thêm mới, sửa xóa Blog. Tương ứng với 2 trang này tôi tạo nên 2 file index.php và add.php.

File index.php

Trang này sẽ thực hiện 2 tác dụng là hiển thị toàn thể Blog đã đạt thêm và, với mỗi Blog sẽ sở hữu được 2 đường link để sửa cùng xóa từng Blog, và thêm một đường liên kết để thêm mới Blog. Để xóa 1 Blog thì sẽ buộc phải gửi đến link của file này với vươn lên là là delete có giá trị là id của Blog này đem từ dữ liệu trả về từ bỏ Parse và sau khoản thời gian xóa hoàn thành thì hiển thị danh sách mới. Giống như link nhằm update Blog này đã sang tệp tin app.php với id là Id của Blog này.

Tại đây ta có thể mỗi Item nhưng Parse trả về hồ hết ở dạng Object và hy vọng lấy các trường trong đó ta sử dụng đến hàm get(tên trường), tuy vậy có 3 hàm đặc trưng riêng của Parse đó là

Hàm get
Object
Id() là để mang id của Item.Hàm get
Updated
At() mang thời điểm update gần nhất.Hàm get
Created
At() lấy thời gian tạo ra Item.

//Load parse classrequire "vendor/parse.php";//Khởi tạo Object Blog$o
Blogs = new Parse("Blog");//Kiểm tra xem tất cả truyền trở thành delete hay không và lưu giá trị này vào thay đổi $i
Delete
Idif (isset($_GET<"delete">) && $i
Delete
Id = $_GET<"delete">) //Xóa Blog khỏi database $o
Blogs->delete($i
Delete
Id); //Quay lại trang index.php header("location: index.php");$a
Blogs = $o
Blogs->get
Blogs as $a
Blog) { ?> li> ?php echo $a
Blog->get("name");?> a href="add.php?id=$a
Blog->get
Object
Id() ?>">Edit/a> a href="?delete=$a
Blog->get
Object
Trang này thực hiện công dụng thêm mới và sửa một Blog. Sự khác nhau giữa thêm mới và sửa là lúc gửi đi sẽ có thêm biến chuyển Id trên đường dẫn gửi mang đến file này. Và sau thời điểm thêm mới thành công sẽ thêm 1 push notification với nội dung thông báo có một Blog new và có tên của Blog. Và sau khoản thời gian thực hiện tại thì chuyển về trang index.php

require "vendor/parse.php";//Load class Parse$o
Blog = new Parse("Blog");// kiểm tra xem tất cả biến Id gửi đến không.if (isset($_GET<"id">) && $i
Id = $_GET<"id">) //Lấy thông tin của 1 Blog theo Id gửi mang lại $a
Blog = $o
Blog->get
Item
By
Id($i
Id);//Kiểm tra xem tất cả phải gửi bao gồm gửi dữ liệu từ khung lên không?if ($a
Vals = $_POST) { //Kiểm tra xem tất cả phải đang sửa đổi if (isset($i
Id)) //Cập nhật BLog $o
Blog->update($a
Vals, $a
Vals<"id">); else { //Thêm mới BLog $o
Blog->add($a
Vals); //Gửi pushs notification $o
Blog->send
Push
Notification("Parse have new blog "" . $a
Blog)) echo $a
Blog->name;?>"> ?php if (isset($a
Blog)) ?> input đầu vào type="hidden" name="id" value="$a
Blog->get
Object
Id(); ?>"> ?php ?> /td> /tr> tr> td>Author :/td> td>input name="author"value="$a
Blog)) echo $a
Blog->author;?>">/td> /tr> tr> td>Content :/td> td>input name="content"value="$a
Blog)) echo $a

compile "com.parse.bolts:bolts-android:1.+" compile "com.parse:parse-android:1.+"Sau khi thêm mẫu đó thì để liên kết được mang đến Parse thì bạn phải chạy đoạn code này:

Parse.initialize(this, "app_id", "client_id"); Parse
Installation.get
Current
Installation().save
In
Background();Và đoạn code này họ cần chuyển vào file Application của apk vì Plugin Parse chỉ việc được load 1 lần duy nhất. Và để load độc nhất 1 lần bọn họ cần tạo 1 file cùng extends đến class Application của app android và trong file Android
Manifest.xml khai báo thêm tên file class đó. Cụ thể ta sẽ tạo nên 1 tệp tin là Parse
Application.java với câu chữ như sau:

package com.example.framgianguyenquanghuy.parsesample;import android.app.Application;import com.parse.Parse;import com.parse.Parse
Application extends Application {

Thứ sáu, ngày 26 tháng 11 năm 2021

Bạn có khi nào thắc mắc rằng nguyên nhân các trình biên dịch như C, Java, Rust lại có thể hiểu được gần như file source code hay vì sao một loại cú pháp nửa JS nửa HTML lại hoàn toàn có thể chạy được trên các trình chăm nom không? bạn có bao giờ tự hỏi làm chũm nào nhưng JS lại có rất nhiều biến thể do vậy và những công thế như Typescript tốt Babel lại có thể làm cho hầu như đoạn code React, Typescript lại hoàn toàn có thể chạy được trên trình duyệt.


Trong thế giới lập trình có rất nhiều ngôn ngữ lập trình và hình như cũng vĩnh cửu những lao lý dùng để đổi khác từ ngữ điệu này sang ngữ điệu khác, những phần mềm như vậy được điện thoại tư vấn là các compiler tốt trình biên dịch.

Những trình biên dịch mà lại đa số chúng ta đều biết như Pascal tốt C thực hiện việc chuyển ngữ điệu bậc cao sang ngữ điệu bậc thấp là những kí tự 0/1. Đơn giản vì bọn họ dễ đọc ngôn ngữ bậc cao trong những lúc máy móc thích ngôn ngữ bậc phải chăng hơn.

Tương tự, Typescript có cấu trúc ngữ pháp ngặt nghèo hơn Javascript dẫu vậy nó không được cung cấp bởi các trình duyệt. Vì đó, các lập trình viên phải tạo ra các giải pháp giúp biến đổi Typescript code quý phái Javascript code - transpiler.

Cả hai qui định trên đều sở hữu điểm chung là biến đổi code tự dạng này sang trọng dạng khác cơ mà vẫn giữ lại được xúc tích và ngắn gọn của xây dựng viên.

Hình bên dưới mô tả những thành phần cơ phiên bản của một compiler/transpiler:


*
Cấu trúc cơ phiên bản của compiler/transpiler

Để gồm thể thay đổi dễ dàng thân hai ngôn ngữ, các compiler/transpiler phải trình diễn được dưới và một dạng kết cấu dữ liệu - bọn chúng được gọi là Abstract Syntax Tree giỏi AST.

Như chúng ta có thể thấy, source code sau thời điểm được chuẩn hoá với phân bóc tách từ vựng vày lexical sẽ được parser chuyển thành cấu trúc ngữ pháp mà hoàn toàn có thể biểu diễn được sinh hoạt cả ngôn từ nguồn và ngôn từ đích - kết cấu này call là Abstract Syntax Tree. Sau đó, AST được gửi qua translator để đưa hoá thành ngữ điệu đích.

Trong compiler/transpiler có không ít thành phần, tuy thế trong phạm vi bài viết này, bản thân chỉ ra mắt một thành phần luôn luôn phải có giúp mang đến chúng rất có thể hiểu được ngữ pháp của source code, sẽ là parser.

Parser là gì?

Parser là một trong những công ráng dùng để chuyển đổi chuỗi các token sang một Abstract Syntax Tree. Tất cả hai nhiều loại parser: bottom-up cùng top-down.

Với bottom-up parser, AST được build up từ dưới lên với ngược lại, top-down parser vẫn build cây từ bên trên xuống.

Xem thêm: Nghĩa Của Từ Option Là Gì? Cách Giao Dịch Option Trên Các Thị Trường Tài Chính

Ở đây, mình đưa ra một ví dụ đơn giản dễ dàng để giải thích cũng như demo đến hai dạng parser này như sau:

Có một biểu thức toán học bao gồm các một số loại phần tử: số, các phép toán cùng (+), trừ (-), nhân (*), phân chia (/) và hai vết '(' ')'. Hãy đưa biểu thức đó thành một AST và thay đổi nó quý phái một lịch trình MIPS.

Bottom-up parser

Một biểu thức toán học có khá nhiều cách biểu diễn và cách phổ biến nhất là dạng trung tố (toán tử nằm trong lòng hai toán hạng):

1 + 2 * (1 + 3)

Ngoài ra, còn một cách biểu diễn khác là dạng hậu tố (toán tử ở sau nhì toán hạng):

1 2 1 3 + * +

Với dạng hậu tố, chúng ta có thể dễ dàng đổi mới chúng thành một AST với một stack với thuật toán như sau:

Đọc token từ danh sách những token.

Nếu token là toán hạng, sinh sản node mang đến token kia và cung ứng stack và gửi sang cách 4.

Nếu token là toán tử, mang hai node vào stack, chế tạo ra node bắt đầu cho toán tử với nhị node con trái cùng con buộc phải lần lượt là hai node vừa mang ra và đẩy node new tạo vào stack.

Nếu không duyệt hết list token, gửi đến bước 1. Ngược lại, trả về bộ phận top của stack.

Vậy làm sao để trường đoản cú biểu thức trung tố đưa sang biểu thức hậu tố? Câu vấn đáp là giải mã kí pháp ba Lan được thiết đặt với một stack như sau:

Đọc token từ bỏ danh sách những token.

Nếu là toán hạng, đẩy vào list output. Ngược lại, đưa đến bước 6.

Nếu là toán tử, lấy top token cho vào output đến khi nào toán tử đó gồm độ ưu tiên to hơn hoặc chạm chán dấu '(' và đẩy toán tử đó vào stack. Ngược lại, gửi đến cách 6.

Nếu là vết '(', đẩy vào stack. Ngược lại, đưa đến cách 6.

Nếu là vệt ')', lấy toàn bộ những thành phần trong stack bỏ vào output mang lại khi chạm chán dấu ngoặc '('. Ngược lại, đưa đến cách 6.

Nếu chưa duyệt hết danh sách token, gửi đến cách 1. Ngược lại, trả về danh sách output.

Để về tối ưu, bạn có thể gộp hai công đoạn này và ko cần chuyển hẳn qua dạng biểu thức hậu tố làm cho trung gian. Bọn họ sẽ chuyển trực tiếp từ bỏ biểu thức trung tố sang AST với 2 stack.

Bạn hoàn toàn có thể tham khảo source code của bản thân ở đây: bottom-up parser


*
AST của biểu thức: (1 + 1 * 2) / (3 + 5 * 8 - 13)

Top-down parser

Ở phương pháp này, họ sẽ thể hiện một biểu thức xấp xỉ dạng các rules (cú pháp) bằng một meta language, ở chỗ này mình sẽ sử dụng Backus Naur khung hay BNF.

::= | "(" ")" | ::= "+" | "-" | "*" | "/" ::= <1-9> <0-9>*Điểm mạnh mẽ của BNF là nó rất có thể mô tả các cấu tạo đệ quy một cách tiện lợi và nó cũng là 1 trong công cố ưa thích của các nhà khoa học máy tính khi họ muốn mô tả cú pháp ngôn ngữ của họ. Ví dụ phía trên là phiên bản mô tả ngữ điệu C bởi BNF

Bây giờ, họ sẽ chuyển các rule trường đoản cú BNF sang các hàm của cục parser một cách dễ ợt như sau:

def number(): global token expect(Token
Type.OPERAND) next_token() expect(Token
Type.OPERATOR, Token
Type.CLOSE_BRACKET)def operator(): global token expect(Token
Type.OPERATOR) next_token() expect(Token
Type.OPERAND, Token
Type.OPEN_BRACKET)def expression(): global token if token.token_type == Token
Type.OPERAND: number() elif token.token_type == Token
Type.OPEN_BRACKET: next_token() expression() expect(Token
Type.CLOSE_BRACKET) next_token() if is_break(): return # case: ... operator() expression()Bạn có thể test BNF cùng với BNF Playground

Với biện pháp mô tả như vậy, bạn cũng có thể dễ dàng soát sổ cú pháp của source code, đồng thời tạo ra AST từ source một phương pháp dễ dàng.

Hơn nữa, với cách thực hiện như trên, người ta rất có thể hoàn toàn sinh ra bộ parser mà không cần viết code bởi tay. Tất cả những gì bạn cần phải có là một bạn dạng mô tả cú pháp mang đến ngôn ngữ của bạn và gửi qua cỗ parser generator là bạn sẽ có source code parser của ngữ điệu đó.

Các phần mềm như vậy xuất hiện từ khá lâu như GNU Bison tuyệt Yacc.

Với biểu thức ban đầu, mình có thể sinh ra đoạn MIPS code như sau:

mov $0 1mul $0 2mov $1 1add $1 $0mov $2 5mul $2 8mov $3 $2sub $3 13mov $4 3add $4 $3mov $5 $1div $5 $4ret $5Đoạn code được sinh nghỉ ngơi trên còn khá nhiều vấn đề như sử dụng quá nhiều biến không thiết nên trong compiler/transpiler thường sẽ có một cỗ optimizer để buổi tối ưu hoá khi sinh source code.

Toàn bộ code chủng loại ở trên chúng ta cũng có thể xem và chạy thử chúng ở đây https://github.com/magiskboy/ast-tut

Ứng dụng của parser

Parser là thành phần luôn luôn phải có trong các ứng dụng compiler như GNU C, Rust, Java,... Nó cũng mở ra trong các transpiler như Babel, Typescipt Compiler hay SWC.

Để áp dụng chúng cùng thực tế, mình có tình huống sau:

Cho đoạn code Typescript mặt dưới:

function fib(n: number): number if (n 2) return n; return fib(n - 2) + fib(n - 1);console.log("foo");const n = 10;const ret = fib(n);console.log(`fib($n) = $ret`);Script sau giúp xoá bỏ các lệnh console.log ra khỏi source code làm việc trên trước khi chúng được transpile lịch sự Javascript:

import ts, Syntax
Kind from "typescript";function transformer
Factoryextends ts.Node>(): ts.Transformer
Factory return (context) => const factory = context; const transform: ts.Visitor = (node) => if ( node.kind === Syntax
Kind.Call
Expression && (node as ts.Call
Expression).expression.get
Text() === "console.log" ) return factory.create
Void
Expression(factory.create
Numeric
Literal("0")); return ts.visit
Each
Child(node, (node) => transform(node), context); ; return (node: T) => ts.visit
Node(node, transform); ;const result = ts.transpile
Module(source, compiler
Options: module: ts.Module
Kind.Common
JS , transformers: before: Factory()> ,);console.log(result.output
Text);Đoạn code trên sẽ chũm thế toàn bộ lời hotline console.log thành void 0 trước khi chuyển bọn chúng sang Javascript

function fib(n: number): number if (n 2) return n; return fib(n - 2) + fib(n - 1);void 0;const n = 10;const ret = fib(n);void 0;Ngoài ra, bạn có thể visualize AST của đoạn code Typescript bất kì với TS AST Viewer

Tóm lại, trong bài viết này, mình đã giới thiệu cho chính mình về thành phần tương tự như cách một compiler/transpiler làm cho việc tương tự như mô tả hai cách thức để tạo thành bộ parser cho bản thân. Bản thân hi vọng bài viết này ít nhiều có lợi cho chúng ta và giúp cho bạn hiểu thêm về quy trình parsing. Bye bye!!

Leave a Reply

Your email address will not be published. Required fields are marked *