Önceki sürüm ile karşılaştırdığımızda ilk olarak;
const int tokencount = COMMENT + 1;
Satırını eklediğini gördüm. Tabi isimsiz bir enum'a sahip olduğun için böyle yapmak zorunda kaldığını düşünüyorum. Bundan önceki başlıkta bahsettiğim gibi buna bir isim vermelisin. Belki o zaman her şey daha kolay ve düzenli olur. En azından test çıktıları daha anlaşılır olacağı kanaatindeyim. Bu durumda, o satıra ihtiyaç duymaz veya şunun gibi dinamik bir hale getirebilirdin:
const int tokencount = cast(int)lx.max + 1;
Tamam, şimdi diyeceksin ki o zaman isimsizleri pratik bir şekilde tıpkı C'deki #define gibi kullanabiliyorken ne gerek var buna...:)
Oysa iki yere with koymak seni fazla uğraştırmayacaktır:
: : :
this(){
chars= ['n': '\n', 't': '\t', 'r': '\r', 'a': '\a','f': '\f', 'b': '\b', 'v': '\v', '\"': '\"','?': '?', '\\': '\\', '\'': '\''];
with(lx) {
lexmap = [
'+': LexMap(PLUS, [
'+': LexMap(PLUSPLUS),
'=': LexMap(PLUSEQUAL)
]),
: : :
';': LexMap(SEMI),
':': LexMap(COLON),
];
} // <---- bunu unutma
: : :
Token[] lexy(){
auto c = codes.ptr;
string tmp;
while (c<size) with(lx) { // <--- bu şekilde olunca kapama gerekmeyecek...
: : :
Token yapısının son hali de aşağıdaki gibi olmuş. Görünüşe göre val diye bir işaretçi dışında türleri ilk değerlerine eşitlemişsin. Bence bir eşitlik vermeye gerek yok çünkü C'den farklı olarak varsayılan ilk değerleri tanımlandığı için yapı kurulurken ilkleniyorlar. Tabi val'ı nerede kullandığını göremedim. Herhalde ilerisi için düşünülüyor. Ayrıca bunu class içine mi almaya çalıştın? Çünkü fazladan bir kapama karakteri ( } ) gördüm de...
struct Token{
ulong line = 0;
uint typ = 0;
string value = "";
void* val;
}
Son olarak dediklerimi yaparsan şu test kodu çok işimize yarayabilir:
import lexer;
void main(){
auto lexer = new Lexer();
lexer.load("2 + 2\n a += a++ + 2");
auto lexed = lexer.lexy();
"#\tSatır\tTür\t\tİçerik".writeln;
foreach(i, lex; lexed) {
(i+1).write('\t');
lex.line.write('\t');
writef("%s\t\t", cast(lx)lex.typ);
writef("%s\n", lex.value);
}
}/*
# Satır Tür İçerik
1 1 NUMBER 2
2 1 PLUS +
3 1 NUMBER 2
4 1 NEWLINE
5 2 WORD a
6 2 PLUSEQUAL +=
7 2 WORD a
8 2 PLUSPLUS ++
9 2 PLUS +
10 2 NUMBER 2
*/
Başarılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]