แชร์ผ่าน


โครงสร้างเลกซิคัล

เอกสาร

เอกสาร M เป็นลําดับที่สั่งของอักขระ Unicode M อนุญาตให้ใช้อักขระ Unicode ได้หลายคลาสในส่วนที่แตกต่างกันของเอกสาร M สําหรับข้อมูลเกี่ยวกับคลาสของอักขระ Unicode ให้ดู มาตรฐาน Unicode เวอร์ชัน 3.0, ส่วนที่ 4.5

เอกสารประกอบด้วยนิพจน์หนึ่ง รายการ หรือกลุ่ม ข้อกําหนด ที่จัดระเบียบเป็น ส่วนๆ ส่วนจะอธิบายไว้อย่างละเอียดในบทที่ 10 หากกล่าวตามแนวคิดแล้ว ขั้นตอนต่อไปนี้จะถูกใช้เพื่ออ่านนิพจน์จากเอกสาร

  1. เอกสารจะถูกถอดรหัสตามชุดรูปแบบการเข้ารหัสอักขระเป็นลําดับอักขระ Unicode

  2. จะมีการดําเนินการวิเคราะห์เลกซิคัล จากนั้น จะเป็นการแปลกระแสข้อมูลของอักขระ Unicode เป็นกระแสข้อมูลของโทเค็น ส่วนย่อยที่เหลืออยู่ของส่วนนี้จะครอบคลุมถึงการวิเคราะห์เลกซิคัล

  3. จะมีการดําเนินการวิเคราะห์ไวยากรณ์ จากนั้นจะเป็นการแปลกระแสข้อมูลของโทเค็นเป็นรูปแบบที่สามารถประเมินได้ กระบวนการนี้จะครอบคลุมอยู่ในส่วนต่อมา

แบบแผนไวยากรณ์

ไวยากรณ์เลกซิคัลและไวยากรณ์ไวยากรณ์จะปรากฏโดยใช้ การผลิตไวยากรณ์ การผลิตไวยากรณ์แต่ละรายการจะกําหนดสัญลักษณ์ที่ไม่ใช่เทอร์มินัล และส่วนขยายที่เป็นไปได้ของสัญลักษณ์ดังกล่าวที่ไม่ใช่เทอร์มินัล เป็นลําดับของสัญลักษณ์ที่เป็นเทอร์มินัลและไม่ใช่เทอร์มินัล ในการผลิต ไวยากรณ์ สัญลักษณ์ที่ไม่ใช่เทอร์มินัล+ จะแสดงในรูปแบบตัวเอียง และ สัญลักษณ์ที่เป็นเทอร์มินัล จะปรากฏในแบบอักษรที่กว้างแบบคงที่

บรรทัดแรกของการผลิตไวยากรณ์ คือชื่อของสัญลักษณ์ที่ไม่ใช่เทอร์มินัลซึ่งถูกกำหนดไว้ ตามด้วยเครื่องหมายทวิภาค บรรทัดที่มีการเยื้องต่อมาแต่ละบรรทัดจะประกอบด้วยการขยายที่เป็นไปได้ของสัญลักษณ์ที่ไม่ใช่เทอร์มินัล ซึ่งกําหนดไว้เป็นลําดับของสัญลักษณ์ที่ไม่ใช่เทอร์มินัล หรือเป็นเทอร์มินัล ตัวอย่างเช่น การผลิต:

if-expression:
      ifหากเงื่อนไข then true-expressionelsefalse-expression

กําหนดให้ นิพจน์ ถ้า ประกอบด้วยโทเค็น ifตามด้วย เงื่อนไข ถ้า ตามด้วยโทเค็น thenตามด้วย นิพจน์ จริง ตามด้วยโทเค็น elseตามด้วย นิพจน์ เท็จ

เมื่อมีส่วนขยายที่เป็นไปได้ของสัญลักษณ์ที่ไม่ใช่เทอร์มินัลมากกว่าหนึ่งรายการ ตัวเลือกจะแสดงบนบรรทัดที่แยกจากกัน ตัวอย่างเช่น การผลิต:

รายการตัวแปร:
      ตัวแปร
      ตัวแปรรายการ
, ตัวแปร

กําหนดให้ variable-list ประกอบด้วย variable หรือประกอบด้วย variable-list ตามด้วย variable กล่าวอีกนัยหนึ่ง ข้อกําหนดจะซ้ํา และระบุว่ารายการตัวแปรประกอบด้วยตัวแปรอย่างน้อยหนึ่งรายการที่คั่นด้วยเครื่องหมายจุลภาค

คําต่อท้ายที่มีตัวห้อย "opt" จะถูกใช้เพื่อระบุสัญลักษณ์ทางเลือก การผลิต:

field-specification:
      optionalopt field-name = field-type

เป็นแบบย่อสำหรับ:

field-specification:
      field-name
= field-type
      optionalfield-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+000DU+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: หนึ่งใน
      , ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...