Jaka jest różnica między tokenem a leksem?

W konstrukcji kompilatora przez Aho Ullmana i Sethi, podano, że ciąg znaków wejściowych programu źródłowego jest podzielony na sekwencje znaków, które mają logiczne znaczenie i są znane jako tokeny i leksemy są sekwencjami, które składają się na token, więc jaka jest podstawowa różnica?

Author: Aurora0001, 2013-02-19

10 answers

Using " Compilers Principles, Techniques, & Tools, 2nd Ed." (WorldCat) by Aho, Lam, Sethi i Ullman, AKA Purpurowa Księga,

Lekseme pg. 111

Leksem jest sekwencja znaków w programie źródłowym, które pasuje do wzorca dla tokena i jest identyfikowany przez leksykalny analizator jako instancja tego tokena.

Token pg. 111

Token to para składająca się z nazwy tokena i atrybut opcjonalny wartość. Nazwa tokenu jest abstrakcyjnym symbolem reprezentującym rodzaj jednostka leksykalna, np. konkretne słowo kluczowe lub Sekwencja wprowadzania znaki oznaczające identyfikator. Nazwy tokenów są wejściami symbole przetwarzane przez parser.

Wzór pg. 111

Wzorzec jest opisem postaci, którą leksemowie tokenu mogą weź. W przypadku słowa kluczowego jako tokena, wzór jest tylko sekwencja znaków tworzących słowo kluczowe. Dla identyfikatorów i niektórych innych tokenów, wzór jest bardziej złożoną strukturą, która jest dopasowana do wiele sznurkó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 lexera i parsera zaczniemy od parsera i będziemy pracować wstecz do wejścia.

Aby ułatwić projektowanie parsera, parser nie działa bezpośrednio z danymi wejściowymi, ale pobiera listę tokenów generowanych przez lexer. Patrząc na token kolumna na rysunku 3.2 widzimy żetony takie jak if, else, comparison, id, number i literal; są to nazwy żetonów. Zazwyczaj z lexerem/parserem token jest strukturą, która przechowuje nie tylko nazwę tokenu, ale znaki / symbole, które składają się na token oraz pozycję początkową i końcową ciągu znaków, które składają się na token, z pozycją początkową i końcową używaną do raportowania błędów, podświetlania itp.

Teraz lexer pobiera wprowadzanie znaków/symboli i korzystając z reguł lexer Konwertuje znaki/symbole wejściowe na tokeny. Teraz ludzie, którzy pracują z lexer / parser mają swoje własne słowa Do Rzeczy, których często używają. To, co myślisz o sekwencji znaków/symboli tworzących token, to to, co ludzie używający lexera/parsera nazywają leksem. Więc kiedy widzisz leksem, pomyśl o sekwencji znaków / symboli reprezentujących token. W przykładzie porównawczym sekwencja znaków/symboli może być różna, np. < lub > lub else lub 3.14, itd.

Innym sposobem myślenia o relacji między nimi jest to, że token jest strukturą programową używaną przez parser, który ma właściwość zwaną leksem, która przechowuje znak / symbole z wejścia. Teraz, jeśli spojrzysz na większość definicji tokenu w kodzie, możesz nie widzieć leksemu jako jednej z właściwości tokenu. Dzieje się tak dlatego, że token najprawdopodobniej utrzyma pozycję początkową i końcową znaków / symboli, które reprezentują token i sekwencję leksemu znaki / symbole mogą być wyprowadzane z pozycji początkowej i końcowej w razie potrzeby, ponieważ wejście jest statyczne.

 86
Author: Guy Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 15:48:24

Kiedy program źródłowy jest wprowadzany do analizatora leksykalnego, zaczyna się od podziału znaków na sekwencje leksemów. Leksemy są następnie używane do budowy tokenów, w których leksemy są mapowane na tokeny. Zmienna o nazwie myVar zostanie zmapowana do tokena określającego id, "num">, gdzie "num" powinno wskazywać na lokalizację zmiennej w tabeli symboli.

Krótko mówiąc:

  • leksemy to słowa pochodzące od postaci strumień wejściowy.
  • tokeny są leksemami mapowanymi na nazwę tokenu i wartość atrybutu.


Przykład obejmuje:
x = A + b * 2
Co daje leksemy: {x,=, A,+, B,*, 2}
Z odpowiednimi tokenami: {id, 0>, , id, 1>, , id, 2>, , id, 3>}

 25
Author: William,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-26 08:20:53

A) tokeny są nazwami symbolicznymi dla elementów składających się na tekst programu; np. if dla słowa kluczowego if i id dla dowolnego identyfikatora. Składają się one z analizator leksykalny. 5

(b) wzorzec jest regułą określającą, kiedy ciąg znaków z wejścia stanowi token; np. Sekwencja i, f dla tokena if oraz dowolna Sekwencja alfanumeryczne zaczynające się od litery identyfikatora tokena.

(c) leksem jest sekwencja znaków z wejścia które pasują do wzoru (i stąd stanowi instancję tokena); na przykład if pasuje do wzorca if, oraz foo123bar pasuje do wzorca id.

 6
Author: shasmoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 11:28:40

Token: Rodzaj dla (słowa kluczowe,identyfikator,znak interpunkcyjny, operatory wieloznakowe) to po prostu Token.

Pattern: reguła tworzenia tokena ze znaków wejściowych.

Lexeme: to sekwencja znaków w programie źródłowym dopasowana do wzorca dla tokena. Zasadniczo jest to element tokenu.

 4
Author: mud1t,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-04 20:04:23

LEXEME - sekwencja znaków dopasowanych do wzorca tworzącego TOKEN

PATTERN - zbiór reguł definiujących TOKEN

TOKEN - znacząca kolekcja znaków nad zestawem znaków języka programowania np: ID, stała, słowa kluczowe, operatory, Interpunkcja, literalny ciąg

 4
Author: sravan kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-19 14:18:46

Token: Token jest sekwencją znaków, które można traktować jako pojedynczą jednostkę logiczną. Typowe tokeny to:
1) identyfikatory
2) słowa kluczowe
3) operatory
4) symbole specjalne
5) stałe

Pattern: zbiór łańcuchów wejściowych, dla których ten sam token jest wytwarzany jako wyjście. Ten zbiór łańcuchów jest opisany przez regułę zwaną wzorcem powiązanym z tokenem.
leksem: leksem jest sekwencja znaków w źródle program, który jest dopasowany do wzorca dla tokena.

 3
Author: pradip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-18 07:03:34

Zobaczmy działanie analizatora leksykalnego (zwanego także skanerem)

Weźmy przykładowe wyrażenie:

INPUT : cout << 3+2+3;

FORMATTING PERFORMED BY SCANNER :  {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;} 

Ale nie rzeczywiste wyjście .

SKANER PO PROSTU WIELOKROTNIE SZUKA LEKSEMU W TEKŚCIE PROGRAMU ŹRÓDŁOWEGO, DOPÓKI DANE WEJŚCIOWE NIE ZOSTANĄ WYCZERPANE

leksem jest podłańcuch wejściowy, który tworzy poprawny ciąg terminali obecny w gramatyce . Każdy leksem podąża za wzorem , który jest wyjaśniony na końcu (część, którą czytelnik może skip at last)

( ważną regułą jest szukanie najdłuższego możliwego przedrostka tworzącego poprawny ciąg terminali aż do napotkania następnej białej spacji ... wyjaśnione poniżej)

LEKSEMES:

  1. cout

( chociaż "

  1. 3
  2. +
  3. 2
  4. ;

Tokeny: tokeny są zwracane pojedynczo (przez skaner na żądanie parsera) za każdym razem, gdy skaner znajdzie (poprawny) leksem. Scanner tworzy, jeśli nie jest już obecny, wpis w tabeli symboli ( posiadający atrybuty: głównie token-category i kilka innych ), gdy znajdzie leksem, aby wygenerować token

'# ' oznacza wpis w tabeli symboli . Wskazałem na leksemę numer w powyższej liście dla ułatwienia zrozumienia, ale technicznie powinien być faktycznym indeksem rekordu w tabeli symboli.

następujące tokeny są zwracane przez skaner do parsera w określonej kolejności dla powyższego przykładu.

Jak widać różnicę , token jest parą w przeciwieństwie do leksemu, który jest podłańcuchem wejściowym.

A pierwszym elementem pary jest token-Klasa / Kategoria

Klasy tokenów są wymienione poniżej:

  • słowa kluczowe
  • identyfikatory
  • literały
  • interpunkcyjne
  • operatory
  • I jeszcze jedno , skaner wykrywa białe spacje, ignoruje je i nie tworzy żadnego symbolu dla białej spacji. Nie wszystkie ograniczniki są białymi spacjami, Biała spacja jest jedną z form ograniczników używanych przez skanery do tego celu . Tabulatory , nowe linie, spacje , znaki unikalne w danych wejściowych są zbiorczo nazywane ogranicznikami białych znaków. Kilka innych ograniczników To";"","": "itp., które są szeroko uznawane za leksemy tworzące token.

    Łączna liczba tokenów zwróconych jest tutaj 8, jednak tylko 6 wpisów w tabeli symboli jest dokonanych dla leksemów . Leksemów jest też łącznie 8 (zob. definicja leksemu )

    - - - możesz pominąć tę część

    A ***pattern*** is a rule ( say, a regular expression ) that is used to check if a string-of-terminals is valid or not.

    If a substring of input composed only of grammar terminals is following the rule specified by any of the listed patterns , it is validated as a lexeme and selected pattern will identify the category of lexeme, else a lexical error is reported due to either (i) not following any of the rules or (ii) input consists of a bad terminal-character not present in grammar itself.

    for example :
    
    1. No Pattern Exists : In C++ , "99Id_Var" is grammar-supported string-of-terminals but is not recognised by any of patterns hence lexical error is reported .
    
    2. Bad Input Character : $,@,unicode characters may not be supported as a valid character in few programming languages.`
    
     3
    Author: Mayank narula,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2017-05-10 16:22:06

    Leksem - leksem jest sekwencją znaków w programie źródłowym, która odpowiada wzorcowi dla tokenu i jest identyfikowana przez analizator leksykalny jako instancja tego tokenu.

    Token - Token to para składająca się z nazwy tokenu i opcjonalnej wartości tokenu. Nazwa symboliczna jest kategorią jednostki leksykalnej.Popularne nazwy tokenów to

    • identyfikatory: nazwy, które wybiera programista
    • słowa kluczowe: nazwy już w programie język
    • separatory (znane również jako interpunkcyjne): znaki interpunkcyjne i sparowane ograniczniki
    • operatory: symbole operujące na argumentach i generujące wyniki
    • literały: numeryczne, logiczne, tekstowe, referencyjne literały

    Rozważmy to wyrażenie w języku programowania C:

    Suma = 3 + 2;

    ]}

     Lexeme        Token category
    ------------------------------
    sum      |    Identifier
     =       |    Assignment operator
     3       |    Integer literal
     +       |    Addition operator
     2       |    Integer literal
     ;       |    End of statement
    
     3
    Author: Rajat Bhatt,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2017-09-02 05:43:31

    Lekseme- leksem to ciąg znaków, który jest najniższą jednostką składniową w języku programowania.

    Token- token jest kategorią składniową, która tworzy klasę leksemów, co oznacza, do której klasy leksemów należy, Jest to słowo kluczowe lub identyfikator lub cokolwiek innego. Jednym z głównych zadań analizatora leksykalnego jest stworzenie pary leksemów i tokenów, czyli zebranie wszystkich znaków.

    Weźmy an przykład: -

    If (y

    Y = y-3;

    Lexeme Token

    Jeśli                                       KEYWORD

    (                                 LEWY NAWIAS

    Y                                     Identyfikator

    T                                     Identyfikator

    )                                PRAWY NAWIAS

    Y                                    Identyfikator

    = ASSGNMENT

    Y                                   Identyfikator

    _ ARITHMATIC

    3                                     INTEGER

    ;                                    Średnik

    Relacja między leksem a tokenem

    Relacja między leksem a tokenem

     2
    Author: coding_ninza,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2017-12-02 08:27:53

    Leksem jest w zasadzie jednostką tokenu i jest to w zasadzie sekwencja znaków, która pasuje do tokenu i pomaga rozbić kod źródłowy na tokeny.

    Na przykład: jeśli źródłem jest x=b, to leksemy będą x, =, b a żetony będą <id, 0>, <=>, <id, 1>.

     -2
    Author: Subhasmit halder,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2016-05-15 15:02:31