Korzystanie z „ Zasady, techniki i narzędzia kompilatorów, wydanie 2-gie ” (WorldCat) autorstwa Aho, Lam, Sethi i Ullman, AKA the Purple Dragon Book ,
Lexeme str. 111
Leksem to sekwencja znaków w programie źródłowym, która pasuje do wzorca dla tokenu i jest identyfikowana przez analizator leksykalny jako instancja tego tokenu.
Żeton str. 111
Token to para składająca się z nazwy tokena i opcjonalnej wartości atrybutu. Nazwa tokena to abstrakcyjny symbol reprezentujący rodzaj jednostki leksykalnej, np. Określone słowo kluczowe lub sekwencja znaków wejściowych oznaczająca identyfikator. Nazwy tokenów to symbole wejściowe przetwarzane przez parser.
Wzór str. 111
Wzorzec to opis formy, jaką mogą przyjąć leksemy tokena. W przypadku słowa kluczowego jako tokenu, wzorzec jest po prostu sekwencją znaków, które tworzą słowo kluczowe. W przypadku identyfikatorów i niektórych innych tokenów wzorzec jest bardziej złożoną strukturą, do której pasuje wiele ciągów.
Rysunek 3.2: Przykłady tokenów str.112
[Token] [Informal Description] [Sample Lexemes]
if characters i, f if
else characters e, l, s, e else
comparison < or > or <= or >= or == or != <=, !=
id letter followed by letters and digits pi, score, D2
number any numeric constant 3.14159, 0, 6.02e23
literal anything but ", surrounded by "'s "core dumped"
Aby lepiej zrozumieć tę relację do leksera i parsera, zaczniemy od parsera i cofniemy się do wejścia.
Aby ułatwić projektowanie analizatora składni, parser nie pracuje bezpośrednio z danymi wejściowymi, ale pobiera listę tokenów wygenerowaną przez lekser. Patrząc na kolumnie token rysunku 3.2 widzimy żetonów, takie jak if
, else
, comparison
, id
, number
i literal
; to są nazwy żetonów. Zazwyczaj w przypadku leksera / parsera token jest strukturą, która przechowuje nie tylko nazwę tokenu, ale także znaki / symbole, które tworzą token oraz pozycję początkową i końcową ciągu znaków, które tworzą token, z pozycja początkowa i końcowa używana do zgłaszania błędów, podświetlania itp.
Teraz lekser wprowadza znaki / symbole i używając reguł leksera konwertuje wprowadzane znaki / symbole na tokeny. Teraz ludzie, którzy pracują z lexerem / parserem, mają własne słowa dla rzeczy, których często używają. To, o czym myślisz jako sekwencja znaków / symboli, które tworzą token, jest tym, co ludzie używający leksera / parsera nazywają leksemem. Kiedy więc zobaczysz leksem, pomyśl o sekwencji znaków / symboli reprezentujących token. W przykładzie porównawczym sekwencja znaków / symboli może być różnymi wzorami, takimi jak <
lub >
lub else
lub 3.14
itp.
Innym sposobem myślenia o relacji między nimi jest to, że token jest strukturą programistyczną używaną przez parser, która ma właściwość zwaną leksemem, która przechowuje znak / symbole z wejścia. Jeśli spojrzysz na większość definicji tokena w kodzie, możesz nie widzieć leksemu jako jednej z właściwości tokena. Dzieje się tak, ponieważ token będzie prawdopodobnie utrzymywał początkową i końcową pozycję znaków / symboli, które reprezentują token i leksem, sekwencję znaków / symboli można wyprowadzić z pozycji początkowej i końcowej w razie potrzeby, ponieważ dane wejściowe są statyczne.