Başlıkta belirtildiği gibi, bir lexer çözümleyiciye hangi veri türünü iade etmeli / vermelidir? Vikipedi'nin sahip olduğu sözcüksel analiz makalesini okurken , şunu belirtmiştir:
Bilgisayar bilimlerinde sözcüksel analiz, bir dizi karakterin (bir bilgisayar programında veya web sayfasında olduğu gibi) bir dizi dizinin ( tanımlanmış "anlamı" olan dizeler ) dönüştürülmesi işlemidir .
Ancak, yukarıdaki ifadeye tamamen aykırı bir biçimde, Farklı bir sitede sorduğum başka bir soru ( merak ediyorsanız Kod İnceleme ) yanıtlandığında, Cevap veren kişi şunları söyledi:
Sözlük genellikle dizgiyi okur ve bunu bir sözlük akışına dönüştürür. Sözlüklerin yalnızca bir sayı akışı olması gerekir .
ve o bu görsel verdi:
nl_output => 256
output => 257
<string> => 258
Daha sonra makalede Flex
daha önce var olan bir sözcüden bahsetti ve onunla 'kurallar' yazmanın elle bir söz sahibi yazmaktan daha kolay olacağını söyledi. Bana bu örneği vermeye devam etti:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
İçgörümü daha fazla bilgi edinmek ve daha fazla bilgi edinmek için Flex ile ilgili Wikipedia makalesini okudum . Flex makalesi, tokenlerle birlikte bir dizi sözdizimi kuralını şu şekilde tanımlayabileceğinizi gösterdi:
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
Bana öyle geliyor ki, Flex lexer \ string tokens dizelerini döndürüyor. Ancak belirli sayılara eşit olan sabitler döndürüyor olabilir.
Lexer rakamları döndürecekti, string değişmezlerini nasıl okuyacaktı? sayı döndürmek, tek anahtar kelimeler için iyidir, ancak bir dize ile nasıl ilgilenirsiniz? Lexer, dizgiyi ikili sayılara dönüştürmek zorunda kalmazdı ve daha sonra çözümleyici, sayıları tekrar dizgeye dönüştürürdü. Lexer'in dizeleri döndürmesi ve ardından çözümleyicinin herhangi bir sayı dizgisinin değişmezlerini gerçek sayılara dönüştürmesine izin vermek çok daha mantıklı (ve daha kolay) görünüyor.
Yoksa lexer her ikisini de geri alabilir mi? İşlevleriniz için yalnızca bir dönüş türüne sahip olmanızı sağlayan c ++ dilinde basit bir sözlük yazmaya çalışıyorum . Böylece sorumu sormam için beni yönlendir.
Sorumu bir paragrafa sıkıştırmak için: Bir sözlük yazarken ve bunun yalnızca bir veri türü (karakter dizileri veya sayılar) getirebileceğini varsayarsak , hangisi daha mantıklı bir seçim olabilir?