Автоматты аударма пайдаланылды

Ой архитектурасы 1 бөлім: Тануши-біз Python-ға рундарды оқуды қалай үйреттік

Бұл Tengri-Lang тілінің "капотының астына" қарайтын жаңа техникалық циклдің алғашқы мақаласы. Енді жоба GitHub-та ашық болғандықтан, біз оның практикалық іске асырылуының неден басталғанын егжей-тегжейлі көрсете аламыз. Бұл бөлімде біз компиляторымыздың алғашқы "шеберін" — Python-да енгізілген Лексерді талдаймыз.

Алдыңғы мақалаларда біз философия туралы көп айттық. Енді Код туралы сөйлесейік.

Go-да "жауынгерлік" компиляторды жасамас бұрын, біз идеяны тез тексеріп алуымыз керек еді. Машина негізінен біздің руникалық синтаксисті тани ала ма? Грамматикалық логика жұмыс істей ме? Мұндай тапсырмалар үшін Python-дан жақсы құрал жоқ. Ол бізге алғашқы "шебер" — "Тануши" (танушы) құруға мүмкіндік берді.

Оның жұмысы-сөйлемнің мағынасын толығымен зерттемей, жолды сырғытып, жеке сөздерді танитын оқырман сияқты.

Ең алдымен, біз жүйеде "танылған сөз" (токен) қандай болатынын анықтадық. Біз кодтың әр элементі туралы ақпаратқа арналған контейнер болып табылатын қарапайым Token класын жасадық.

  • token.py:

Python

# token.py
class Token:
    """Кодтың бір" танылған " элементін сипаттайды."""
    def __init__(self, type, value, line=1, column=1):
        self.type = type # токен түрі (мысалы, 'Runa_Const', 'Identifier')
        self.value = value # таңбалауыш мәні (мысалы,' Λ', 'san')
        self.line = line # жол нөмірі
        self.баған = баған # баған нөмірі

    def __repr__(self):
        """Басып шығару кезінде әдемі таңбалауышты шығару әдісі."""
        return f"Token({self.type}, '{self.value}')"

Әрбір таңбалауыштың түрі (түрі) және мәні (мәні) болады. Қарапайым және тиімді.

Енді — "танушының"өзі. Python-да оны Lexer класы ретінде енгізу өте ыңғайлы. Бұл сыныптың жүрегі-token_map сөздігі. Бұл сізге күрделі тексерулерсіз бірден кодтан таңбаны оның түріне сәйкестендіруге мүмкіндік береді.

  • lexer.py (негізгі фрагменттер):

Python

# lexer.py
from token import Token

class Lexer:
    """"Тануши" - танушы. Прототиптің соңғы нұсқасы."""
    def __init__(self, source_code):
        self.code = source_code
        self.position = 0
        # Бір таңбаны лезде тануға арналған толық сөздік
        self.token_map = {
            'Π': 'Runa_Func_Def', '—': 'Runa_Var',
            'Λ': 'Runa_Const',    'Y': 'Runa_If',
            'Q': 'Runa_True',     'I': 'Runa_False',
            '↻': 'Runa_Loop',     '→': 'Runa_Return',
            # ... және т б барлық рундар мен операторлар үшін
        }

Get_next_token негізгі әдісі ағымдағы таңбаны қарастырады және бірінші кезекте біздің сөздікте бар-жоғын тексереді. Егер солай болса, токен бірден жасалады.

Python

# get_next_token әдісінің үзіндісі lexer.py
def get_next_token(self):
    # ... (Бос орындар мен түсініктемелерді өткізіп жіберу)

    current_char = self.code[self.position]

    # Бір таңбалар сөздігін тексеру
    if current_char in self.token_map:
        token_type = self.token_map[current_char]
        token = Token(token_type, current_char)
        self.position += 1
        return token

    # Егер таңба сөздікте болмаса, оның саны бар-жоғын тексеріңіз
    if current_char.isdigit():
        return self._read_number()

    # Немесе бұл атау (идентификатор)болуы мүмкін
    if current_char.isalpha():
        identifier = self._read_identifier()
        return Token('Identifier', identifier)
    
    # ...

_read_identifier () әдісі таңбаларды әріптер немесе сандар болған кезде қатарынан оқиды және алынған сөзді қайтарады. Сондықтан tengri 5 жеке әріптен гөрі бір таңбалауыш ретінде танылады.

Python-дағы бұл қарапайым Лексер өзінің негізгі міндетін орындады: ол біздің руна және синтаксис жүйесінің өміршең екенін дәлелдеді. Ол біз оған жазған кодты дұрыс оқып, мағыналы бөліктерге бөле алды.

Осы растауды алғаннан кейін біз келесі деңгейге өту уақыты келгенін түсіндік. Нақты, жылдам және сенімді компилятор жасау үшін Сізге қолайлы құрал қажет болды. Сондықтан біздің тарихымыздағы келесі қадам осы дәлелденген логиканы "жауынгерлік" тілге — Go-ға көшіру болды.

Келесі мақалада біз компиляторымыздың жүрегімен танысамыз-тілдің барлық заңдылықтарын білетін" Құрастырушы " (талдаушы). Ол токендер ағынын алып, олардан керемет "ой Бәйтерегі" — ой Ағашын салады.

Бізбен бірге болыңыз және GitHub репозиторийін қараңыз!

Пікірлер 0

Кіру пікір қалдыру үшін