Bir belirteç ve bir sözcük birimi arasındaki fark nedir?


86

Aho Ullman ve Sethi'nin Derleyici Yapımında, kaynak programın karakterlerinin giriş dizisinin mantıksal bir anlamı olan karakter dizilerine bölündüğü ve belirteçler ve sözcükbirimler olarak bilinen diziler belirteci oluşturan dizilerdir, bu yüzden ne temel fark nedir?

Yanıtlar:


120

Aho, Lam, Sethi ve Ullman, AKA the Purple Dragon Book'un " Compilers Principles, Techniques, & Tools, 2nd Ed. " (WorldCat) adlı kitabını kullanarak ,

Lexeme pg. 111

Bir sözcük birimi, kaynak programda bir belirteç modeliyle eşleşen ve sözcüksel çözümleyici tarafından bu simgenin bir örneği olarak tanımlanan bir karakter dizisidir.

Token sf. 111

Bir belirteç, bir simge adı ve isteğe bağlı bir öznitelik değerinden oluşan bir çifttir. Simge adı, bir tür sözlü birimi, örneğin belirli bir anahtar kelimeyi veya bir tanımlayıcıyı belirten giriş karakterleri dizisini temsil eden soyut bir semboldür. Belirteç adları, ayrıştırıcının işlediği girdi simgeleridir.

Desen sf. 111

Bir kalıp, bir simgenin sözcükbirimlerinin alabileceği biçimin bir açıklamasıdır. Belirteç olarak bir anahtar sözcük olması durumunda, kalıp yalnızca anahtar kelimeyi oluşturan karakter dizisidir. Tanımlayıcılar ve diğer bazı belirteçler için desen, birçok dizeyle eşleşen daha karmaşık bir yapıdır.

Şekil 3.2: Simge örnekleri s. 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"

Bir lexer ve ayrıştırıcıyla olan bu ilişkiyi daha iyi anlamak için ayrıştırıcıyla başlayacağız ve girdiye doğru geriye doğru çalışacağız.

Bir ayrıştırıcı tasarlamayı kolaylaştırmak için, bir ayrıştırıcı doğrudan girdi ile çalışmaz, ancak bir lexer tarafından oluşturulan belirteçlerin bir listesini alır. Gördüğümüz Şekil 3.2'de belirteç sütun bakıldığında belirteçleri gibi if, else, comparison, id, numberve literal; bunlar simge isimleridir. Tipik olarak bir lexer / ayrıştırıcı ile bir belirteç, yalnızca belirtecin adını değil, aynı zamanda belirteci oluşturan karakterleri / simgeleri ve belirteci oluşturan karakter dizisinin başlangıç ​​ve bitiş konumunu da içeren bir yapıdır. hata raporlama, vurgulama vb. için kullanılan başlangıç ​​ve bitiş konumu

Artık lexer, karakterlerin / sembollerin girişini alır ve lexer'ın kurallarını kullanarak giriş karakterlerini / sembolleri jetonlara dönüştürür. Artık lexer / ayrıştırıcı ile çalışan insanlar sık ​​kullandıkları şeyler için kendi sözcüklerine sahipler. Bir belirteci oluşturan karakterler / semboller dizisi olarak düşündüğünüz şey, lexer / ayrıştırıcı kullanan insanların lexeme dediği şeydir. Sözlüğü gördüğünüzde, bir simgeyi temsil eden bir dizi karakter / sembol düşünün. Karşılaştırma örneğinde, karakterlerin / sembollerin dizisi, <veya >veya elseveya 3.14vb. Gibi farklı desenler olabilir .

İkisi arasındaki ilişkiyi düşünmenin başka bir yolu da, bir belirtecin, girişten karakter / sembolleri tutan lexeme adlı bir özelliğe sahip ayrıştırıcı tarafından kullanılan bir programlama yapısı olmasıdır. Şimdi, koddaki çoğu belirteç tanımına bakarsanız, lexeme'i simgenin özelliklerinden biri olarak göremeyebilirsiniz. Bunun nedeni, bir simgenin, simgeyi ve sözlüğü temsil eden karakterlerin / simgelerin başlangıç ​​ve bitiş konumlarını daha fazla tutmasıdır, karakter / simge dizisi, giriş statik olduğundan gerektiği şekilde başlangıç ​​ve bitiş konumundan türetilebilir.


12
Günlük konuşma dilinde derleyici kullanımında, insanlar iki terimi birbirinin yerine kullanma eğilimindedir. İhtiyacınız olursa ve zamanda kesin ayrım güzel.
Ira Baxter

Tamamen bilgisayar bilimi tanımı olmasa da, işte Giriş'ten sözcüksel semantiğe uygun olan doğal dil işlemeden bir tane varan individual entry in the lexicon
Guy Coder

Kesinlikle açık bir açıklama. Cennette işler böyle açıklanmalıdır.
Timur Fayzrakhmanov

harika bir açıklama. Bir şüphem daha var, ayrıştırma aşaması hakkında da okudum, ayrıştırıcı belirteçleri doğrulayamadığı için ayrıştırıcı sözcüksel analizörden belirteçler ister. ayrıştırıcı aşamasında basit girdi alarak ve ayrıştırıcının ne zaman lexer'dan jetonlar istediğini açıklayabilir misiniz?
Prasanna Sasne

@PrasannaSasne can you please explain by taking simple input at parser stage and when does parser asks for tokens from lexer.SO bir tartışma sitesi değildir. Bu yeni bir soru ve yeni bir soru olarak sorulması gerekiyor.
Guy Coder

37

Bir kaynak program sözcüksel çözümleyiciye beslendiğinde, karakterleri sözcükbirim dizilerine ayırarak başlar. Sözcük birimleri, daha sonra sözcük birimlerinin simgeler halinde eşlendiği belirteçlerin yapımında kullanılır. MyVar adlı bir değişken , < id , "num"> belirten bir belirteçle eşlenir ; burada "num", değişkenin sembol tablosundaki konumuna işaret etmelidir.

Kısaca söylemek gerekirse:

  • Sözcükbirimler, karakter girdi akışından türetilen sözcüklerdir.
  • Belirteçler, bir simge-adı ve bir öznitelik değeri ile eşlenen sözlüklerdir.


Bir örnek şunları içerir:
x = a + b * 2
Bu, sözcükbirimlerini verir: {x, =, a, +, b, *, 2}
Karşılık gelen simgelerle: {< id , 0>, <=>, < id , 1 >, <+>, < kimlik , 2>, <*>, < kimlik , 3>}


2
<İd, 3> olması mı gerekiyor? çünkü 2 bir tanımlayıcı değildir
Aditya

ama nerede x'in bir tanımlayıcı olduğunu söylüyor? Bu, bir sembol tablosunun belirli bir giriş olarak 'isim' = x, 'tip' = 'tanımlayıcı (id)', işaretçi = '0' olan 3 sütunlu bir tablo olduğu anlamına mı gelir? = while, 'type' = 'anahtar kelime', işaretçi = '21 '??

8

a) Jetonlar, programın metnini oluşturan varlıklar için sembolik isimlerdir; örneğin if anahtar sözcüğü için if ve herhangi bir tanımlayıcı için id. Bunlar sözcüksel analizörün çıktısını oluşturur. 5

(b) Bir kalıp, girdiden bir karakter dizisinin ne zaman bir simge oluşturduğunu belirleyen bir kuraldır; örneğin if simgesi için i, f dizisi ve simge kimliği için bir harfle başlayan herhangi bir alfanümerik dizisi.

(c) Sözcük birimi, girdiden bir örüntüyle eşleşen (ve dolayısıyla bir simgenin bir örneğini oluşturan) bir karakter dizisidir; örneğin if kalıbı ile eşleşirse ve foo123bar, id kalıbıyla eşleşir.


8

LEXEME - TOKEN'i oluşturan PATTERN ile eşleşen karakter dizisi

DESEN - TOKEN'i tanımlayan kural kümesi

TOKEN - Programlama dilinin karakter seti üzerindeki anlamlı karakter koleksiyonu, örn: Kimlik, Sabit, Anahtar Sözcükler, Operatörler, Noktalama, Değişmez Dize


7

Lexeme - Bir sözcük birimi, kaynak programda bir belirteç modeliyle eşleşen ve sözcüksel çözümleyici tarafından bu simgenin bir örneği olarak tanımlanan bir karakter dizisidir.

Token - Token, bir jeton adı ve isteğe bağlı bir jeton değerinden oluşan bir çifttir. Belirteç adı, bir sözcük birimi kategorisidir. Ortak simge adları şunlardır:

  • tanımlayıcılar: programcının seçtiği isimler
  • anahtar sözcükler: isimler zaten programlama dilinde
  • ayırıcılar (noktalama işaretleri olarak da bilinir): noktalama karakterleri ve eşli sınırlayıcılar
  • operatörler: argümanlar üzerinde çalışan ve sonuç üreten semboller
  • değişmez değerler: sayısal, mantıksal, metinsel, referans değişmezleri

Bu ifadeyi C programlama dilinde düşünün:

toplam = 3 + 2;

Aşağıdaki tabloyla belirtilmiş ve temsil edilmiştir:

 Lexeme        Token category
------------------------------
sum      |    Identifier
 =       |    Assignment operator
 3       |    Integer literal
 +       |    Addition operator
 2       |    Integer literal
 ;       |    End of statement

5

Sözcüksel analizörün (Tarayıcı olarak da adlandırılır) çalışmasını görelim.

Örnek bir ifadeyi ele alalım:

INPUT : cout << 3+2+3;

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

gerçek çıktı değil.

TARAYICI, GİRİŞ TÜKENDİ OLANA KADAR KAYNAK PROGRAMI METİNİ İÇİNDEKİ BİR LEXEME İÇİN TEKRAR GÖRÜYOR

Lexeme, gramerde mevcut olan geçerli bir uçbirim dizisini oluşturan bir girdi alt dizesidir. Her sözcük birimi, sonunda açıklanan bir örüntüyü takip eder (okuyucunun sonunda atlayabileceği kısım)

(Önemli bir kural, bir sonraki boşlukla karşılaşılıncaya kadar geçerli bir uçbirim dizisini oluşturan mümkün olan en uzun öneki aramaktır ... aşağıda açıklanmıştır)

LEXEMES:

  1. cout
  2. <<

("<" aynı zamanda geçerli terminal dizesi olmasına rağmen, yukarıda belirtilen kural, tarayıcı tarafından döndürülen jetonu oluşturmak için "<<" sözlüğü kalıbını seçmelidir)

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

TOKENS: Belirteçler, Tarayıcı (geçerli) bir sözcük birimi bulduğu her seferde (Ayrıştırıcı tarafından istendiğinde Tarayıcı tarafından) birer birer iade edilir. Tarayıcı, zaten mevcut değilse, bir sembol tablosu girişi oluşturur (özniteliklere sahip: esas olarak simge kategorisi ve birkaç başka özellik) , bir sözcükbirimi bulduğunda, belirtecini oluşturmak için

'#' bir sembol tablosu girişini belirtir. Anlama kolaylığı açısından yukarıdaki listede sözcük birimi numarasına işaret ettim, ancak teknik olarak sembol tablosundaki gerçek kayıt indeksi olmalıdır.

Aşağıdaki belirteçler, yukarıdaki örnekte belirtilen sırayla tarayıcı tarafından ayrıştırıcıya döndürülür.

  1. <tanımlayıcı, # 1>

  2. <Operatör, # 2>

  3. <Değişmez, # 3>

  4. <Operatör, # 4>

  5. <Değişmez, # 5>

  6. <Operatör, # 4>

  7. <Değişmez, # 3>

  8. <Noktalama Aracı, # 6>

Farkı görebileceğiniz gibi, bir simge, girişin bir alt dizesi olan sözcükbiriminden farklı olarak bir çifttir.

Ve çiftin ilk öğesi simge sınıfı / kategorisidir

Token Sınıfları aşağıda listelenmiştir:

  • ANAHTAR KELİMELER
  • TANIMLAYICILAR
  • LİTERALLER
  • PUNCTUATORS
  • OPERATÖRLER
  • Ve bir şey daha, Tarayıcı beyaz boşlukları algılar, onları yok sayar ve bir boşluk için herhangi bir simge oluşturmaz. Tüm sınırlayıcılar beyaz boşluk değildir; beyaz boşluk, tarayıcılar tarafından amacı doğrultusunda kullanılan bir sınırlayıcı biçimidir. Girişteki Sekmeler, Yeni Satır, Boşluklar, Kaçan Karakterlerin tümü topluca Beyaz Boşluk sınırlayıcıları olarak adlandırılır. Diğer birkaç sınırlayıcı ';' ',' ':' etc, token oluşturan sözcükbirimleri olarak yaygın şekilde tanınmaktadır.

    Burada döndürülen toplam simge sayısı 8'dir, ancak sözcükler için yalnızca 6 simge tablosu girişi yapılır. Lexemler de toplamda 8'dir (sözlükeme tanımına bakın)

    --- Bu bölümü atlayabilirsiniz

    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.`
    

    5

    Lexeme - Bir sözcük birimi, programlama dilinde en düşük seviyeli sözdizimsel birim olan bir karakter dizisidir.

    Belirteç - Belirteç, sözcükbirimlerinin bir sınıfını oluşturan sözdizimsel bir kategoridir; bu, sözlüğün hangi sınıfa ait olduğu anlamına gelir, bir anahtar kelime veya tanımlayıcı veya başka bir şeydir. Sözcüksel çözümleyicinin en önemli görevlerinden biri, bir çift sözcük birimi ve simge oluşturmak, yani tüm karakterleri toplamaktır.

    Bir örnek ele alalım:-

    eğer (y <= t)

    y = y-3;

    Lexeme Jetonu

    KEYWORD ise

    (SOL PARENTEZ

    y TANIMLAYICI

    <= KARŞILAŞTIRMA

    t TANIMLAYICI

    ) DOĞRU EBEVEYZ

    y TANIMLAYICI

    = ASSGNMENT

    y TANIMLAYICI

    _ ARİTMATİK

    3 TAM

    ;                                    NOKTALI VİRGÜL

    Lexeme ve Token arasındaki ilişki

    Sözlük ve belirteç arasındaki ilişki


    4

    Belirteç: Tür (anahtar sözcükler, tanımlayıcı, noktalama karakteri, çok karakterli operatörler) basitçe bir Belirteçtir.

    Desen: Giriş karakterlerinden belirteç oluşumu için bir kural.

    Lexeme: Bu, KAYNAK PROGRAMINDA bir simge için bir modelle eşleşen karakter dizisidir. Temel olarak, Token'in bir unsurudur.


    4

    Belirteç: Belirteç, tek bir mantıksal varlık olarak değerlendirilebilen bir karakter dizisidir. Tipik simgeler şunlardır:
    1) Tanımlayıcılar
    2) anahtar kelimeler
    3) operatörler
    4) özel semboller
    5) sabitler

    Desen: Çıktı olarak aynı jetonun üretildiği girişte bir dizi dize. Bu dize kümesi, jetonla ilişkili kalıp adı verilen bir kural tarafından açıklanır.
    Sözcük birimi: Bir sözcük birimi, kaynak programda bir simge için modelle eşleşen bir karakter dizisidir.


    1

    Lexeme Sözcüklerin bir belirteçte bir dizi karakter (alfanümerik) olduğu söylenir.

    Belirteç Bir simge, tek bir mantıksal varlık olarak tanımlanabilen bir karakter dizisidir. Tipik olarak simgeler, anahtar kelimeler, tanımlayıcılar, sabitler, dizeler, noktalama işaretleri, operatörlerdir. sayılar.

    Desen Desen adı verilen kural tarafından tanımlanan bir dizi dizedir. Bir kalıp, neyin bir jeton olabileceğini açıklar ve bu modeller, jetonla ilişkili normal ifadeler aracılığıyla tanımlanır.


    1

    Matematik araştırmacıları, Math'dan olanlar gibi, "yeni" terimler yaratmayı severler. Yukarıdaki cevapların hepsi güzel ama görünüşe göre, belirteçleri ve sözcükleri IMHO'yu ayırmaya çok fazla ihtiyaç yok. Aynı şeyi temsil etmenin iki yolu gibidirler. Sözcük birimi somuttur - burada bir dizi karakter; Öte yandan bir belirteç soyuttur - genellikle mantıklıysa anlamsal değeriyle birlikte bir sözcükbiriminin türüne atıfta bulunur. Sadece iki sentim.


    0

    Sözcüksel Çözümleyici, normal ifadeyle eşleşen bir sözcükbirimini tanımlayan bir karakter dizisi alır ve bunu belirteç olarak daha da sınıflandırır. Bu nedenle, bir Lexeme eşleşen dizedir ve bir Token adı bu sözcük biriminin kategorisidir.

    Örneğin, "int foo, bar;" girdisine sahip bir tanımlayıcı için aşağıdaki normal ifadeyi düşünün.

    mektup (harf | rakam | _) *

    Burada foove bardüzenli ifadeyle eşleşir, bu nedenle her iki sözcükbirimdir, ancak bir simge, IDyani tanımlayıcı olarak kategorize edilir .

    Ayrıca, bir sonraki aşama, yani sözdizimi çözümleyicisinin sözcükbirimi hakkında bilgi sahibi olması gerekmediğini, bir belirteci bilmesinin gerektiğini unutmayın.


    -2

    Lexeme temelde bir belirteç birimidir ve temelde belirteçle eşleşen ve kaynak kodunu belirteçlere ayırmaya yardımcı olan karakter dizisidir.

    Örneğin: bir kaynak ise x=b, o zaman lexemes olur x, =, bve simge olur <id, 0>, <=>, <id, 1>.


    Cevap daha spesifik olmalıdır. Bir örnek faydalı olabilir.
    Zverev Evgeniy
    Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
    Licensed under cc by-sa 3.0 with attribution required.