ความแตกต่างระหว่างไวยากรณ์และความหมายคืออะไร?


87

ฉันคิดเสมอว่าการอ้างอิงถึงไวยากรณ์ของภาษานั้นเหมือนกับการอ้างอิงถึงความหมายของภาษา แต่ฉันได้รับแจ้งว่าไม่เป็นเช่นนั้น ความแตกต่างคืออะไร?



6
"ความคิดสีเขียวที่ไม่มีสีจะหลับอย่างดุเดือด" ก็เป็นเรื่องปกติ แต่ก็ไม่สมเหตุสมผล ดูen.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously
CesarGon

+1 สำหรับถามคำถามนี้ ฉันสงสัยเหมือนกันมันขี้เกียจเกินไปในการค้นหาอินเทอร์เน็ตสำหรับเรื่องนี้และเห็นได้ชัดว่าไม่เคยถาม
KK

มากกว่าหรือน้อยกว่าที่ฉันพูด ... ความหมายคือประเภทของอินสแตนซ์ความสัมพันธ์กับอินสแตนซ์อื่น & การรับประกันที่มีอยู่ระหว่างพวกเขา ไวยากรณ์คือวิธีที่จะประกาศสิ่งเหล่านี้ผ่านสายอักขระ มากหรือน้อย.
Dehbop

คำตอบ:


106

ความหมาย ~ ความหมาย

ไวยากรณ์ ~ การแทนสัญลักษณ์

ดังนั้นสองโปรแกรมที่เขียนในภาษาต่าง ๆ สามารถทำสิ่งเดียวกัน (ซีแมนติกส์) แต่สัญลักษณ์ที่ใช้ในการเขียนโปรแกรมจะแตกต่างกัน (ไวยากรณ์)

คอมไพเลอร์จะตรวจสอบไวยากรณ์ของคุณสำหรับคุณ (ข้อผิดพลาดในการคอมไพล์ในเวลานั้น) และรับความหมายจากกฎภาษา ผลลัพธ์ไม่ถูกต้องเนื่องจากรหัสระบุว่าเพิ่ม 1 แทนการเพิ่ม 2)


2
การตรวจสอบข้อผิดพลาดไม่ใช่เกณฑ์สำหรับการแยกความแตกต่างระหว่างไวยากรณ์และความหมาย คอมไพเลอร์สามารถและต้องวินิจฉัยข้อผิดพลาดทั้งทางไวยากรณ์ (เช่นเซมิโคลอนที่หายไป) และข้อผิดพลาดทางความหมาย (เช่นx + yที่ไม่มี+โอเปอเรเตอร์ที่เหมาะสมสำหรับตัวถูกดำเนินการเหล่านั้น) การเพิ่ม 1 แทน 2 เป็นสิ่งที่ฉันเรียกว่าข้อผิดพลาดเชิงตรรกะ
Keith Thompson

3
@ Keith - แต่ตรรกะ (ในขณะที่ "ตรรกะข้อผิดพลาด") เป็นความหมาย การตรวจสอบความหมายบางอย่างสามารถทำได้โดยคอมไพเลอร์ - โดยเฉพาะการตรวจสอบประเภท - ดังนั้นฉันยอมรับว่าคอมไพเลอร์ไม่เพียง แต่ค้นหาข้อผิดพลาดทางไวยากรณ์ แต่ Chris บอกว่า " จะไม่พบข้อผิดพลาดทางความหมายทั้งหมด " ซึ่งไม่ได้แปลว่า หาสิ่งใด "
Steve314

1
@ Steve314: เห็นด้วย แต่ถ้าคุณต้องการแยกความแตกต่างที่ชัดเจนระหว่างข้อผิดพลาดที่คอมไพเลอร์ต้องตรวจจับและข้อผิดพลาดที่ไม่จำเป็นต้องตรวจพบฉันคิดว่า "semantic" กับ "ตรรกะ" เป็นวิธีที่ดีในการแสดงความแตกต่างนั้น
Keith Thompson

4
@ KeithThompson ที่จริงแล้วในทางทฤษฎีผู้แปลหรือล่ามสำหรับภาษาที่มีระบบประเภทที่แข็งแกร่งและมีประสิทธิภาพ (เช่นขึ้นอยู่กับ ) สามารถตรวจสอบคุณสมบัติโดยพลการของโค้ดของคุณ (modulo the Halting Problem ถ้ามี) เพื่อทำลายข้อผิดพลาดทางความหมาย "ตรวจสอบได้" และ "ไม่สามารถตรวจสอบได้" ไม่สมเหตุสมผลโดยทั่วไป
เปลวไฟของ Ptharien

@ เปลวไฟของ Ptharien ฉันจะดึงการสนทนานี้ออกมาจากกลุ่มเมฆเป็นครั้งที่สองโดยเน้นส่วนของ 'in theory' ในแถลงการณ์ของคุณ ในทางปฏิบัติการบังคับใช้ซีแมนทิกส์ในรหัสต้องใช้ไวยากรณ์เพิ่มเติมเพื่อให้ตัวชี้นำคอมไพเลอร์เป็นฟังก์ชัน การตรวจสอบความหมายเพิ่มเติมมาเป็นค่าใช้จ่าย (เช่นความซับซ้อน / ความสามารถในการอ่าน) การระบุว่าภาษานั้นมีพลังมากพอที่จะตรวจสอบข้อผิดพลาดทางความหมายทั้งหมดก็เหมือนกับการพูดว่าระบบกฎหมายนั้นสมบูรณ์แบบพอที่จะป้องกันอาชญากรรมทั้งหมดได้ ส่วนตัวแล้วฉันชอบอิสระมากกว่าความปลอดภัย แต่นั่นคือสิ่งที่ทำให้หัวข้อนี้เป็น 'ศาสนา'
Evan Plaice

35

จริงๆแล้วไม่มีสองระดับ แต่มีสามระดับ:

  • ระดับศัพท์: วิธีการรวมตัวอักษรเพื่อผลิตองค์ประกอบภาษา ( iและfสร้างif)
  • ระดับการสร้างประโยค: วิธีองค์ประกอบภาษาจะรวมกันเพื่อผลิตแสดงออกทางภาษา ( if, (, 42, ==, answerและ)ผลิตคำสั่งเงื่อนไข)
  • ระดับความหมาย: วิธีที่นิพจน์ภาษาถูกแปลงเป็นคำสั่งของ CPU เพื่อสร้างความหมาย (คำสั่งแบบมีเงื่อนไขอนุญาตให้รันหนึ่งสาขาหรืออื่น ๆ ขึ้นอยู่กับผลลัพธ์ของนิพจน์บูลีน)

10
การแยกระหว่างขั้นตอนการแยกและแยกวิเคราะห์เป็นสิ่งประดิษฐ์โดยสิ้นเชิงมันไม่มีอะไรมากไปกว่าการเพิ่มประสิทธิภาพ และมีบางภาษาที่ไม่มีการกำหนดชุดคำศัพท์แบบ จำกัด อยู่ - แต่ก็ยังมีไวยากรณ์ที่กำหนดไว้อย่างชัดเจน ดังนั้นฉันต้องการกำหนด lexemes เป็นส่วนหนึ่งของไวยากรณ์ไม่ใช่เอนทิตีแยกต่างหาก
SK-logic

@ SK-logic: ในหลาย ๆ ภาษาจะมีการระบุรายการของ lexemes ที่ได้รับอนุญาตหรือต้องห้ามที่สร้างชื่อตัวแปร ดังนั้นการแยกจึงสมเหตุสมผล
mouviciel

5
@mouviciel มันทำให้รู้สึกว่าเป็นการเพิ่มประสิทธิภาพเท่านั้น - มิฉะนั้นคุณจะมีValidIdentifierเทอร์มินัลซึ่งสามารถกำหนดเป็นสิ่งที่ต้องการ![AnyKeyword] [Identifier](ฉันใช้สัญลักษณ์เหมือน PEG ที่นี่) คุณไม่จำเป็นต้องใช้ lexing pass แยกต่างหากสำหรับภาษาดังกล่าว ดูตัวอย่างตัวแยกวิเคราะห์ C ++ ที่ใช้ GLR
SK-logic

2
@EvanPlaice คุณกำลังพูดถึงอะไร จุดของฉันคือว่าlexingไม่จำเป็น (และจริง จำกัด ภาษาของคุณ) ไม่ได้แยก
SK-logic

1
@ SK- ตรรกะฉันเดาว่าฉันอ่านความคิดเห็นของคุณเพื่อหมายถึงตรงข้ามกับสิ่งที่คุณตั้งใจ ฉันคิดว่าคุณกำลังพูดถึงกรณีที่จำเป็นต้องใช้เพียงเล็ก ๆ น้อย ๆ - เช่นในภาษา 'ปกติ' หรือ 'บริบทฟรี' ในภาษาระดับที่สูงขึ้น lexer อาจไม่จำเป็น แต่มีวิธีที่รวดเร็วในการเรียกใช้การตรวจสอบความถูกต้องทางไวยากรณ์ผ่านเดียว ฉันเห็นด้วยอย่างสมบูรณ์ว่ามีหลายกรณีที่จะเป็นประโยชน์ในการปิดหรือกำจัดขั้นตอน lexer อย่างสมบูรณ์
Evan Plaice

18

ฉันจะอธิบายให้คุณเห็นด้วยตัวอย่างง่ายๆในภาษาENGLISH:

The glass drank Ben

เป็นคำสั่งที่ถูกต้องทางไวยากรณ์ มันมีคำนามคำกริยา ฯลฯ

แต่ความหมายมันผิดเพราะคำนี้ไม่มีความหมายที่เข้าใจได้หรือที่ถูกต้อง


15

ความหมายหมายถึงเอนทิตีแบบลอจิคัลของภาษาการเขียนโปรแกรมและการโต้ตอบ ไวยากรณ์กำหนดวิธีแสดงสิ่งเหล่านี้เป็นอักขระ

ตัวอย่างเช่นแนวคิดของตัวคำนวณเลขคณิตเป็นส่วนหนึ่งของซีแมนทิกส์ซี วิธีที่สามารถใช้+และ-โอเปอเรเตอร์เพื่อแสดงการทำงานของตัวชี้เป็นส่วนหนึ่งของไวยากรณ์

บางครั้งสองภาษาแบ่งปันบางส่วนของซีแมนทิกส์ของพวกเขา แต่ไวยากรณ์แตกต่างกันอย่างมาก (เช่น C # และ VB.NET - ทั้งสองประเภทใช้ค่าและประเภทอ้างอิง ในกรณีอื่น ๆ สองภาษามีความเหมือนกันทางวากยสัมพันธ์ แต่ความหมายไม่ตรงกัน (พิจารณาจาก Java กับ JavaScript ซึ่งความคล้ายคลึงกันมักทำให้ผู้เริ่มต้นสับสน)


ดังนั้น "กระบวนทัศน์" ที่เกี่ยวข้องกับความหมาย? ฉันหมายถึงกระบวนทัศน์เป็นชุดของความหมายที่สัมพันธ์กัน?
Gulshan

1
@Gulshan กระบวนทัศน์เป็นแนวคิดที่กว้างกว่าสิ่งที่ทำเป็นกรงเล็บเป็นความหมาย กระบวนทัศน์อาจรวมถึงความหมาย แต่มันเป็นวิธีการมากขึ้นหรือแม้กระทั่งปรัชญาที่กว้างขึ้น
SK-logic

6

ไวยากรณ์คือวิธีที่คุณจัดเรียงโทเค็นของภาษา ซีแมนทิกส์คือความหมายของโทเค็นเหล่านั้น (ปกติแล้วการจัดเรียงโทเค็นหมายถึงอะไร)


5

คุณไม่ได้ระบุว่าคุณอ้างถึงภาษาการเขียนโปรแกรมหรือภาษาทั่วไปที่ใช้ในการเขียนโปรแกรมเท่านั้นดังนั้นคำตอบของฉันเกี่ยวกับภาษาข้อมูล (เช่น XML, RDF, ระบบชนิดข้อมูลเป็นต้น):

ไบรอันแอถ่อมตนของเขาในเจ็ดกฎทองสำหรับการผลิตมาตรฐานภาษาอิสระ (1995) เขียนว่า"ไวยากรณ์ภาษาหนึ่งสามารถเป็นอีกหนึ่งของความหมาย" เขาอ้างถึงคำว่า "ไวยากรณ์" และ "ความหมาย" ที่ใช้ในคำอธิบายข้อมูล: ดังนั้นหากคุณสะดุดคำเหล่านี้ในสเปคของรูปแบบข้อมูลบางอย่างคุณควรแทนที่ทั้งสองคำด้วย"Potrzebie"เพื่อให้ชัดเจนว่าคุณต้องทำงาน ความหมายสำหรับตัวคุณเอง

ความสัมพันธ์ระหว่างไวยากรณ์และความหมายอย่างน้อยในข้อมูลที่ระบุว่าดีขึ้นสามารถอธิบายได้ด้วยคำว่า"เข้ารหัส" ความหมายถูกเข้ารหัสในรูปแบบไวยากรณ์ เนื่องจากการบันทึกสามารถซ้อนกันได้ไวยากรณ์ของภาษาหนึ่งจึงเป็นความหมายของอีกภาษาหนึ่ง หากมีข้อมูลเกินขอบเขตของข้อมูลการทำรังนี้อาจไม่มีที่สิ้นสุดตามที่อธิบายโดย Umberto Eco ว่า "semiosis ไม่ จำกัด "

เพื่อให้ตัวอย่าง:

  • ไวยากรณ์ XML (สิ่งที่มีวงเล็บเหล่านี้ทั้งหมด) เป็นไวยากรณ์ที่มี XML Infoset (ต้นไม้นามธรรม) เป็นความหมาย
  • XML Infoset เป็นไวยากรณ์สามารถแสดงเร็กคอร์ดในรูปแบบข้อมูล XML บางรูปแบบเป็น semantic ตัวอย่างเช่นเอกสาร RDF / XML ที่เข้ารหัสกราฟ RDF
  • กราฟ RDF (สิ่งที่มีการอ้างอิง URI) เป็นไวยากรณ์เข้ารหัสกราฟของทรัพยากรนามธรรมแบบ semantic
  • กราฟของแหล่งข้อมูลนามธรรมเป็นไวยากรณ์เข้ารหัสโมเดลเชิงแนวคิดเป็นความหมาย

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


4

หากสามารถอธิบายได้ในBNF (รูปแบบ Backus-Naur)หรือสิ่งที่คล้ายกันก็เป็นไวยากรณ์ หากไม่สามารถทำได้ก็ไม่เป็นเช่นนั้น

ในทางกลับกันซีแมนทิกส์นั้นเกี่ยวกับความหมายของโปรแกรม (หรือซอร์สโค้ดอื่น ๆ )

และบางครั้งเส้นแบ่งระหว่างทั้งสองก็อาจพร่ามัว

วิธีหนึ่งในการทำความเข้าใจความแตกต่างคือดูชนิดของข้อผิดพลาดที่คุณได้รับเมื่อไวยากรณ์หรือความหมายของโปรแกรมไม่ถูกต้อง

ข้อผิดพลาดทางไวยากรณ์คือความล้มเหลวของซอร์สโค้ดเพื่อให้ตรงกับไวยากรณ์ภาษาตัวอย่างเช่นไม่มีเซมิโคลอนที่ต้องการ

ข้อผิดพลาดทางความหมายคือความล้มเหลวในการตอบสนองความต้องการด้านภาษาอื่น ๆ (เช่น C เรียกว่า "ข้อ จำกัด "); ตัวอย่างอาจจะเขียนx + yที่ไหนxและyอยู่ในประเภทที่เข้ากันไม่ได้ ไวยากรณ์ภาษาจะบอกคุณว่าการเพิ่มนั้นดูเหมือนว่าsomething + somethingแต่มันไม่มีประสิทธิภาพเพียงพอที่จะแสดงความต้องการเกี่ยวกับประเภทของตัวถูกดำเนินการทางซ้ายและขวา

(ข้อผิดพลาดเชิงตรรกะเช่นการใช้ 1 โดยที่ 2 จะถูกต้องโดยทั่วไปจะไม่สามารถตรวจพบได้โดยคอมไพเลอร์ - แม้ว่าในบางกรณีคอมไพเลอร์สามารถเตือนเกี่ยวกับรหัสที่น่าสงสัย)


0

ไวยากรณ์คือสิ่งที่สัญลักษณ์ (คำศัพท์) พูด ความหมายคือสิ่งที่พวกเขาหมายถึง

พิจารณา:

C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- ไวยากรณ์ที่แตกต่างกันความหมายเดียวกัน

C #: left_value / right_value
VB.NET: left_value / right_value
- ไวยากรณ์เดียวกันความหมายที่แตกต่างกัน (สำหรับจำนวนเต็ม)


0

ไวยากรณ์คือการจัดเรียงทางไวยากรณ์ของคำในประโยคเช่นคำสั่ง

(อังกฤษ) ' cat dog boy ' และ (การเขียนโปรแกรม) ' hi.5 ' ไม่ถูกต้องทางไวยากรณ์

(อังกฤษ) ' cat hugs boy ' และ (programming) '* 3.2 * 5 *' ถูกต้องทางไวยากรณ์

ความหมายแบบคงที่คือว่าคำสั่งที่ถูกต้อง syntactically มีความหมายใด ๆ

(อังกฤษ) ' I are big ' (Programming) (python) ' 3 +' hi ' ' ถูกต้องทางไวยากรณ์ แต่มีข้อผิดพลาดทางความหมายแบบคงที่

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

(อังกฤษ) ' เครื่องบินที่บินได้อาจเป็นอันตรายได้ ' มีสองความหมายเช่นการบินของเครื่องบินอาจเป็นอันตรายหรือเครื่องบินที่กำลังบินอาจเป็นอันตรายได้

(การเขียนโปรแกรม) 'คอมพิวเตอร์จะไม่สร้างข้อความแสดงข้อผิดพลาด แต่จะไม่ทำสิ่งที่คุณบอกให้ทำ มันจะทำอย่างอื่น '

ที่มา : MIT 6.00.1


-2
  1. ไวยากรณ์หมายถึงกฎอย่างเป็นทางการที่ควบคุมการสร้างข้อความที่ถูกต้องในภาษา ความหมายหมายถึงชุดของกฎที่ให้ความหมายของคำสั่ง

  2. ข้อผิดพลาดเนื่องจากไวยากรณ์เกิดขึ้นในโปรแกรมเมื่อภาษาของโปรแกรมถูกละเมิดหรือถูกนำไปใช้ในทางที่ผิด ข้อผิดพลาดเนื่องจากความหมายเกิดขึ้นในโปรแกรมเมื่อคำสั่งไม่มีความหมาย

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

  4. ไวยากรณ์เกี่ยวข้องเฉพาะกับสิ่งที่ถูกต้องตามหลักภาษาและหลักไวยากรณ์เท่านั้น ซีแมนทิกส์ต้องการความรู้ล่วงหน้าทุกสิ่งซึ่งอยู่เหนือกว่าสิ่งใดซึ่งเป็นภาษาเฉพาะ

  5. ประโยค "เครื่องดื่มนมสำหรับทารก" ไม่มีความหมายทางประโยค แต่ผ่านความหมายคนส่วนใหญ่จะตีความว่ามันเป็นความหมาย "เครื่องดื่มนมสำหรับทารก" ตามที่ความรู้ก่อนหน้าของเราบอกเราว่าเด็กดื่มนมและดังนั้นเราจึงสามารถค้นหาความหมายจาก คำสำคัญ


1
โหวตขึ้นสำหรับทุกอย่างยกเว้นล่าสุด (จุด 5)
nawfal

-2

ไวยากรณ์และความหมายเหมือนยุทธศาสตร์และยุทธวิธีหรือทางซ้ายและขวา

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

ดังนั้นหากคุณกำลังเขียนโค้ดในภาษาไวยากรณ์คือภาษาที่คุณใช้และพฤติกรรมที่ต้องการคือซีแมนทิกส์ แต่ถ้าคุณกำลังนำไปใช้หรือพูดถึงคอมไพเลอร์สำหรับภาษานั้นไวยากรณ์คือไวยากรณ์และบางทีพิมพ์ระบบและความหมายทุกอย่างที่สร้างขึ้นบนนั้น และอื่น ๆ


4
BS ลึกลับแบบไหนกัน? ชอบซ้ายและขวา? ชอบกลยุทธ์และยุทธวิธีไหม? อาจจะเหมือนหยินและหยางพระเจ้าและปีศาจแฮร์รี่และโวลเดอมอร์ใช่ไหม
JensG

-3

ไวยากรณ์คือสิ่งที่คอมพิวเตอร์เข้าใจความหมายคือสิ่งที่มนุษย์เข้าใจ

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


"ซินแท็กซ์เป็นสิ่งที่คอมพิวเตอร์เข้าใจความหมายคือสิ่งที่มนุษย์เข้าใจ" เป็นสิ่งที่ทำให้เข้าใจผิดได้อย่างยอดเยี่ยม มนุษย์ก็เข้าใจไวยากรณ์เหมือนกันและคอมพิวเตอร์ก็เข้าใจความหมายบางอย่างด้วย
CesarGon

4
ผิดอย่างชัดเจน มีภาษาที่มีรูปแบบเหมือนกันและมีความหมายแตกต่างกันโดยสิ้นเชิง (เช่นรุ่นที่กระตือรือร้นและขี้เกียจของภาษาเดียวกัน) มีภาษาที่แทบไม่มีไวยากรณ์และความหมายที่หลากหลายและหลากหลาย (เช่น Forth และ Lisp) ความหมายคือวิธีที่คอมไพเลอร์ตีความภาษาของคุณ มนุษย์อาจไม่รู้อะไรเลยและยังสามารถใช้ภาษาได้
SK-logic

@ SK-logic คุณขัดแย้งกับตัวเอง หากความหมายที่แตกต่างกันสามารถแสดงด้วยไวยากรณ์เดียวกันดังนั้นความหมายที่ชัดเจนไม่ได้อยู่ในรูปแบบของไวยากรณ์ แต่เป็นวิธีการใช้งาน คอมไพเลอร์มีเพียงไวยากรณ์ที่จะทำงานกับ มันไม่ได้แปลความหมายมันตีความไวยากรณ์ มันไม่ได้รวบรวมไวยากรณ์ที่เหมือนกันแตกต่างกันไปตามสิ่งที่ผู้พัฒนาตั้งใจจะพูด แต่เฉพาะสิ่งที่เขาพิมพ์ ความหมายจัดทำโดยนักพัฒนาและมีความหมายกับเขาเท่านั้น
kylben

3
@ kylben ฉันไม่ได้ขัดแย้งกับตัวเองเพราะฉันไม่เคยพูดว่าไวยากรณ์และความหมายมีการเชื่อมต่อได้ และคอมไพเลอร์ไม่ได้ทำอะไรกับไวยากรณ์ตรงหลังจากขั้นตอนการแยกวิเคราะห์ - คอมไพเลอร์คือการใช้ความหมาย เห็นได้ชัดว่าการตีความคำศัพท์ของคุณผิด อ่านสิ่งนี้สำหรับผู้เริ่มต้น: en.wikipedia.org/wiki/Denotational_semantics
SK-logic

3
คุณกำลังพูดถึงความหมายของโปรแกรมซึ่งเป็น "ความหมาย" ตามที่มันจะถูกกำหนดโดยนักภาษาศาสตร์ แต่ในวิทยาการคอมพิวเตอร์ความหมายคือความหมายของภาษาไม่ใช่โปรแกรมเฉพาะ
SK-logic

-3

ตัวอย่างสั้น ๆ กับ "plain c":

void main()
{
  int a = 10;
  int x = a - 1;
  int y = - 1;

  printf("x = %i", x);
  printf("y = %i", y);
    getch();
}

ในตัวอย่างนี้ไวยากรณ์สำหรับโทเค็น "-" เหมือนกัน แต่มีความหมายแตกต่างกัน ("ความหมาย") ขึ้นอยู่กับตำแหน่งที่ใช้

ในการมอบหมาย "x", "-" หมายถึงการดำเนินการ "การลบ", ในการมอบหมาย "y", "-" หมายถึงการดำเนินการ "เครื่องหมายลบ"


3
ไม่ถูกต้อง ตัว-ดำเนินการทั้งสองเป็นโทเค็นเดียวกันแต่มีความแตกต่างทางไวยากรณ์เนื่องจากใช้ในบริบทที่แตกต่างกัน 0 - 1ตรงกับกฎไวยากรณ์additive-expression: additive-expression - multiplicative-expressionในขณะที่- 1ตรงกับกฎไวยากรณ์unary-expression: unary-operator cast-expression(อ้างอิง: มาตรฐาน C99)
Keith Thompson

@ Keith Thompson: คุณพลาดประเด็นไป เป็นความหมายหรือคำถามเกี่ยวกับไวยากรณ์ไม่ใช่คำถามมาตรฐาน C มาตรฐานถูกต้อง แต่คำตอบของฉันถูกนำไปอธิบายแนวคิดไม่ใช่ตามมาตรฐานอย่างแท้จริง มันเหมือนคำถาม "Captain Kirk" กับ "Dr Spock" Cheers ;-)
umlcat

ฉันไม่เห็นด้วย. ความแตกต่างระหว่าง-Oeprators ทั้งสองคือวากยสัมพันธ์ไม่ใช่แค่ความหมาย (แม้ว่าพวกเขาจะมีความหมายต่างกัน) ไวยากรณ์ถูกกำหนดโดยไวยากรณ์ภาษาและตัวดำเนินการทั้งสองจะถูกระบุในส่วนต่าง ๆ ของไวยากรณ์ ดูร่าง N1570 , ส่วนที่ 6.5.3 สำหรับตัวดำเนินการ unary และ 6.5.6 สำหรับตัวดำเนินการเสริม (BTW ถ้าคุณจะใช้ตัวอย่าง C มันอาจจะถูกต้องvoid main()ควรจะเป็นint main(void)และคุณหายไป#include <stdio.h>และสิ่งที่ส่วนหัวประกาศgetch
Keith Thompson

เพื่อชี้แจงประเด็นไวยากรณ์ไม่ได้เกี่ยวกับลำดับของโทเค็นเท่านั้น แต่เป็นเรื่องเกี่ยวกับวิธีที่โทเค็นเหล่านั้นสร้างโครงสร้างที่ใหญ่ขึ้น คอมไพเลอร์มักจะมีตัววิเคราะห์คำ (tokenizer) และตัวแยกวิเคราะห์เป็นองค์ประกอบที่แตกต่างกัน ทั้งคู่จัดการกับไวยากรณ์
Keith Thompson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.