โครงสร้างเลกซิคัล
เอกสาร
เอกสาร M เป็นลําดับที่สั่งของอักขระ Unicode M อนุญาตให้ใช้อักขระ Unicode ได้หลายคลาสในส่วนที่แตกต่างกันของเอกสาร M สําหรับข้อมูลเกี่ยวกับคลาสของอักขระ Unicode ให้ดู มาตรฐาน Unicode เวอร์ชัน 3.0, ส่วนที่ 4.5
เอกสารประกอบด้วยนิพจน์หนึ่ง รายการ หรือกลุ่ม ข้อกําหนด ที่จัดระเบียบเป็น ส่วนๆ ส่วนจะอธิบายไว้อย่างละเอียดในบทที่ 10 หากกล่าวตามแนวคิดแล้ว ขั้นตอนต่อไปนี้จะถูกใช้เพื่ออ่านนิพจน์จากเอกสาร
เอกสารจะถูกถอดรหัสตามชุดรูปแบบการเข้ารหัสอักขระเป็นลําดับอักขระ Unicode
จะมีการดําเนินการวิเคราะห์เลกซิคัล จากนั้น จะเป็นการแปลกระแสข้อมูลของอักขระ Unicode เป็นกระแสข้อมูลของโทเค็น ส่วนย่อยที่เหลืออยู่ของส่วนนี้จะครอบคลุมถึงการวิเคราะห์เลกซิคัล
จะมีการดําเนินการวิเคราะห์ไวยากรณ์ จากนั้นจะเป็นการแปลกระแสข้อมูลของโทเค็นเป็นรูปแบบที่สามารถประเมินได้ กระบวนการนี้จะครอบคลุมอยู่ในส่วนต่อมา
แบบแผนไวยากรณ์
ไวยากรณ์เลกซิคัลและไวยากรณ์ไวยากรณ์จะปรากฏโดยใช้ การผลิตไวยากรณ์ การผลิตไวยากรณ์แต่ละรายการจะกําหนดสัญลักษณ์ที่ไม่ใช่เทอร์มินัล และส่วนขยายที่เป็นไปได้ของสัญลักษณ์ดังกล่าวที่ไม่ใช่เทอร์มินัล เป็นลําดับของสัญลักษณ์ที่เป็นเทอร์มินัลและไม่ใช่เทอร์มินัล ในการผลิต ไวยากรณ์ สัญลักษณ์ที่ไม่ใช่เทอร์มินัล+ จะแสดงในรูปแบบตัวเอียง และ สัญลักษณ์ที่เป็นเทอร์มินัล จะปรากฏในแบบอักษรที่กว้างแบบคงที่
บรรทัดแรกของการผลิตไวยากรณ์ คือชื่อของสัญลักษณ์ที่ไม่ใช่เทอร์มินัลซึ่งถูกกำหนดไว้ ตามด้วยเครื่องหมายทวิภาค บรรทัดที่มีการเยื้องต่อมาแต่ละบรรทัดจะประกอบด้วยการขยายที่เป็นไปได้ของสัญลักษณ์ที่ไม่ใช่เทอร์มินัล ซึ่งกําหนดไว้เป็นลําดับของสัญลักษณ์ที่ไม่ใช่เทอร์มินัล หรือเป็นเทอร์มินัล ตัวอย่างเช่น การผลิต:
if-expression:
if
หากเงื่อนไข then
true-expressionelse
false-expression
กําหนดให้ นิพจน์ ถ้า ประกอบด้วยโทเค็น if
ตามด้วย เงื่อนไข ถ้า ตามด้วยโทเค็น then
ตามด้วย นิพจน์ จริง ตามด้วยโทเค็น else
ตามด้วย นิพจน์ เท็จ
เมื่อมีส่วนขยายที่เป็นไปได้ของสัญลักษณ์ที่ไม่ใช่เทอร์มินัลมากกว่าหนึ่งรายการ ตัวเลือกจะแสดงบนบรรทัดที่แยกจากกัน ตัวอย่างเช่น การผลิต:
รายการตัวแปร:
ตัวแปร
ตัวแปรรายการ ,
ตัวแปร
กําหนดให้ variable-list ประกอบด้วย variable หรือประกอบด้วย variable-list ตามด้วย variable กล่าวอีกนัยหนึ่ง ข้อกําหนดจะซ้ํา และระบุว่ารายการตัวแปรประกอบด้วยตัวแปรอย่างน้อยหนึ่งรายการที่คั่นด้วยเครื่องหมายจุลภาค
คําต่อท้ายที่มีตัวห้อย "opt" จะถูกใช้เพื่อระบุสัญลักษณ์ทางเลือก การผลิต:
field-specification:
optional
opt field-name =
field-type
เป็นแบบย่อสำหรับ:
field-specification:
field-name =
field-type
optional
field-name =
field-type
และกําหนด field-specification เพื่อเลือกเริ่มต้นด้วยสัญลักษณ์optional
ที่เป็นเทอร์มินัล ซึ่งตามด้วย field-name สัญลักษณ์=
ที่เป็นเทอร์มินัล และ field-type
โดยปกติ รายการตัวเลือกอื่นจะแสดงอยู่บนบรรทัดแบบแยกจากกัน แม้ในกรณีที่มีหลายทางเลือก วลี "หนึ่งใน" อาจนําหน้ารายการส่วนขยายที่ระบุไว้บนบรรทัดเดียว นี่เป็นเพียงแบบย่อสําหรับแสดงรายการทางเลือกแต่ละรายการบนบรรทัดที่แยกต่างหาก ตัวอย่างเช่น การผลิต:
decimal-digit: หนึ่งใน
0 1 2 3 4 5 6 7 8 9
เป็นแบบย่อสำหรับ:
เลขทศนิยม:
0
1
2
3
4
5
6
7
8
9
การวิเคราะห์เลกซิคัล
การผลิต lexical-unit จะกําหนดไวยากรณ์เลกซิคัลสําหรับเอกสาร M เอกสาร M ทั้งหมดที่ถูกต้องจะสอดคล้องกับไวยากรณ์นี้
lexical-unit:
lexical-elementsopt
องค์ประกอบเลกซิคัล:
เลกซิคัล-องค์ประกอบ
เลกซิคัล-องค์ประกอบ
เลกซิคัล-องค์ประกอบ
องค์ประกอบเลกซิคัล:
ช่องว่าง
ข้อคิดเห็นโทเค็น
ในระดับเลกซิคัล เอกสาร M จะประกอบด้วยสตรีมขององค์ประกอบช่องว่าง ความคิดเห็น และโทเค็น การผลิตเหล่านี้แต่ละรายการจะครอบคลุมอยู่ในส่วนต่อไปนี้ เฉพาะองค์ประกอบโทเค็นเท่านั้นที่มีนัยสําคัญในไวยากรณ์ไวยากรณ์ไวยากรณ์
ช่องว่าง
Whitespace ใช้เพื่อแยกข้อคิดเห็นและโทเค็นต่างๆ ภายในเอกสาร M Whitespace ประกอบด้วยอักขระเว้นวรรค (ซึ่งเป็นส่วนหนึ่งของ Unicode คลาส Zs) ตลอดจนแท็บแนวนอนและแนวตั้ง ตัวดึงข้อมูลฟอร์ม และลําดับอักขระของบรรทัดใหม่ ลําดับอักขระขึ้นบรรทัดใหม่ ประกอบด้วยอักขระขึ้นบรรทัดใหม่ ป้อนบรรทัด อักขระขึ้นบรรทัดใหม่ตามด้วยป้อนบรรทัด บรรทัดถัดไป และอักขระคั่นย่อหน้า
ช่องว่าง:
อักขระใดๆ ที่มี Unicode คลาส Zs
อักขระแท็บแนวนอน (U+0009
)
อักขระแท็บแนวตั้ง (U+000B
)
อักขระตัวดึงข้อมูลฟอร์ม (U+000C
)
อักขระขึ้นบรรทัดใหม่ () ตามด้วยอักขระป้อนบรรทัด (U+000D
U+000A
)
new-line-character
new-line-character:
อักขระขึ้นบรรทัดใหม่ (U+000D
)
อักขระป้อนบรรทัด (U+000A
)
อักขระบรรทัดถัดไป (U+0085
)
อักขระตัวคั่นบรรทัด (U+2028
)
อักขระตัวคั่นย่อหน้า (U+2029
)
สําหรับความเข้ากันได้กับเครื่องมือการแก้ไขรหัสต้นทางที่เพิ่มตัวทําเครื่องหมายที่จุดสิ้นสุดไฟล์ และเปิดใช้งานเอกสารให้สามารถดูเป็นลําดับของบรรทัดที่สิ้นสุดอย่างเหมาะสม จะมีการปรับใช้การแปลงข้อมูลต่อไปนี้ไปยังเอกสาร M ตามลําดับ
หากอักขระสุดท้ายของเอกสารเป็นอักขระ Control-Z (
U+001A
) อักขระนี้จะถูกลบอักขระขึ้นบรรทัดใหม่ (
U+000D
) จะถูกเพิ่มไปยังส่วนท้ายของเอกสาร หากเอกสารดังกล่าวไม่ได้ว่างเปล่า และหากอักขระสุดท้ายของเอกสารไม่ใช่อักขระขึ้นบรรทัดใหม่ (U+000D
), ป้อนบรรทัด (U+000A
), ตัวคั่นบรรทัด (U+2028
) หรือตัวคั่นย่อหน้า (U+2029
)
ข้อคิดเห็น
ระบบสนับสนุนข้อคิดเห็นสองรูปแบบ คือ ข้อคิดเห็นบรรทัดเดียวและข้อคิดเห็นแบบมีตัวคั่น ข้อคิดเห็น บรรทัดเดียวเริ่มต้นด้วยอักขระ //
และขยายไปยังจุดสิ้นสุดของบรรทัดต้นทาง ข้อคิดเห็นแบบมีตัวคั่นเริ่มต้นด้วยอักขระ /*
และสิ้นสุดด้วยอักขระ*/
ข้อคิดเห็นแบบมีตัวคั่นอาจขยายไปอีกหลายบรรทัด
ติชม:
single-line-comment
delimited-comment
single-line-comment:
//
เลือกอักขระข้อคิดเห็นแบบบรรทัดเดียว
อักขระข้อคิดเห็นแบบบรรทัดเดียว:
single-line-comment-character single-line-comment-characteropt
single-line-comment-character:
อักขระ Unicode ใดๆ ยกเว้น new-line-character
delimited-comment:
/*
เครื่องหมายดอกจัน opt-comment-text delimited-comment /
delimited-comment-text:
delimited-comment-section delimited-comment-textopt
delimited-comment-section:
/
asterisksopt not-slash-or-asterisk
เครื่องหมายดอกจัน:
*
asterisksopt
not-slash-or-asterisk:
อักขระ Unicode ใดๆ ยกเว้น *
หรือ /
ข้อคิดเห็นไม่ซ้อนกัน ลำดับอักขระ /*
และ */
ไม่มีความหมายพิเศษภายในข้อคิดเห็นบรรทัดเดียว และลำดับอักขระ //
และ /*
ไม่มีความหมายพิเศษภายใน ข้อคิดเห็นแบบมีตัวคั่น
ข้อคิดเห็นจะไม่ได้รับการประมวลผลภายในสัญพจน์ของข้อความ ตัวอย่าง
/* Hello, world
*/
"Hello, world"
รวมถึงข้อคิดเห็นแบบมีตัวคั่น
ตัวอย่าง
// Hello, world
//
"Hello, world" // This is an example of a text literal
แสดงข้อคิดเห็นบรรทัดเดียวหลายรายการ
โท เค็น
โทเค็นคือ ตัวระบุ คําสําคัญ สัญพจน์ ตัวดําเนินการ หรือตัวคั่นเครื่องหมายวรรคตอน Whitespace และข้อคิดเห็นจะถูกใช้เพื่อแยกโทเค็นออกจากกัน แต่ไม่ถือว่าเป็นโทเค็น
สัญลักษณ์:
ตัวระบุ
คำ
ตัว อักษร
operator-or-punctuator
ลําดับการหลีกเลี่ยงอักขระ
ค่าข้อความ M สามารถมีอักขระ Unicode แบบกําหนดเองได้ อย่างไรก็ตาม สัญพจน์ของข้อความจะถูกจํากัดเป็นอักขระกราฟิก และจําเป็นต้องใช้ลําดับการหลีกเลี่ยงสําหรับอักขระที่ไม่ใช่กราฟิก ตัวอย่างเช่น เมื่อต้องการรวมอักขระขึ้นบรรทัดใหม่ ตัวป้อนบรรทัด หรืออักขระแท็บในสัญพจน์ของ #(cr)
ข้อความ สามารถใช้ลําดับการหลีก , #(lf)
และ #(tab)
ได้ตามลําดับ เมื่อต้องการฝังอักขระ #(
เริ่มต้นของลําดับการหลีกในสัญพจน์ของ #
ข้อความ จําเป็นต้องหลีกตัว:
#(#)(
นอกจากนี้ ลําดับการเล็งยังสามารถมีค่าจุดรหัส Unicode แบบสั้น (เลขหกสี่หลัก) หรือแบบยาว (เลขหกแปดหลัก) ดังนั้น ลําดับการหลีกสามลําดับต่อไปนี้จะเทียบเท่ากัน:
#(000D) // short Unicode hexadecimal value
#(0000000D) // long Unicode hexadecimal value
#(cr) // compact escape shorthand for carriage return
สามารถรวมรหัสการหลีกหลายรหัสไว้ในลําดับการหลีกเลี่ยงเดียวซึ่งคั่นด้วยเครื่องหมายจุลภาค ลําดับสองลําดับต่อไปนี้จะเทียบเท่ากัน:
#(cr,lf)
#(cr)#(lf)
รายการต่อไปนี้จะอธิบายถึงกลไกมาตรฐานของการละทิ้งอักขระในเอกสาร M
ลําดับ character-escape:
#(
escape-sequence-list )
escape-sequence-list:
ลําดับการหลีกเลี่ยงครั้งเดียว
รายการลําดับการหลีกเลี่ยงงานแบบ,
ครั้งเดียว
single-escape-sequence:
long-unicode-escape-sequence
short-unicode-escape-sequence
control-character-escape-sequence
escape-escape
long-unicode-escape-sequence:
เลขหก เลขหก เลขหก เลขหก เลขหก เลขหก เลขหก
short-unicode-escape-sequence:
เลขหก เลขหก เลขหก
control-character-escape-sequence:
control-character
control-character:
cr
lf
tab
escape-escape:
#
สัญพจน์
สัญพจน์ คือการแสดงรหัสต้นทางของค่า
ตัว อักษร:
logical-literal (ตรรกะ-สัญพจน์)
number-literal
text-literal
null-literal
สัญพจน์ตามตัวอักษร
สัญพจน์ Null
สัญพจน์ Null จะใช้สําหรับเขียนค่าnull
ค่า null
แสดงถึงค่าที่ขาดไป
null-literal:
null
สัญพจน์ตรรกะ
สัญพจน์ตรรกะจะใช้สําหรับเขียนค่า true
และ false
และ จะทําให้เกิดค่าตรรกะ
logical-literal:
true
false
สัญพจน์ตัวเลข
สัญพจน์ตัวเลขจะใช้สําหรับเขียนค่าตัวเลขและทําให้เกิดค่าตัวเลข
number-literal:
decimal-number-literal
hexadecimal-number-literal
decimal-number-literal:
.
เลขทศนิยม เลขทศนิยม ส่วนเลขชี้กําลัง
.
การเลือกส่วนเลขชี้กําลังเลขทศนิยม
การเลือกส่วนเลขชี้กําลังเลขทศนิยม
เลขทศนิยม:
การเลือกทศนิยมตัวเลขทศนิยม
decimal-digit: หนึ่งใน
0 1 2 3 4 5 6 7 8 9
exponent-part:
e
ลงชื่อใช้เลขทศนิยม
E
ลงชื่อใช้เลขทศนิยม
sign: หนึ่งใน
+ -
hexadecimal-number-literal:
0x
เลขหก
0X
เลขหก
เลขหก:
เลขหก เลขหก เลือก
hex-digit: หนึ่งใน
0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
สามารถระบุตัวเลขในรูปแบบเลขฐานสิบหกโดยนําหน้าเลขฐานสิบหกด้วยอักขระ0x
ตัวอย่างเช่น:
0xff // 255
โปรดทราบว่าถ้ามีจุดทศนิยมรวมอยู่ในสัญพจน์ตัวเลข จากนั้นจะต้องมีตัวเลขอย่างน้อยหนึ่งหลักตามหลัง ตัวอย่างเช่น 1.3
เป็นสัญพจน์ตัวเลข แต่ 1.
1.e3
ไม่ใช่
สัญพจน์ข้อความ
สัญพจน์ข้อความจะใช้สําหรับเขียนลําดับอักขระ Unicode และทําให้เกิดค่าข้อความ
text-literal:
"
text-literal-characteropt "
text-literal-character:
text-literal-character text-literal-characteropt
text-literal-character:
อักขระข้อความเดียว
ลําดับ character-escape
double-quote-escape-sequence
อักขระข้อความเดียว:
อักขระใดๆ ยกเว้น "
(U+0022
) หรือ #
(U+0023
) ตามด้วย (
(U+0028
)
double-quote-escape-sequence:
""
(U+0022
, U+0022
)
เมื่อต้องการรวมการอ้างถึงไว้ในค่าข้อความ เครื่องหมายอัญประกาศจะถูกทําซ้ํา ดังนี้:
"The ""quoted"" text" // The "quoted" text
การ จัดทํา character-escape-sequence สามารถใช้สําหรับเขียนอักขระต่างๆ ในค่าข้อความโดยไม่จําเป็นต้องเข้ารหัสเป็นอักขระ Unicode โดยตรงในเอกสาร ตัวอย่างเช่น สามารถเขียนอักขระขึ้นบรรทัดใหม่และตัวป้อนบรรทัดในค่าข้อความเป็น:
"Hello world#(cr,lf)"
สัญพจน์ตามตัวอักษร
สัญพจน์ตามตัวอักษรถูกใช้เพื่อจัดเก็บลําดับของอักขระ Unicode ที่ป้อนโดยผู้ใช้เป็นรหัส แต่ไม่สามารถแยกวิเคราะห์เป็นรหัสได้อย่างถูกต้อง ในขณะทํางาน จะสร้างค่าข้อผิดพลาด
คํากริยา-สัญพจน์:
#!"
text-literal-characteropt "
Identifiers
ตัวระบุ คือชื่อที่ใช้สำหรับอ้างอิงถึงค่า ตัวระบุอาจเป็นตัวระบุปกติหรือตัวระบุที่ได้รับการอ้างอิงอย่างใดอย่างหนึ่ง
รหัส:
regular-identifier
quoted-identifier
regular-identifier:
available-identifier
available-identifier dot-character regular-identifier
available-identifier:
keyword-or-identifier ที่ไม่ใช่คําสําคัญ
keyword-or-identifier:
identifier-start-character identifier-part-characteropt
identifier-start-character:
letter-character
underscore-character
identifier-part-character:
identifier-part-character identifier-part-characteropt
identifier-part-character:
letter-character
decimal-digit-character
underscore-character
การเชื่อมต่ออักขระ
combining-character (การรวมอักขระ)
การจัดรูปแบบอักขระ
dot-character:
.
(U+002E
)
underscore-character:
_
(U+005F
)
letter-character:
อักขระ Unicode ของคลาส Lu, Ll, Lt, Lm, Lo, หรือ Nl
combining-character:
อักขระ Unicode ของคลาส Mn หรือ Mc
decimal-digit-character:
อักขระ Unicode ของคลาส Nd
connecting-character:
อักขระ Unicode ของคลาส Pc
formatting-character:
อักขระ Unicode ของคลาส Cf
สามารถใช้ quoted-identifier เพื่อให้สามารถใช้ลําดับของอักขระ Unicode ศูนย์หรืออื่นๆ เป็นตัวระบุได้ รวมถึงคําสําคัญ Whitespace ข้อคิดเห็น ตัวดําเนินการ และตัวคั่นเครื่องหมายวรรคตอน
quoted-identifier:
#"
text-literal-characteropt "
โปรดทราบว่าลําดับการหลีกเลี่ยงการใช้งานและเครื่องหมายอัญประกาศคู่ไปจนถึงเครื่องหมายการหลีกเลี่ยงสามารถใช้ได้ในตัวระบุที่อ้างถึง เช่นเดียวกับใน text-literal
ตัวอย่างต่อไปนี้ใช้ตัวระบุที่ชื่อที่ประกอบด้วยอักขระช่องว่าง:
[
#"1998 Sales" = 1000,
#"1999 Sales" = 1100,
#"Total Sales" = #"1998 Sales" + #"1999 Sales"
]
ตัวอย่างต่อไปนี้ใช้ตัวระบุที่ quoting เพื่อรวมตัว +
ดําเนินการในตัวระบุ:
[
#"A + B" = A + B,
A = 1,
B = 2
]
ตัวระบุทั่วไป
มีสองตําแหน่งใน M ที่ตัวระบุไม่แนะนําความกํากวม ซึ่งประกอบด้วยช่องว่างหรือเป็นสัญพจน์คําสําคัญหรือตัวเลข ตําแหน่งเหล่านี้คือชื่อของเขตข้อมูลเรกคอร์ดในสัญพจน์ของเรกคอร์ด และในตัวดําเนินการเข้าถึงเขตข้อมูล ([ ]
) ซึ่ง M อนุญาตให้ใส่ตัวระบุได้โดยไม่ต้องใช้ตัวระบุที่อ้างถึง
[
Data = [ Base Line = 100, Rate = 1.8 ],
Progression = Data[Base Line] * Data[Rate]
]
ตัวระบุที่ใช้ในการตั้งชื่อและเข้าถึงจะถูกเรียกว่า ตัวระบุ ทั่วไป และมีการกําหนดดังต่อไปนี้:
generalized-identifier:
generalized-identifier-part
generalized-identifier ถูกคั่นด้วยช่องว่างเท่านั้น (U+0020
)
generalized-identifier-part
generalized-identifier-part:
generalized-identifier-segment
decimal-digit-character generalized-identifier-segment
generalized-identifier-segment:
keyword-or-identifier
keyword-or-identifier dot-character keyword-or-identifier
คำสำคัญ
คําสําคัญ คือลําดับของอักขระที่ถูกสงวนไว้ ซึ่งคล้ายกับตัวระบุ และไม่สามารถใช้เป็นตัวระบุได้ ยกเว้นในกรณีที่ใช้กลไกการแสดงตัวระบุ หรือในกรณีที่อนุญาตตัวระบุทั่วไป
คําสําคัญ: หนึ่งใน
and as each else error false if in is let meta not null or otherwise
section shared then true try type #binary #date #datetime
#datetimezone #duration #infinity #nan #sections #shared #table #time
ตัวดําเนินการและตัวคั่นเครื่องหมายวรรคตอน
ตัวดําเนินการและตัวคั่นเครื่องหมายวรรคตอนมีหลายชนิด ตัวดําเนินการจะใช้ในนิพจน์เพื่ออธิบายการดําเนินการที่เกี่ยวข้องกับตัวถูกดําเนินการอย่างน้อยหนึ่งตัว ตัวอย่างเช่น นิพจน์ a + b
ใช้ตัวดำเนินการ +
เพื่อเพิ่มตัวถูกดำเนินการสองตัว a
และ b
ตัวคั่นเครื่องหมายวรรคตอนใช้สําหรับการจัดกลุ่มและการแบ่งแยก
operator-or-punctuator: หนึ่งใน
, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...