ตามที่ระบุไว้ในชื่อแล้วข้อมูลชนิดใดที่ lexer ส่งคืน / ให้ parser? เมื่ออ่านบทความวิเคราะห์คำศัพท์ที่ Wikipedia มีระบุว่า:
ในวิทยาการคอมพิวเตอร์การวิเคราะห์คำศัพท์เป็นกระบวนการของการแปลงลำดับของตัวละคร (เช่นในโปรแกรมคอมพิวเตอร์หรือหน้าเว็บ) เป็นลำดับโทเค็น ( สตริงที่มีการระบุ "ความหมาย")
อย่างไรก็ตามในความขัดแย้งที่สมบูรณ์ให้กับคำสั่งดังกล่าวเมื่อคำถามอื่นผมถามในเว็บไซต์ที่แตกต่างกัน ( รหัสการตรวจทานถ้าคุณอยากรู้) ได้รับการตอบคนตอบระบุไว้ว่า:
lexer มักจะอ่านสตริงและแปลงเป็นกระแส ... ของ lexemes คำศัพท์จะต้องเป็นตัวเลขของสตรีมเท่านั้น
และเขาให้ภาพนี้:
nl_output => 256
output => 257
<string> => 258
ต่อมาในบทความเขากล่าวถึงFlex
เล็กซ์ที่มีอยู่แล้วและกล่าวว่าการเขียน 'กฎ' กับมันจะง่ายกว่าการเขียนเล็กซ์เซอร์ด้วยมือ เขาดำเนินการให้ฉันตัวอย่างนี้:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
เพื่อส่งเสริมความเข้าใจของฉันและได้รับข้อมูลมากขึ้นผมอ่านบทความเกี่ยวกับวิกิพีเดียFlex บทความ Flex แสดงให้เห็นว่าคุณสามารถกำหนดชุดของกฎไวยากรณ์ด้วยโทเค็นด้วยวิธีต่อไปนี้:
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; }
สำหรับฉันแล้ว Flex lexer ส่งคืนสตริงคำหลัก \ โทเค็น แต่มันอาจเป็นการคืนค่าคงที่ที่เท่ากับจำนวนที่แน่นอน
ถ้า lexer กำลังส่งคืนตัวเลขมันจะอ่านตัวอักษรสตริงได้อย่างไร การส่งคืนตัวเลขเป็นสิ่งที่ดีสำหรับคำหลักเดียว แต่คุณจะจัดการกับสตริงได้อย่างไร lexer ไม่ต้องแปลงสตริงเป็นเลขฐานสองจากนั้นตัวแยกวิเคราะห์จะแปลงตัวเลขกลับเป็นสตริง ดูเหมือนว่าตรรกะ (และง่ายกว่า) สำหรับ lexer ในการส่งคืนสตริงและให้ parser แปลงตัวอักษรสตริงจำนวนใด ๆ ให้เป็นตัวเลขจริง
หรือผู้ที่เป็นไปได้ของ lexer สามารถกลับมาทั้งสองได้หรือไม่ ฉันได้พยายามที่จะเขียน lexer ง่ายใน c ++ ซึ่งจะช่วยให้คุณมีเพียงหนึ่งชนิดกลับสำหรับการทำงานของคุณ ดังนั้นฉันจึงถามคำถาม
เพื่อย่อคำถามของฉันลงในย่อหน้า: เมื่อเขียน lexer และสมมติว่ามันสามารถส่งคืนชนิดข้อมูล (สตริงหรือตัวเลข) หนึ่งชนิดเท่านั้นซึ่งจะเป็นตัวเลือกที่มีเหตุผลมากกว่านี้