برنامه نویسی

ساخت یک ترکیب کننده تجزیه کننده: تجزیه کننده های اساسی 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]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ممنون که خواندید 😄

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا