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


14

ฉันเข้าใจความแตกต่างระหว่างไวยากรณ์และความหมาย -

ไวยากรณ์ : วิธีรวมสัญลักษณ์ต่างๆเพื่อสร้างนิพจน์หรือคำสั่งที่ถูกต้อง
ซีแมนทิกส์ : ความหมายของสัญลักษณ์เหล่านั้นที่มีการแสดงออก

แต่ไวยากรณ์คืออะไร ตัวอย่างเช่น: บางครั้งฉันได้ยินคนพูดว่าโครงสร้างบางอย่างนั้น "ไม่ถูกต้องตามหลักไวยากรณ์ แต่ syntactically มันถูกต้อง" มันหมายความว่าอะไร?


FWIW มันฟังดูไร้สาระสำหรับฉัน ถ้าไวยากรณ์ของภาษายอมรับส่วนของรหัสมันจะสอดคล้องกับไวยากรณ์ บางทีบางคนอาจมีคำจำกัดความกว้าง ๆ (และที่ไม่เป็นมาตรฐาน) ของ "ไวยากรณ์" บริบท / แหล่งที่มา?

@delnan ไม่จริง. ตัวอย่างเช่นint;ถูกต้องตามหลักไวยากรณ์ แต่ไวยากรณ์ที่ไม่ดีเกิดขึ้นใน C ++ ไวยากรณ์มีปัญหากับรหัสนี้ไม่มี แต่ จำกัด ไวยากรณ์ต้องว่าชื่อมีให้ถ้าส่วนแรกของการประกาศไม่มีชั้นระบุหรือenum-ระบุหรือในภาษา C ++ 11 เพื่อนระบุ
Johannes Schaub - litb

@ JohannesSchaub-litb: สนใจที่จะอ้างถึงส่วนหนึ่งของไวยากรณ์ที่ทำให้ถูกต้องหรือไม่

@Johanes นั่นคือสิ่งที่ตรงกันข้ามกับสถานการณ์ในคำถาม
นิโคล

2
@ Johannes Schaub: กฎอะไรทำให้ "int;" ถูกต้อง? ไวยากรณ์กำหนดไวยากรณ์
Casey Patton

คำตอบ:


6

ไวยากรณ์คือชุดของกฎที่กำหนดไวยากรณ์สำหรับภาษาเฉพาะ

เมื่อผู้คนกำลังพูดถึงตัวแยกวิเคราะห์โดยเฉพาะ (โดยเฉพาะอย่างยิ่งสิ่งที่สร้างด้วยตัวแยกวิเคราะห์เช่น yacc, Byacc, ANTLR, ฯลฯ ) พวกเขาอาจแยกผมออกไปอีกเล็กน้อย กฎเทียบกับส่วนเหล่านั้นที่มีการบังคับใช้แยกต่างหากโดยรหัสที่แนบมากับกฎ ตัวอย่างเช่นใน C เมื่อคุณกำหนดอาร์เรย์ขนาดที่คุณระบุสำหรับอาร์เรย์จะต้องเป็นค่าบวกอย่างเคร่งครัด (ไม่เป็นศูนย์) กฎไวยากรณ์โดยทั่วไปอาจพูดบางสิ่งเช่น:

typename var_name '[' unsigned_int ']'

... และแยกจากกันจะมีรหัสเล็กน้อยเพื่อตรวจสอบว่า unsigned_int ไม่ใช่ศูนย์ ในกรณีนี้มันอาจทำให้รู้สึกถึงการพูดคุยเกี่ยวกับความต้องการของไวยากรณ์และไวยากรณ์แยกจากกันกับทั้งสองมีความต้องการที่แตกต่างกันเล็กน้อย (ที่บังคับใช้ร่วมกันเราเข้าใจความต้องการของภาษาของตัวเอง)


3

ความแตกต่างนั้นคลุมเครือและไม่คุ้มค่าที่จะกังวลมากเกินไป

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

ในทางตรงกันข้าม "ไวยากรณ์" โดยทั่วไปหมายถึงวิธีการอธิบายภาษาที่ไม่มีบริบท (ไวยากรณ์ของแอตทริบิวต์แม้จะมี)

เหตุผลที่ไม่น่าเป็นห่วงมากคือระบบประเภทนั้นมักจะถูกพิจารณาว่าเป็น " ความหมายแบบคงที่" ของภาษาเพราะมันเป็น " วินัยเชิงไวยากรณ์สำหรับความถูกต้อง" และบางครั้งภาษาก็มีไวยากรณ์ที่ไม่ใช้บริบทที่เหมาะสม ตัวอย่างเช่น C ต้องป้อนข้อมูลจาก parser กลับสู่ lexer

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


ฉันไม่เข้าใจว่าทำไมความแตกต่างถึงคลุมเครือ ไวยากรณ์อธิบายไวยากรณ์
Casey Patton

1
@ Casey ไม่มีตามการใช้งานหนึ่งของคำว่า "ไวยากรณ์" ระบุไวยากรณ์supersetของไวยากรณ์
Ryan Culpepper

0

ไวยากรณ์คือชุดของกฎเพื่อกำหนดภาษา แต่ไวยากรณ์อธิบายไวยากรณ์และความหมาย ภาษาอาจมีไวยากรณ์ที่แตกต่างกันสองแบบ:

  • ไวยากรณ์ไวยากรณ์ (ชุดของกฎที่อธิบายการเรียงลำดับของสัญลักษณ์ในภาษา)
  • ความหมายของไวยากรณ์ (ชุดของกฎที่อธิบายความหมายที่ถูกต้องและใช้สัญลักษณ์เหล่านั้น)

ตัวอย่างเช่นส่วนหนึ่งของไวยากรณ์ใน C อาจมีลักษณะดังนี้:

if statement -> if_keyword "(" expression ")" if_block
if_keyword -> "if"
logical_statement -> some other stuff here...

ความหมาย:

an if statement is made of an if keyword followed by a parenthesis followed by an expression followed by a parenthesis followed by an if block
an if keyword is ....

ลองดูที่การกำหนดไวยากรณ์นี้ หากคุณอยากรู้เกี่ยวกับไวยากรณ์จริง ๆ ลองดูที่GNU Bisonซึ่งเป็นเครื่องมือสำหรับอธิบายไวยากรณ์ของภาษา

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


7
ไม่ไวยากรณ์ไม่ได้กำหนดความหมายและไม่ควรทำเว้นแต่เป็นสิ่งที่แปลกใหม่เช่นcontextfreeart.org
SK-logic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.