ساخت یک ترکیب کننده تجزیه کننده: تجزیه کننده های اساسی 1.

در پست قبلی پیاده سازی کلاس تجزیه کننده معرفی شده است و در این پست در مورد چند تجزیه کننده پایه خواهیم بود.
اگر فرآیند تجزیه به سادهترین مؤلفهها تقسیم شود، الگویی در این مؤلفهها پیدا میشود که نشاندهنده سادهترین عملیاتی است که تجزیهکننده میتواند انجام دهد، سپس میتوان آنها را ترکیب کرد تا الگوهای بزرگتر و پیچیدهتر را تشکیل دهند.
اول، ما به اساسی ترین و مهم ترین آنها نیاز داریم. تجزیه کننده برای مطابقت یک شخصیت.
را char
تجزیه کننده
با یک کاراکتر در رشته ورودی مطابقت دارد.
ما باید با استفاده از ما یک تجزیه کننده تعریف کنیم Parser
کلاس از قبل
const char = char =>
new Parser(state => {
// logic goes here
});
سپس، باید کاراکتر فعلی را با کاراکتر داده شده مطابقت دهیم. اینجا من استفاده خواهم کرد Regexp
مطابقت دادن
const char = char =>
new Parser(state => {
const match = new RegExp(`^${char}$`).test(state.charAt(state.index));
});
پس از آن، تجزیه کننده یک وضعیت جدید با موقعیت و وضعیت به روز شده برمی گرداند.
const char = char =>
new Parser(state => {
const match = new RegExp(`^${char}$`).test(state.charAt(state.index));
return state
.withStatus(1 << (!match + !match))
.withIndex(state.index + match);
});
char
یک “regex” را می گیرد که یک کاراکتر را به عنوان ورودی نشان می دهد. شخصیت فعلی را با آن مطابقت می دهد. سپس، بر اساس نتیجه، حالت جدیدی را برمیگرداند.
در پست های بعدی، وضعیت دقیقا چیست و تجزیه کننده های پیچیده تری را پیاده سازی خواهم کرد.
برای کد کامل نگاهی به
بیشتر از یک ترکیب کننده تجزیه کننده ساده.
بیشتر از یک ترکیب کننده تجزیه کننده ساده.
نصب با npm
.
npm i pari
استفاده و تجزیه کننده های اساسی
می توانید منبع را در آن بخوانید src/
. این خود مستند است و به راحتی قابل خواندن است.
اینجا یک است ساده بررسی اجمالی.
import {
char,
firstOf,
sequence,
zeroOrOne,
oneOrMore,
zeroOrMore
} from 'pari';
// the `char` parser matches one char.
// it take a `regex` that matches exactly one char.
const digit = char('[0-9]');
// `firstOf` parser returns the first match in a list of parsers.
const lowerCase = char('[a-z]');
const digitOrLwcase = firstOf([digit, lowerCase]);
// `sequence` parser matches a list of parsers in sequence.
const hex = char('[0-9a-fA-F]');
const byteHex = sequence([char('0'), char('x'), hex, hex]
…
ممنون که خواندید 😄