Uczymy się czym jest – w teorii – analiza leksykalna. Później taki lexer sobie napiszemy. Do dzieła.

Okej, weźmy przykład takiej frazy, funkcję lexerPrint będziemy musieli na razie sobie wyobrazić:

$phrase = '"hello world"';

lexerPrint($phrase);

// [
//     'phrase' => [
//         ['T_TEXT' => 'hello world'],
//     ] 
// ]

Ok, następny przykład:

$phrase = 'echo "hello world"';

lexerPrint($phrase);

// [
//     'phrase' => [
//         ['T_KEYWORD' => 'echo'],
//         ['T_TEXT' => 'hello world'],
//     ] 
// ]

Ok, lecimy dalej:

$phrase = '2 + 2';

lexerPrint($phrase);

// [
//     'phrase' => [
//         ['T_NUMERIC' => '2'],
//         ['T_OPERATOR' => '+'],
//         ['T_NUMERIC' => '2'],
//     ] 
// ]

Ok, jeszcze jeden przykład:

$phrase = 'echo "Hello " . $name';

lexerPrint($phrase);

// [
//     'phrase' => [
//         ['T_KEYWORD' => 'echo'],
//         ['T_TEXT' => 'Hello '],
//         ['T_OPERATOR' => '.'],
//         ['T_VARIABLE' => '$name'],
//     ] 
// ]

To, co tu widzimy to pierwszy, wcale nie najtrudniejszy etap zamiany języka programowania (dowolnego, może być nasz własny) na wykonywane instrukcje. Dopiero potem zaczynają się schody, gdy trzeba napisać AST (Abstract Syntax Tree).

Generalnie napisanie własnego lexera trudne nie jest. Idę o zakład, że napisanie mechanizmu ASI (automatic semicolon insertion) jest trudniejsze niż własny lexer.

Dlatego lexera jeszcze sobie napiszemy. Będzie to wymagać dobrej znajomości wyrażeń regularnych.

Na razie pomyślmy jakie tokeny będą nam potrzebne:

  • tokeny tekstowe – dowolne znaki wewnątrz „”
  • tokeny numeryczne – numeryczne wartości nieoplecione w cudzysłów
  • tokeny zmiennych – na przykład tekst bez spacji zaczynający się od znaku $ (tak to działa w PHP)
  • tokeny operatorów – + – . i inne takie, operatory mogą mieć wiele znaków
  • tokeny grupowania – nawiasy i inne takie do literałów
  • tokeny spacji – białe znaki
  • tokeny logiczne – prawda/fałsz jakkolwiek je chcemy nazywać
  • tokeny keywordów – słówka kluczowe zastrzeżone w języku programowania (jak echo w PHP albo function)

Napisanie własnego AST i języka programowania będzie trudne, sam tego jeszcze nie robiłem. W ramach treningu przed tym polecam ćwiczenia:

  • walidacja nawiasów (problem z gatunku stosowych)
  • Reverse-Polish Notation conversion
  • Drzewa i operacje na drzewach (struktura danych)

Napisanie własnego lexera trudne nie jest i jak tylko znajdę czas napiszemy go sobie razem.