πŸ”§ Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ язык программирования Π² Python? 🐍

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ язык программирования Π½Π° Python, Π²Π°ΠΌ понадобится ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ синтаксис ΠΈ сСмантику языка. Π’ΠΎΡ‚ простыС шаги: 1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ языка: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° для распознавания Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… конструкций ΠΊΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, выраТСния ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

    # ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ языка программирования
    statement = "if" condition ":" block
    
2. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€: ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ тСкст Π½Π° Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, числа ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹.

    import re

    # ΠŸΡ€ΠΈΠΌΠ΅Ρ€ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² сравнСния
    def tokenize(input):
        tokens = re.findall(r"\w+|==|<=|>=|<|>", input)
        return tokens
    
3. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€: ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт, соотвСтствуСт Π»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ структурС языка.

    # ΠŸΡ€ΠΈΠΌΠ΅Ρ€ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° if
    def parse(tokens):
        if tokens[0] == "if" and tokens[1] == "(" and tokens[3] == ")" and tokens[4] == ":":
            return True
        else:
            return False
    
4. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ компилятор: ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт ΠΈΠ»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠ΄, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° опрСдСлСниях языка.

    # ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° if
    def interpret(code):
        tokens = tokenize(code)
        if parse(tokens):
            # Π’Π°Ρˆ ΠΊΠΎΠ΄ для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° if
            pass
        else:
            # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дСйствия
            pass
    
Π­Ρ‚ΠΎ основныС шаги для создания языка программирования Π½Π° Python. Однако, созданиС ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ языка - это слоТная Π·Π°Π΄Π°Ρ‡Π°, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ знания Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, лСксичСского ΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ умСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ компиляциСй ΠΊΠΎΠ΄Π°.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ язык программирования Π½Π° Python

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ собствСнного языка программирования ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ для программистов. Python прСдоставляСт Π½Π°ΠΌ ΠΌΠΎΡ‰Π½Ρ‹Π΅ инструмСнты для создания Ρ‚Π°ΠΊΠΎΠ³ΠΎ языка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим ΠΏΠΎΡˆΠ°Π³ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ создания простого языка программирования Π½Π° Python.

Π¨Π°Π³ 1: ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ языка

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π² создании языка программирования - ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° опрСдСляСт ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ синтаксис языка. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PLY (Python Lex-Yacc) для опрСдСлСния Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ для языка программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния ΠΈ вычитания, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


import ply.lex as lex
import ply.yacc as yacc

# ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²
tokens = (
    'NUMBER',
    'PLUS',
    'MINUS',
)

# ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ» для Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²
t_PLUS = r'\+'
t_MINUS = r'-'

def t_NUMBER(t):
    r'\d+'
    t.value = int(t.value)
    return t

# Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ Ρ‚Π°Π±ΡƒΠ»ΡΡ†ΠΈΡŽ
t_ignore = ' \t'

# ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок
def t_error(t):
    print(f"ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ символ: {t.value[0]}")
    t.lexer.skip(1)

# ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ
def p_expression_plus(p):
    'expression : expression PLUS term'
    p[0] = p[1] + p[3]

def p_expression_minus(p):
    'expression : expression MINUS term'
    p[0] = p[1] - p[3]

def p_expression_term(p):
    'expression : term'
    p[0] = p[1]

def p_term_number(p):
    'term : NUMBER'
    p[0] = p[1]

def p_error(p):
    print("БинтаксичСская ошибка")

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ парсСр
lexer = lex.lex()
parser = yacc.yacc()

# Π’Π²ΠΎΠ΄ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для Π°Π½Π°Π»ΠΈΠ·Π°
input_expression = "3 + 4 - 2"

# АнализируСм Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
result = parser.parse(input_expression)
print(f"Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: {result}")
    

Π¨Π°Π³ 2: ЛСксичСский Π°Π½Π°Π»ΠΈΠ·

Для лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PLY, которая позволяСт Π½Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° для ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ опрСдСляСм Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ для чисСл, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² слоТСния ΠΈ вычитания.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ ошибок. Ѐункция t_NUMBER ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ числа ΠΈΠ· строки Π² Ρ†Π΅Π»ΠΎΠ΅ число ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½. Ѐункция t_error вызываСтся, Ссли ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ символ.

Π¨Π°Π³ 3: БинтаксичСский Π°Π½Π°Π»ΠΈΠ·

БинтаксичСский Π°Π½Π°Π»ΠΈΠ· выполняСтся с использованиСм модуля yacc ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ PLY. ΠœΡ‹ опрСдСляСм ΠΏΡ€Π°Π²ΠΈΠ»Π° для Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ языка, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ слоТСниС ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. КаТдоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ соотвСтствуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ синтаксичСскому элСмСнту языка.

Π¨Π°Π³ 4: Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°

ПослС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ выполняСм арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с числами ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли ΠΏΠΎΡˆΠ°Π³ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ создания простого языка программирования Π½Π° Python. ΠœΡ‹ использовали Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PLY для опрСдСлСния Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ языка, лСксичСского ΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ выполнСния ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°.

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ творчСскими ΠΈ экспСримСнтируйтС с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ элСмСнтами ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ вашСго собствСнного языка программирования. Π–Π΅Π»Π°ΡŽ Π²Π°ΠΌ ΡƒΠ΄Π°Ρ‡ΠΈ!

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Create a Programming Language and Learn Advanced Python - Full Course

Make YOUR OWN Programming Language - EP 1 - Lexer

[1] The Lexer - Creating Your OWN Coding Language!

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

πŸ” Как ввСсти индСкс числа Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅? ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π°Ρ инструкция для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…!

πŸ” Как ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ python? ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ способ для опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° изобраТСния Π² Python

πŸ”₯ Как ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² SQL Python: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ руководство πŸ“–

πŸ”§ Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ язык программирования Π² Python? 🐍

Как ΠΏΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Python ΠΏΠ°ΠΊΠ΅Ρ‚: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ руководство с πŸ”„πŸ

πŸ”΄ Как ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚ΡŒ число Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΠΎΡ€ΠΌΠ°Ρ‚: пошаговоС руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π² Python? Π£Π·Π½Π°ΠΉ всю ΡΡƒΡ‚ΡŒ!