มาดูการทำงานของเครื่องวิเคราะห์ศัพท์ (เรียกอีกอย่างว่าเครื่องสแกน)
ลองดูนิพจน์ตัวอย่าง:
INPUT : cout << 3+2+3;
FORMATTING PERFORMED BY SCANNER : {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;}
ไม่ใช่ผลลัพธ์ที่แท้จริง
สแกนเนอร์ที่เรียบง่ายดูซ้ำสำหรับข้อความในโปรแกรมแหล่งข้อมูลจนกว่าอินพุตจะถูกระบายออก
Lexeme เป็นสตริงย่อยของอินพุตที่สร้างสตริง - ออฟ - เทอร์มินัลที่ถูกต้องที่มีอยู่ในไวยากรณ์ คำศัพท์ทุกตัวเป็นไปตามรูปแบบที่อธิบายไว้ในตอนท้าย (ส่วนที่ผู้อ่านอาจข้ามไปในที่สุด)
(กฎที่สำคัญคือการมองหาคำนำหน้าที่ยาวที่สุดที่เป็นไปได้ซึ่งสร้างสตริงของเทอร์มินัลที่ถูกต้องจนกว่าจะพบช่องว่างถัดไป ... อธิบายด้านล่าง)
LEXEMES:
- cout
- <<
(แม้ว่า "<" จะเป็นเทอร์มินัลสตริงที่ถูกต้อง แต่กฎที่กล่าวถึงข้างต้นจะเลือกรูปแบบสำหรับ lexeme "<<" เพื่อสร้างโทเค็นที่ส่งคืนโดยสแกนเนอร์)
- 3
- +
- 2
- ;
TOKENS:โทเค็นจะถูกส่งคืนทีละรายการ (โดยเครื่องสแกนเนอร์เมื่อได้รับการร้องขอจากพาร์เซอร์) ทุกครั้งที่สแกนเนอร์พบคำศัพท์ (ถูกต้อง) สแกนเนอร์จะสร้างรายการตารางสัญลักษณ์หากยังไม่มี(มีแอตทริบิวต์: หมวดโทเค็นส่วนใหญ่และอื่น ๆ อีกไม่กี่รายการ)เมื่อพบคำศัพท์เพื่อสร้างโทเค็น
'#' หมายถึงรายการตารางสัญลักษณ์ ฉันได้ชี้ไปที่หมายเลข lexeme ในรายการด้านบนเพื่อความสะดวกในการทำความเข้าใจ แต่ในทางเทคนิคแล้วควรเป็นดัชนีจริงของการบันทึกในตารางสัญลักษณ์
โทเค็นต่อไปนี้จะถูกส่งคืนโดยสแกนเนอร์เพื่อแยกวิเคราะห์ตามลำดับที่ระบุสำหรับตัวอย่างข้างต้น
<ตัวระบุ # 1>
<ตัวดำเนินการ # 2>
<ตัวอักษร # 3>
<ตัวดำเนินการ # 4>
<ตัวอักษร # 5>
<ตัวดำเนินการ # 4>
<ตัวอักษร # 3>
<เครื่องหมายวรรคตอน # 6>
ดังที่คุณเห็นความแตกต่างโทเค็นเป็นคู่ที่แตกต่างจาก lexeme ซึ่งเป็นสตริงย่อยของอินพุต
และองค์ประกอบแรกของคู่คือโทเค็นคลาส / หมวดหมู่
คลาสโทเค็นแสดงอยู่ด้านล่าง:
คีย์เวิร์ด
ตัวบ่งชี้
วรรณกรรม
PUNCTUATORS
ผู้ปฏิบัติงาน
และอีกอย่างหนึ่งคือ Scanner ตรวจพบช่องว่างไม่สนใจและไม่สร้างโทเค็นใด ๆ สำหรับช่องว่างเลย ตัวคั่นทั้งหมดไม่ใช่ช่องว่างช่องว่างเป็นรูปแบบหนึ่งของตัวคั่นที่สแกนเนอร์ใช้เพื่อจุดประสงค์ Tabs, Newlines, Spaces, Escaped Characters ในอินพุตทั้งหมดเรียกรวมกันว่าตัวคั่นช่องว่าง ตัวคั่นอื่น ๆ อีกไม่กี่ตัวคือ ';' ',' ':' ฯลฯ ซึ่งได้รับการยอมรับอย่างกว้างขวางว่าเป็นคำศัพท์ที่สร้างโทเค็น
จำนวนโทเค็นทั้งหมดที่ส่งคืนคือ 8 ที่นี่อย่างไรก็ตามมีเพียง 6 รายการตารางสัญลักษณ์เท่านั้นที่สร้างขึ้นสำหรับ lexemes Lexemes มีทั้งหมด 8 (ดูคำจำกัดความของ lexeme)
--- คุณสามารถข้ามส่วนนี้ได้
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.`