ພາສາອັງກິດພາສາຝຣັ່ງແອສປາໂຍນ

Ad


OnWorks favicon

yaccposix - ອອນລາຍໃນຄລາວ

ເປີດໃຊ້ yaccposix ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີຜ່ານ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator

ນີ້ແມ່ນຄໍາສັ່ງ yaccposix ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator

ໂຄງການ:

NAME


yacc — ຍັງ compiler ອື່ນອີກ (ການພັດທະນາ)

ສະຫຼຸບສັງລວມ


yacc [-dltv] [−ຂ file_prefix] [-ປ sym_prefix] grammar

ລາຍລະອຽດ


ໄດ້ yacc ຜົນປະໂຫຍດຈະຕ້ອງອ່ານຄໍາອະທິບາຍຂອງໄວຍາກອນທີ່ບໍ່ມີສະພາບການຢູ່ໃນ grammar ແລະຂຽນ C
ລະຫັດແຫຼ່ງ, ສອດຄ່ອງກັບມາດຕະຖານ ISO C, ໄຟລ໌ລະຫັດ, ແລະສ່ວນຫົວທາງເລືອກ
ຂໍ້ມູນເຂົ້າໄປໃນໄຟລ໌ຫົວ, ໃນໄດເລກະທໍລີປະຈຸບັນ. ລະຫັດແຫຼ່ງທີ່ສ້າງຂຶ້ນຈະຕ້ອງ
ບໍ່ຂຶ້ນກັບພຶດຕິກໍາທີ່ບໍ່ໄດ້ກໍານົດ, ບໍ່ໄດ້ກໍານົດ, ຫຼືການປະຕິບັດທີ່ກໍານົດໄວ້, ຍົກເວັ້ນໃນ
ກໍລະນີທີ່ມັນຖືກຄັດລອກໂດຍກົງຈາກໄວຍາກອນທີ່ສະຫນອງ, ຫຼືໃນກໍລະນີທີ່ມີ
ເອກະສານໂດຍການຈັດຕັ້ງປະຕິບັດ. ລະຫັດ C ຈະກໍານົດຫນ້າທີ່ແລະກິດຈະກໍາທີ່ກ່ຽວຂ້ອງ
ແລະ macros ສໍາລັບ automaton ທີ່ປະຕິບັດ algorithm parsing ຕອບສະຫນອງຄວາມຕ້ອງການໃນ
ລະບົບວິເຄາະ.

ຮູບແບບ ແລະຄວາມຫມາຍຂອງໄວຍະກອນແມ່ນໄດ້ອະທິບາຍໄວ້ໃນສ່ວນຂະຫຍາຍຄຳອະທິບາຍ.

ລະຫັດແຫຼ່ງ C ແລະໄຟລ໌ header ຈະຖືກຜະລິດໃນຮູບແບບທີ່ເຫມາະສົມສໍາລັບການປ້ອນຂໍ້ມູນ C
compiler (ເບິ່ງ c99).

OPTIONS


ໄດ້ yacc ຜົນປະໂຫຍດຈະຕ້ອງສອດຄ່ອງກັບປະລິມານຄໍານິຍາມພື້ນຖານຂອງ POSIX.1-2008, ສ່ວນ
12.2, ຜົນປະໂຫຍດ syntax ຄູ່ມືແນະນໍາຍົກເວັ້ນຂໍ້ແນະນໍາ 9.

ທາງເລືອກຕໍ່ໄປນີ້ຈະໄດ້ຮັບການສະຫນັບສະຫນູນ:

−ຂ file_prefix
ການນໍາໃຊ້ file_prefix ແທນ​ທີ່ y ເປັນຄໍານໍາຫນ້າສໍາລັບຊື່ໄຟລ໌ຜົນຜະລິດທັງຫມົດ. ລະຫັດ
ເອກະສານ y.tab.c, ໄຟລ໌ຫົວ y.tab.h (ສ້າງເມື່ອ −ງ ຖືກກໍານົດ), ແລະ
ໄຟລ໌ຄໍາອະທິບາຍ y. ຜົນຜະລິດ (ສ້າງເມື່ອ −v ຖືກກໍານົດ), ຈະຖືກປ່ຽນເປັນ
file_prefix.tab.c, file_prefix.tab.h, ແລະ file_prefix.ຜົນຜະລິດ, ຕາມລໍາດັບ.

−ງ ຂຽນໄຟລ໌ຫົວ; ໂດຍຄ່າເລີ່ມຕົ້ນພຽງແຕ່ໄຟລ໌ລະຫັດຖືກຂຽນ. ໄດ້ #ກໍານົດ
ຖະແຫຼງການຮ່ວມກັບລະຫັດ token ທີ່ມອບໝາຍໂດຍ yacc ກັບຜູ້ໃຊ້ປະກາດ
ຊື່ token. ນີ້ອະນຸຍາດໃຫ້ໄຟລ໌ແຫຼ່ງອື່ນທີ່ບໍ່ແມ່ນ y.tab.c ເພື່ອເຂົ້າເຖິງ token
ລະຫັດ.

−l ຜະລິດໄຟລ໌ລະຫັດທີ່ບໍ່ມີໃດໆ #ສາຍ ກໍ່ສ້າງ. ຖ້າທາງເລືອກນີ້
ບໍ່ມີຢູ່, ມັນບໍ່ໄດ້ຖືກລະບຸວ່າໄຟລ໌ລະຫັດຫຼືໄຟລ໌ header ມີ
#ສາຍ ຄຳແນະນຳ. ນີ້ຄວນຈະຖືກນໍາໃຊ້ພຽງແຕ່ຫຼັງຈາກໄວຍາກອນແລະທີ່ກ່ຽວຂ້ອງ
ການປະຕິບັດໄດ້ຖືກແກ້ໄຂຢ່າງສົມບູນ.

-ປ sym_prefix
ການນໍາໃຊ້ sym_prefix ແທນ​ທີ່ yy ເປັນຄໍານໍາຫນ້າສໍາລັບຊື່ພາຍນອກທັງຫມົດທີ່ຜະລິດໂດຍ
yacc. ຊື່ທີ່ໄດ້ຮັບຜົນກະທົບຈະຕ້ອງປະກອບມີຫນ້າທີ່ yyparse( ), yylex(), ແລະ
yyerror(), ແລະຕົວແປ yylval, yychar, ແລະ yydebug. (ໃນສ່ວນທີ່ເຫຼືອຂອງ
ພາກນີ້, ຫົກສັນຍາລັກທີ່ອ້າງອີງແມ່ນອ້າງອີງໂດຍໃຊ້ຊື່ເລີ່ມຕົ້ນຂອງພວກເຂົາ
ພຽງແຕ່ເປັນຄວາມສະດວກສະບາຍ notational.) ຊື່ທ້ອງຖິ່ນອາດຈະໄດ້ຮັບຜົນກະທົບຈາກ -ປ
ທາງເລືອກ; ແນວໃດກໍ່ຕາມ, ໄດ້ -ປ ທາງເລືອກຈະບໍ່ມີຜົນກະທົບ #ກໍານົດ ສັນຍາລັກທີ່ສ້າງຂຶ້ນໂດຍ
yacc.

-t ແກ້ໄຂຄໍາສັ່ງການລວບລວມເງື່ອນໄຂເພື່ອອະນຸຍາດໃຫ້ລວບລວມການດີບັກ
ລະຫັດໃນໄຟລ໌ລະຫັດ. ຄຳຖະແຫຼງການດີບັກ runtime ຈະຖືກບັນຈຸຢູ່ໃນສະເໝີ
ໄຟລ​໌​ລະ​ຫັດ​, ແຕ່​ວ່າ​ໂດຍ​ການ​ເລີ່ມ​ຕົ້ນ​ຄໍາ​ແນະ​ນໍາ​ການ​ສັງ​ລວມ​ເງື່ອນ​ໄຂ​ປ້ອງ​ກັນ​ບໍ່​ໃຫ້​ເຂົາ​ເຈົ້າ​
ການລວບລວມ.

−v ຂຽນໄຟລ໌ທີ່ມີຄໍາອະທິບາຍກ່ຽວກັບຕົວແຍກວິເຄາະແລະບົດລາຍງານການຂັດແຍ້ງ
ສ້າງຂຶ້ນໂດຍຄວາມບໍ່ແນ່ນອນໃນໄວຍາກອນ.

ດໍາເນີນງານ


ຄຳສັ່ງຕໍ່ໄປນີ້ແມ່ນຕ້ອງການ:

grammar ຊື່ເສັ້ນທາງຂອງໄຟລ໌ທີ່ມີຄໍາແນະນໍາ, ຕໍ່ມາເອີ້ນວ່າ grammar, for
parser ແມ່ນຈະຖືກສ້າງຂຶ້ນ. ຮູບແບບສໍາລັບໄວຍາກອນແມ່ນໄດ້ອະທິບາຍຢູ່ໃນ
ພາກສ່ວນຄຳອະທິບາຍຂະຫຍາຍ.

STDIN


ບໍ່​ໄດ້​ນໍາ​ໃຊ້.

ປັດໄຈນໍາເຂົ້າ ເອກະສານ


ໄຟລ໌ grammar ຈະ​ເປັນ​ໄຟລ​໌​ຂໍ້​ຄວາມ​ທີ່​ມີ​ຮູບ​ແບບ​ທີ່​ລະ​ບຸ​ໄວ້​ໃນ​ການ​ອະ​ທິ​ບາຍ​ການ​ຂະ​ຫຍາຍ​
ສ່ວນ.

ENVIRONMENT ຄວາມຮັບຜິດຊອບ


ຕົວແປສະພາບແວດລ້ອມຕໍ່ໄປນີ້ຈະສົ່ງຜົນກະທົບຕໍ່ການປະຕິບັດ yacc:

ພາສາ ໃຫ້ຄ່າເລີ່ມຕົ້ນສໍາລັບຕົວແປສາກົນທີ່ບໍ່ໄດ້ຕັ້ງ ຫຼື
null. (ເບິ່ງປະລິມານຄໍານິຍາມພື້ນຖານຂອງ POSIX.1-2008, ສ່ວນ 8.2,
Internationalization Variables ​ເພື່ອ​ຄວາມ​ກ້າວໜ້າ​ຂອງ​ການ​ຫັນ​ເປັນ​ສາກົນ
ຕົວແປທີ່ໃຊ້ເພື່ອກໍານົດຄ່າຂອງປະເພດທ້ອງຖິ່ນ.)

LC_ALL ຖ້າຕັ້ງເປັນຄ່າສະຕຣິງທີ່ບໍ່ຫວ່າງເປົ່າ, ລົບລ້າງຄ່າຂອງອັນອື່ນທັງໝົດ
ຕົວແປສາກົນ.

LC_CTYPE ກໍານົດທ້ອງຖິ່ນສໍາລັບການຕີຄວາມລໍາດັບຂອງ bytes ຂອງຂໍ້ມູນຂໍ້ຄວາມ
ເປັນຕົວອັກສອນ (ຕົວຢ່າງ, single-byte ກົງກັນຂ້າມກັບ multi-byte ຕົວອັກສອນໃນ
arguments ແລະ input ໄຟລ໌).

LC_MESSAGES
ກໍານົດທ້ອງຖິ່ນທີ່ຄວນຈະຖືກນໍາໃຊ້ເພື່ອຜົນກະທົບຕໍ່ຮູບແບບແລະເນື້ອໃນຂອງ
ຂໍ້ຄວາມການວິນິໄສທີ່ຂຽນເປັນຄວາມຜິດພາດມາດຕະຖານ.

NLSPATH ກໍານົດສະຖານທີ່ຂອງລາຍການຂໍ້ຄວາມສໍາລັບການປະມວນຜົນຂອງ LC_MESSAGES.

ໄດ້ ພາສາ ແລະ LC_* ຕົວແປຜົນກະທົບຕໍ່ການປະຕິບັດຂອງ yacc ຜົນປະໂຫຍດທີ່ໄດ້ກ່າວມາ. ໄດ້ ຕົ້ນຕໍ()
ຫນ້າທີ່ກໍານົດໃນ Yacc ຫ້ອງສະຫມຸດ ຈະໂທຫາ:

setlocale(LC_ALL, "")

ແລະດັ່ງນັ້ນໂຄງການທີ່ສ້າງຂຶ້ນໂດຍ yacc ຍັງຈະໄດ້ຮັບຜົນກະທົບຈາກເນື້ອໃນເຫຼົ່ານີ້
ຕົວແປໃນເວລາແລ່ນ.

ASYNCHRONOUS ເຫດການ


ເລີ່ມຕົ້ນ.

STDOUT


ບໍ່​ໄດ້​ນໍາ​ໃຊ້.

ສະດຸດ


ຖ້າ​ຫາກ​ວ່າ​ການ​ປ່ຽນ​ແປງ / ຫຼຸດ​ຜ່ອນ​ຫຼື​ຫຼຸດ​ຜ່ອນ / ຫຼຸດ​ຜ່ອນ​ຂໍ້​ຂັດ​ແຍ່ງ​ໄດ້​ຖືກ​ກວດ​ພົບ​ໃນ​ grammar, yacc ຈະ​ຂຽນ a
ລາຍງານຂໍ້ຂັດແຍ່ງເຫຼົ່ານັ້ນຕໍ່ກັບຄວາມຜິດພາດມາດຕະຖານໃນຮູບແບບທີ່ບໍ່ໄດ້ລະບຸ.

ຄວາມຜິດພາດມາດຕະຖານຍັງຈະຖືກນໍາໃຊ້ສໍາລັບຂໍ້ຄວາມວິນິດໄສ.

OUTPUT ເອກະສານ


ໄຟລ໌ລະຫັດ, ໄຟລ໌ຫົວ, ແລະໄຟລ໌ຄໍາອະທິບາຍຈະຕ້ອງເປັນໄຟລ໌ຂໍ້ຄວາມ. ທັງໝົດແມ່ນ
ອະທິບາຍຢູ່ໃນພາກສ່ວນຕໍ່ໄປນີ້.

ລະຫັດ ເອກະສານ
ໄຟລ໌ນີ້ຈະມີລະຫັດແຫຼ່ງ C ສໍາລັບ yyparse() ຫນ້າທີ່. ມັນຈະປະກອບດ້ວຍ
ລະ​ຫັດ​ສໍາ​ລັບ​ການ​ປະ​ຕິ​ບັດ semantic ຕ່າງໆ​ທີ່​ມີ​ການ​ທົດ​ແທນ macro ປະ​ຕິ​ບັດ​ກ່ຽວ​ກັບ​ພວກ​ເຂົາ​ເປັນ
ອະທິບາຍໄວ້ໃນສ່ວນຂະຫຍາຍຄຳອະທິບາຍ. ມັນຍັງຈະຕ້ອງມີສໍາເນົາຂອງ #ກໍານົດ
ຖະແຫຼງການໃນໄຟລ໌ສ່ວນຫົວ. ຖ້າ ກ % ສະຫະພັນ ປະກາດໃຊ້, ປະກາດໃຊ້
YYSTYPE ຈະຖືກລວມຢູ່ໃນໄຟລ໌ນີ້.

Header ເອກະສານ
ໄຟລ໌ສ່ວນຫົວຕ້ອງມີ #ກໍານົດ ຄໍາຖະແຫຼງທີ່ເຊື່ອມໂຍງຕົວເລກ token ກັບ
ຊື່ token. ນີ້ອະນຸຍາດໃຫ້ໄຟລ໌ແຫຼ່ງອື່ນທີ່ບໍ່ແມ່ນໄຟລ໌ລະຫັດເຂົ້າເຖິງລະຫັດ token.
ຖ້າຫາກວ່າເປັນ % ສະຫະພັນ ການປະກາດຖືກນໍາໃຊ້, ການປະກາດສໍາລັບ YYSTYPE ແລະ ພາຍນອກ YYSTYPE yylval
ການປະກາດຈະຖືກລວມຢູ່ໃນເອກະສານນີ້.

ລາຍລະອຽດ ເອກະສານ
ໄຟລ໌ຄໍາອະທິບາຍຈະຕ້ອງເປັນໄຟລ໌ຂໍ້ຄວາມທີ່ມີຄໍາອະທິບາຍຂອງເຄື່ອງຈັກຂອງລັດ
ທີ່ສອດຄ້ອງກັນກັບຕົວວິເຄາະ, ໂດຍໃຊ້ຮູບແບບທີ່ບໍ່ໄດ້ລະບຸ. ຂໍ້ຈໍາກັດສໍາລັບຕາຕະລາງພາຍໃນ (ເບິ່ງ
ຈໍາກັດ) ຍັງຈະຖືກລາຍງານ, ໃນລັກສະນະການປະຕິບັດທີ່ໄດ້ກໍານົດ. (ການ​ປະ​ຕິ​ບັດ​ບາງ​ຢ່າງ​
ອາດຈະໃຊ້ເຕັກນິກການຈັດສັນແບບເຄື່ອນໄຫວ ແລະບໍ່ມີຄ່າຈໍາກັດສະເພາະເພື່ອລາຍງານ.)

ອະທິບາຍ ລາຍລະອຽດ


ໄດ້ yacc ຄໍາສັ່ງຍອມຮັບພາສາທີ່ໃຊ້ເພື່ອກໍານົດໄວຍະກອນສໍາລັບພາສາເປົ້າຫມາຍ
ຈະຖືກວິເຄາະໂດຍຕາຕະລາງ ແລະລະຫັດທີ່ສ້າງຂຶ້ນໂດຍ yacc. ພາສາທີ່ຍອມຮັບໂດຍ yacc ເປັນຫນຶ່ງ
ໄວຍາກອນສໍາລັບພາສາເປົ້າຫມາຍແມ່ນໄດ້ອະທິບາຍຂ້າງລຸ່ມນີ້ໂດຍໃຊ້ yacc ພາ​ສາ​ປ້ອນ​ຕົວ​ມັນ​ເອງ​.

ວັດສະດຸປ້ອນ grammar ປະກອບມີກົດລະບຽບທີ່ອະທິບາຍໂຄງສ້າງການປ້ອນຂໍ້ມູນຂອງພາສາເປົ້າໝາຍ ແລະ
ລະ​ຫັດ​ທີ່​ຈະ​ໄດ້​ຮັບ​ການ​ຮຽກ​ຮ້ອງ​ໃນ​ເວ​ລາ​ທີ່​ກົດ​ລະ​ບຽບ​ເຫຼົ່າ​ນີ້​ໄດ້​ຮັບ​ການ​ຮັບ​ຮູ້​ເພື່ອ​ໃຫ້​ຄໍາ​ສັບ​ຕ່າງໆ​ທີ່​ກ່ຽວ​ຂ້ອງ​
ການກະທຳ. ລະ​ຫັດ​ທີ່​ຈະ​ປະ​ຕິ​ບັດ​ຈະ​ປະ​ກົດ​ວ່າ​ເປັນ​ອົງ​ການ​ຂອງ​ຂໍ້​ຄວາມ​ທີ່​ມີ​ຈຸດ​ປະ​ສົງ​ເປັນ C-
ລະຫັດພາສາ. ເນື້ອໃນຂອງຂໍ້ຄວາມເຫຼົ່ານີ້ຈະຕ້ອງບໍ່ມີ trigraphs ພາສາ C. ພາສາ C
inclusions ແມ່ນສົມມຸດວ່າປະກອບເປັນຫນ້າທີ່ທີ່ຖືກຕ້ອງໃນເວລາທີ່ປະມວນຜົນໂດຍ yacc ເຂົ້າໄປໃນຜົນຜະລິດຂອງມັນ
ໄຟລ໌. ລະຫັດລວມຢູ່ໃນວິທີການນີ້ຈະຖືກປະຕິບັດໃນລະຫວ່າງການຮັບຮູ້ຂອງ
ພາ​ສາ​ເປົ້າ​ຫມາຍ​.

ໃຫ້ໄວຍາກອນ, ໄດ້ yacc utility ສ້າງໄຟລ໌ທີ່ອະທິບາຍໄວ້ໃນ OUTPUT FILES
ພາກ. ໄຟລ໌ລະຫັດສາມາດຖືກລວບລວມແລະເຊື່ອມຕໍ່ໂດຍໃຊ້ c99. ຖ້າ​ຫາກ​ວ່າ​ການ​ປະ​ກາດ​ແລະ​
ພາກສ່ວນໂຄງການຂອງໄຟລ໌ໄວຍາກອນບໍ່ໄດ້ລວມເອົາຄໍານິຍາມຂອງ ຕົ້ນຕໍ( ), yylex(), ແລະ
yyerror(), ຜົນຜະລິດທີ່ລວບລວມຮຽກຮ້ອງໃຫ້ມີການເຊື່ອມຕໍ່ກັບສະບັບທີ່ສະຫນອງພາຍນອກຂອງເຫຼົ່ານັ້ນ
ຫນ້າທີ່. ສະບັບເລີ່ມຕົ້ນຂອງ ຕົ້ນຕໍ() ແລະ yyerror() ແມ່ນສະຫນອງໃຫ້ຢູ່ໃນ yacc ຫ້ອງສະຫມຸດແລະ
ສາ​ມາດ​ເຊື່ອມ​ຕໍ່​ໂດຍ​ການ​ນໍາ​ໃຊ້​ −l y ດໍາເນີນການກັບ c99. ໄດ້ yacc ການໂຕ້ຕອບຫ້ອງສະຫມຸດບໍ່ຈໍາເປັນຕ້ອງ
ຮອງຮັບການໂຕ້ຕອບກັບອັນອື່ນທີ່ບໍ່ແມ່ນຄ່າເລີ່ມຕົ້ນ yy ຄໍາ​ນໍາ​ຫນ້າ​ສັນ​ຍາ​ລັກ​. ຄໍາຮ້ອງສະຫມັກສະຫນອງ
ການ​ທໍາ​ງານ​ຂອງ​ການ​ວິ​ເຄາະ lexical​, yylex(); ໄດ້ lex ຜົນປະໂຫຍດໄດ້ຖືກອອກແບບໂດຍສະເພາະເພື່ອ
ສ້າງແບບປົກກະຕິດັ່ງກ່າວ.

ການປ້ອນຂໍ້ມູນ ພາສາ
ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​ຈະ​ຮັບ​ປະ​ກັນ​ວ່າ​ໄຟລ​໌​ສະ​ເພາະ​ທຸກ​ປະ​ກອບ​ດ້ວຍ​ສາມ​ພາກ​ສ່ວນ​ໃນ​
ສັ່ງ: ການປະກາດ, grammar ກົດລະບຽບ, ແລະ ໂຄງການ, ແຍກໂດຍ double
ຕົວອັກສອນ ("%%"). ພາກສ່ວນການປະກາດ ແລະໂຄງການສາມາດຫວ່າງເປົ່າໄດ້. ຖ້າອັນສຸດທ້າຍແມ່ນ
ຫວ່າງເປົ່າ, ກ່ອນຫນ້ານີ້ "%%" ໝາຍການແຍກມັນອອກຈາກພາກສ່ວນກົດລະບຽບສາມາດຖືກລະເວັ້ນ.

ການປ້ອນຂໍ້ມູນແມ່ນຂໍ້ຄວາມແບບຟອມຟຣີຕາມໂຄງສ້າງຂອງໄວຍະກອນທີ່ກຳນົດໄວ້ຂ້າງລຸ່ມນີ້.

ໃບລານ ໂຄງສ້າງ of ໄດ້ Grammar
ໄດ້ , , ແລະ ລັກສະນະຈະຖືກລະເລີຍ, ຍົກເວັ້ນວ່າ
ຄໍາຮ້ອງສະຫມັກຈະຕ້ອງຮັບປະກັນວ່າພວກມັນບໍ່ປາກົດຢູ່ໃນຊື່ຫຼືຫຼາຍຕົວອັກສອນສະຫງວນໄວ້
ສັນຍາລັກ. ຄໍາ​ເຫັນ​ຈະ​ໄດ້​ຮັບ​ການ​ປິດ​ລ້ອມ​ໃນ​ "/* ... */", ແລະສາມາດປາກົດຢູ່ທຸກບ່ອນທີ່ມີຊື່
ຖືກຕ້ອງ.

ຊື່​ມີ​ຄວາມ​ຍາວ​ໂດຍ​ຕົນ​ເອງ​, ປະ​ກອບ​ດ້ວຍ​ຕົວ​ອັກ​ສອນ​, ໄລ​ຍະ​ເວ​ລາ (.'.'), ຂີດກ້ອງ ('_'), ແລະ
ຕົວເລກທີ່ບໍ່ແມ່ນຕົວເລກເບື້ອງຕົ້ນ. ຕົວອັກສອນຕົວພິມໃຫຍ່ ແລະ ຕົວພິມນ້ອຍແມ່ນແຕກຕ່າງກັນ. ຄໍາຮ້ອງສະຫມັກທີ່ສອດຄ່ອງ
ບໍ່ຄວນໃຊ້ຊື່ທີ່ເລີ່ມຕົ້ນດ້ວຍ yy or YY ຕັ້ງແຕ່ yacc parser ໃຊ້ຊື່ດັ່ງກ່າວ. ຈໍານວນຫຼາຍຂອງ
ຊື່ປາກົດຢູ່ໃນຜົນຜະລິດສຸດທ້າຍຂອງ yacc, ແລະດັ່ງນັ້ນພວກເຂົາຄວນຈະຖືກເລືອກໃຫ້ສອດຄ່ອງກັບ
ກັບກົດລະບຽບເພີ່ມເຕີມທີ່ສ້າງຂຶ້ນໂດຍ C compiler ທີ່ຈະນໍາໃຊ້. ໂດຍສະເພາະພວກເຂົາປາກົດ
in #ກໍານົດ ຖະແຫຼງການ.

ຕົວໜັງສືຈະຕ້ອງປະກອບດ້ວຍຕົວໜັງສືອັນດຽວທີ່ຕິດຢູ່ໃນຕົວໜັງສືຄຳເວົ້າດຽວ. ທັງໝົດ
ລໍາດັບການຫລົບຫນີທີ່ສະຫນັບສະຫນູນສໍາລັບຄ່າຄົງທີ່ຂອງຕົວອັກສອນໂດຍມາດຕະຖານ ISO C ຈະເປັນ
ສະ ໜັບ ສະ ໜູນ ໂດຍ yacc.

ຄວາມສໍາພັນກັບການວິເຄາະ lexical ໄດ້ຖືກປຶກສາຫາລືໃນລາຍລະອຽດຂ້າງລຸ່ມນີ້.

ຄໍາຮ້ອງສະຫມັກຈະຕ້ອງຮັບປະກັນວ່າຕົວອັກສອນ NUL ບໍ່ໄດ້ຖືກນໍາໃຊ້ໃນກົດລະບຽບໄວຍາກອນຫຼື
ຕົວໜັງສື.

ການປະກາດ ສ່ວນ
ພາກສ່ວນການປະກາດໃຊ້ເພື່ອກໍານົດສັນຍາລັກທີ່ໃຊ້ເພື່ອກໍານົດພາສາເປົ້າຫມາຍ
ແລະຄວາມສໍາພັນຂອງເຂົາເຈົ້າກັບກັນແລະກັນ. ໂດຍສະເພາະ, ຫຼາຍຂອງຂໍ້ມູນເພີ່ມເຕີມ
ຕ້ອງການເພື່ອແກ້ໄຂຄວາມບໍ່ແນ່ນອນໃນໄວຍາກອນທີ່ບໍ່ມີເນື້ອໃນສໍາລັບພາສາເປົ້າຫມາຍແມ່ນ
ສະຫນອງໃຫ້ທີ່ນີ້.

ປົກກະຕິແລ້ວ yacc ມອບຫມາຍຄວາມສໍາພັນລະຫວ່າງຊື່ສັນຍາລັກທີ່ມັນສ້າງແລະຂອງເຂົາເຈົ້າ
ຄ່າຕົວເລກທີ່ຕິດພັນ. ພາກສ່ວນການປະກາດເຮັດໃຫ້ມັນເປັນໄປໄດ້ທີ່ຈະຄວບຄຸມການ
ການມອບຫມາຍຂອງຄຸນຄ່າເຫຼົ່ານີ້.

ມັນຍັງເປັນໄປໄດ້ທີ່ຈະຮັກສາຂໍ້ມູນ semantic ທີ່ກ່ຽວຂ້ອງກັບ tokens ໃນປະຈຸບັນ
stack parse ໃນພາສາ C ທີ່ຜູ້ໃຊ້ກໍານົດ ສະຫະພາບ, ຖ້າສະມາຊິກຂອງສະຫະພັນແມ່ນ
ກ່ຽວຂ້ອງກັບຊື່ຕ່າງໆໃນໄວຍະກອນ. ພາກສ່ວນການປະກາດໃຫ້ສໍາລັບ
ນີ້ເຊັ່ນດຽວກັນ.

ກຸ່ມທໍາອິດຂອງຜູ້ປະກາດຂ້າງລຸ່ມນີ້ທັງຫມົດຖືບັນຊີລາຍຊື່ຂອງຊື່ເປັນການໂຕ້ຖຽງ. ບັນຊີລາຍຊື່ນັ້ນສາມາດ
ທາງ​ເລືອກ​ຈະ​ນຳ​ໜ້າ​ດ້ວຍ​ຊື່​ຂອງ​ສະ​ມາ​ຊິກ​ສະ​ຫະ​ພາບ C (ເອີ້ນວ່າ a ໂຄດ​ຄໍາ​ສັ່ງ ຂ້າງລຸ່ມນີ້) ປະກົດຂຶ້ນ
ພາຍໃນ '<' ແລະ '>'. (ເປັນຂໍ້ຍົກເວັ້ນຂອງສົນທິສັນຍາ typographical ຂອງສ່ວນທີ່ເຫຼືອນີ້
ປະລິມານຂອງ POSIX.1-2008, ໃນກໍລະນີນີ້ໂຄດ​ຄໍາ​ສັ່ງ> ບໍ່ໄດ້ເປັນຕົວແທນຂອງຕົວແປ, ແຕ່
ຕົວ​ອັກ​ສອນ​ວົງ​ເລັບ​ມຸມ​ຕົວ​ຫນັງ​ສື​ອ້ອມ​ຂ້າງ​ສັນ​ຍາ​ລັກ​.) ການ​ນໍາ​ໃຊ້​ຂອງ​ ໂຄດ​ຄໍາ​ສັ່ງ ກໍານົດວ່າ
tokens ທີ່​ມີ​ຊື່​ຢູ່​ໃນ​ເສັ້ນ​ນີ້​ຈະ​ເປັນ​ປະ​ເພດ C ດຽວ​ກັນ​ກັບ​ສະ​ມາ​ຊິກ​ສະ​ຫະ​ພາບ​ທີ່​ອ້າງ​ອີງ​ໂດຍ
ໂຄດ​ຄໍາ​ສັ່ງ. ນີ້ແມ່ນປຶກສາຫາລືໃນລາຍລະອຽດເພີ່ມເຕີມຂ້າງລຸ່ມນີ້.

ສໍາລັບລາຍຊື່ທີ່ໃຊ້ເພື່ອກໍານົດ tokens, ຮູບລັກສະນະທໍາອິດຂອງ token ທີ່ໃຫ້ສາມາດປະຕິບັດຕາມ
ຈຳນວນເຕັມບວກ (ເປັນສະຕຣິງຂອງຕົວເລກທົດສະນິຍົມ). ຖ້ານີ້ແມ່ນເຮັດ, ມູນຄ່າພື້ນຖານ
ມອບຫມາຍໃຫ້ມັນສໍາລັບຈຸດປະສົງ lexical ຈະຖືກນໍາມາເປັນຕົວເລກນັ້ນ.

ຕໍ່ໄປນີ້ປະກາດ ຊື່ ເພື່ອ​ເປັນ​ເຄື່ອງ​ຫມາຍ​:

%ໂທເຄັນ [<ໂຄດ​ຄໍາ​ສັ່ງ>] ຊື່ [ຈໍານວນ] [ຊື່ [ຈໍານວນ]]...

If ໂຄດ​ຄໍາ​ສັ່ງ ປະຈຸບັນ, ປະເພດ C ສໍາລັບ tokens ທັງຫມົດໃນແຖວນີ້ຈະຖືກປະກາດວ່າເປັນປະເພດ
ອ້າງອີງໂດຍ ໂຄດ​ຄໍາ​ສັ່ງ. ຖ້າເປັນຈໍານວນບວກ, ຈໍານວນ, ດັ່ງຕໍ່ໄປນີ້ a ຊື່, ມູນຄ່ານັ້ນຈະເປັນ
ມອບຫມາຍໃຫ້ token ໄດ້.

ຕໍ່ໄປນີ້ປະກາດ ຊື່ ເພື່ອ​ເປັນ​ເຄື່ອງ​ຫມາຍ​, ແລະ​ກໍາ​ນົດ​ຄວາມ​ສໍາ​ຄັນ​ກັບ​ມັນ​:

ເຫຼືອ % [<ໂຄດ​ຄໍາ​ສັ່ງ>] ຊື່ [ຈໍານວນ] [ຊື່ [ຈໍານວນ]]...
% ສິດ [<ໂຄດ​ຄໍາ​ສັ່ງ>] ຊື່ [ຈໍານວນ] [ຊື່ [ຈໍານວນ]]...

ໜຶ່ງ ຫຼືຫຼາຍເສັ້ນ, ແຕ່ລະຈຸດເລີ່ມຕົ້ນດ້ວຍສັນຍາລັກເຫຼົ່ານີ້, ສາມາດປາກົດຢູ່ໃນພາກນີ້.
ໂທເຄັນທັງໝົດຢູ່ໃນແຖວດຽວກັນມີລະດັບຄວາມສຳຄັນ ແລະການເຊື່ອມໂຍງກັນ; ສາຍ
ແມ່ນຢູ່ໃນລໍາດັບຂອງການເພີ່ມຂຶ້ນກ່ອນຫນ້າຫຼືຄວາມເຂັ້ມແຂງຜູກມັດ. ເຫຼືອ % ຫມາຍເຖິງວ່າ
ຜູ້ປະກອບການຢູ່ໃນເສັ້ນນັ້ນຖືກປະໄວ້ສະມາຄົມ, ແລະ % ສິດ ເຊັ່ນດຽວກັນຫມາຍເຖິງສິດ
ຜູ້ປະກອບການສະມາຄົມ. ຖ້າ ໂຄດ​ຄໍາ​ສັ່ງ ປະຈຸບັນ, ມັນຈະປະກາດປະເພດ C ສໍາລັບ ຊື່s ດັ່ງທີ່ອະທິບາຍ
ສໍາລັບການ %ໂທເຄັນ.

ຕໍ່ໄປນີ້ປະກາດ ຊື່ ເປັນ token, ແລະຊີ້ໃຫ້ເຫັນວ່ານີ້ບໍ່ສາມາດຖືກນໍາໃຊ້
ສະມາຄົມ:

%nonassoc [<ໂຄດ​ຄໍາ​ສັ່ງ>] ຊື່ [ຈໍານວນ] [ຊື່ [ຈໍານວນ]]...

ຖ້າຕົວວິເຄາະພົບການເຊື່ອມໂຍງກັບການໃຊ້ໂທເຄັນນີ້, ມັນຈະລາຍງານຂໍ້ຜິດພາດ. ຖ້າ ໂຄດ​ຄໍາ​ສັ່ງ is
ໃນປັດຈຸບັນ, ມັນຈະປະກາດປະເພດ C ສໍາລັບ ຊື່s ດັ່ງທີ່ອະທິບາຍໄວ້ %ໂທເຄັນ.

ຕໍ່ໄປນີ້ປະກາດວ່າສະມາຊິກສະຫະພັນ ຊື່s ແມ່ນບໍ່ຢູ່ປາຍຍອດ, ແລະດັ່ງນັ້ນຈຶ່ງຕ້ອງການ
to have a ໂຄດ​ຄໍາ​ສັ່ງ ພາກ​ສະ​ຫນາມ​ໃນ​ຕອນ​ຕົ້ນ​ຂອງ​ຕົນ​:

ປະເພດ <ໂຄດ​ຄໍາ​ສັ່ງ> ຊື່...

ເນື່ອງຈາກວ່າມັນປະຕິບັດກັບທີ່ບໍ່ແມ່ນຕົວກໍານົດການເທົ່ານັ້ນ, ການມອບຫມາຍເລກ token ຫຼືການນໍາໃຊ້ຕົວຫນັງສືແມ່ນ
ຍັງຫ້າມ. ຖ້າຫາກວ່າການກໍ່ສ້າງນີ້ແມ່ນມີ, yacc ຈະດໍາເນີນການກວດກາປະເພດ; ຖ້ານີ້
ການກໍ່ສ້າງບໍ່ມີຢູ່, stack parse ຈະຖືພຽງແຕ່ໄດ້ int ປະເພດ

ທຸກໆຊື່ທີ່ໃຊ້ໃນ grammar ບໍ່ໄດ້ກໍານົດໂດຍ a %ໂທເຄັນ, ເຫຼືອ %, % ສິດ, ຫຼື %nonassoc
ການປະກາດແມ່ນຖືວ່າເປັນຕົວແທນຂອງສັນຍາລັກທີ່ບໍ່ແມ່ນຢູ່ປາຍຍອດ. ໄດ້ yacc ຜົນປະໂຫຍດຈະຕ້ອງລາຍງານ
ຂໍ້ຜິດພາດຂອງສັນຍາລັກທີ່ບໍ່ແມ່ນເຄື່ອງໝາຍປາຍທາງທີ່ບໍ່ປາກົດຢູ່ເບື້ອງຊ້າຍຂອງຢ່າງໜ້ອຍໜຶ່ງອັນ
ກົດລະບຽບໄວຍາກອນ.

ເມື່ອລະບຸປະເພດ, ລຳດັບຕົ້ນ, ຫຼືຕົວເລກໂທເຄັນຂອງຊື່, ມັນຈະບໍ່ແມ່ນ
ປ່ຽນແປງ. ຖ້າການປະກາດທຳອິດຂອງໂທເຄັນບໍ່ໄດ້ກຳນົດໝາຍເລກໂທເຄັນ, yacc ຈະ
ມອບຫມາຍເລກໂທເຄັນ. ເມື່ອການມອບໝາຍນີ້ຖືກເຮັດ, ໝາຍເລກໂທເຄັນຈະບໍ່ຖືກປ່ຽນແປງ
ໂດຍ​ການ​ມອບ​ຫມາຍ​ຢ່າງ​ຊັດ​ເຈນ​.

ຜູ້ປະກາດຕໍ່ໄປນີ້ບໍ່ໄດ້ປະຕິບັດຕາມຮູບແບບທີ່ຜ່ານມາ.

ຕໍ່ໄປນີ້ປະກາດການທີ່ບໍ່ແມ່ນຢູ່ປາຍຍອດ ຊື່ ຈະເປັນ ການເລີ່ມຕົ້ນ ສັນຍາລັກ, ເຊິ່ງເປັນຕົວແທນຂອງ
ທີ່ໃຫຍ່ທີ່ສຸດ, ໂຄງສ້າງທົ່ວໄປທີ່ສຸດທີ່ອະທິບາຍໂດຍກົດລະບຽບໄວຍາກອນ:

% ເລີ່ມ ຊື່

ໂດຍຄ່າເລີ່ມຕົ້ນ, ມັນແມ່ນຊ້າຍມືຂອງກົດລະບຽບໄວຍາກອນທໍາອິດ; ຄ່າເລີ່ມຕົ້ນນີ້ສາມາດເປັນ
overridden ກັບ​ການ​ປະ​ກາດ​ນີ້​.

ຕໍ່ໄປນີ້ປະກາດວ່າ yacc stack ມູນ​ຄ່າ​ທີ່​ຈະ​ເປັນ​ສະ​ຫະ​ພາບ​ຂອງ​ປະ​ເພດ​ຕ່າງໆ​ຂອງ​ຄ່າ​
ຕ້ອງການ.

% ສະຫະພັນ { ຮ່າງກາຍ of ສະຫະພາບ (in C)}}

ຮ່າງກາຍຂອງສະຫະພັນຈະຕ້ອງບໍ່ມີເຄື່ອງໝາຍການປຸງແຕ່ງເສັ້ນໂຄ້ງທີ່ບໍ່ສົມດູນກັນ.

ໂດຍຄ່າເລີ່ມຕົ້ນ, ຄ່າທີ່ສົ່ງຄືນໂດຍການກະທໍາ (ເບິ່ງຂ້າງລຸ່ມນີ້) ແລະການວິເຄາະ lexical ຈະເປັນ
ຂອງປະເພດ int. ໄດ້ yacc ຜົນປະໂຫຍດຮັກສາຕິດຕາມຂອງປະເພດ, ແລະມັນຈະຕ້ອງໃສ່ທີ່ສອດຄ້ອງກັນ
ຊື່ສະມາຊິກຂອງສະຫະພັນເພື່ອປະຕິບັດການກວດສອບປະເພດທີ່ເຄັ່ງຄັດຂອງ parser ຜົນໄດ້ຮັບ.

ອີກທາງເລືອກ, ໃຫ້ມັນຢ່າງຫນ້ອຍຫນຶ່ງໂຄດ​ຄໍາ​ສັ່ງ> ການກໍ່ສ້າງຖືກນໍາໃຊ້, ສະຫະພັນສາມາດປະກາດໄດ້
ໃນ​ໄຟລ​໌ header (ຊຶ່ງ​ຈະ​ຖືກ​ລວມ​ເຂົ້າ​ໃນ​ພາກ​ປະ​ກາດ​ໂດຍ​ການ​ນໍາ​ໃຊ້ a #include
ກໍ່ສ້າງພາຍໃນ %{ ແລະ %}), ແລະກ ພິມປະເພດ ໃຊ້ເພື່ອກໍານົດສັນຍາລັກ YYSTYPE ເພື່ອເປັນຕົວແທນ
ສະຫະພັນນີ້. ຜົນກະທົບຂອງ % ສະຫະພັນ ແມ່ນເພື່ອສະຫນອງການປະກາດຂອງ YYSTYPE ໂດຍກົງຈາກ
ໄດ້ yacc input

ການປະກາດ ແລະຄຳນິຍາມຂອງພາສາ C ສາມາດປາກົດຢູ່ໃນພາກສ່ວນການປະກາດ, ຖືກປິດໄວ້
ໂດຍ​ເຄື່ອງ​ຫມາຍ​ດັ່ງ​ຕໍ່​ໄປ​ນີ້​:

%{ ... %}

ຄໍາຖະແຫຼງເຫຼົ່ານີ້ຈະຖືກຄັດລອກເຂົ້າໄປໃນໄຟລ໌ລະຫັດ, ແລະມີຂອບເຂດທົ່ວໂລກພາຍໃນມັນ
ວ່າພວກເຂົາສາມາດຖືກນໍາໃຊ້ໃນກົດລະບຽບແລະພາກສ່ວນໂຄງການ. ຖະແຫຼງການຈະຕ້ອງບໍ່ມີ
"%}" ຢູ່ນອກຄຳຄິດເຫັນ, ຕົວໜັງສືສະຕຣິງ, ຫຼືຫຼາຍຕົວອັກສອນຄົງທີ່.

ຄໍາຮ້ອງສະຫມັກຈະຕ້ອງຮັບປະກັນວ່າພາກສ່ວນການປະກາດຖືກຍົກເລີກໂດຍ token %%.

Grammar ກົດລະບຽບ in yacc
ພາກສ່ວນກົດລະບຽບກໍານົດໄວຍາກອນທີ່ບໍ່ມີບໍລິບົດທີ່ຈະຍອມຮັບໂດຍຟັງຊັນ yacc
ສ້າງ, ແລະເຊື່ອມໂຍງກັບກົດລະບຽບເຫຼົ່ານັ້ນ ການກະທໍາຂອງພາສາ C ແລະຄວາມສໍາຄັນເພີ່ມເຕີມ
ຂໍ້ມູນ. ໄວຍະກອນໄດ້ຖືກອະທິບາຍຂ້າງລຸ່ມນີ້, ແລະຄໍານິຍາມຢ່າງເປັນທາງການດັ່ງຕໍ່ໄປນີ້.

ພາກສ່ວນກົດລະບຽບແມ່ນປະກອບດ້ວຍຫນຶ່ງຫຼືຫຼາຍກົດລະບຽບໄວຍາກອນ. ກົດລະບຽບໄວຍາກອນມີຮູບແບບ:

A : ຮ່າງກາຍ ;

ສັນຍາລັກ A ເປັນຕົວແທນຂອງຊື່ທີ່ບໍ່ແມ່ນຊື່, ແລະ ຮ່າງກາຍ ເປັນຕົວແທນຂອງລໍາດັບຂອງສູນຫຼື
ເພີ່ມເຕີມ ຊື່s, literals, and ຄວາມາຍ ການປະຕິບັດs ທີ່ຫຼັງຈາກນັ້ນສາມາດປະຕິບັດຕາມໂດຍທາງເລືອກ
ກ່ອນ ໜ້າ ກົດລະບຽບດ. ພຽງແຕ່ຊື່ແລະຕົວຫນັງສືເຂົ້າຮ່ວມໃນການສ້າງຕັ້ງຂອງ
ໄວຍາກອນ; ການປະຕິບັດ semantic ແລະກົດລະບຽບກ່ອນຫນ້າແມ່ນຖືກນໍາໃຊ້ໃນທາງອື່ນ. ໄດ້ ແລະ
ໄດ້ ແມ່ນ yacc ເຄື່ອງໝາຍວັກຕອນ. ຖ້າ​ຫາກ​ວ່າ​ມີ​ກົດ​ລະ​ບຽບ​ໄວ​ຍະ​ກອນ​ສໍາ​ເລັດ​ຫຼາຍ​ກັບ​
ດ້ານຊ້າຍມືດຽວກັນ, ໄດ້ ('|') ສາມາດຖືກນໍາໃຊ້ເພື່ອຫຼີກເວັ້ນການຂຽນຄືນໃຫມ່
ຊ້າຍມື; ໃນ​ກໍ​ລະ​ນີ​ນີ້​ ປະກົດພຽງແຕ່ຫຼັງຈາກກົດລະບຽບສຸດທ້າຍ. ຮ່າງ​ກາຍ
ພາກສ່ວນສາມາດຫວ່າງເປົ່າ (ຫຼືຫວ່າງເປົ່າຂອງຊື່ແລະຕົວຫນັງສື) ເພື່ອຊີ້ບອກວ່າບໍ່ແມ່ນ terminal
ສັນຍາລັກກົງກັບສະຕຣິງຫວ່າງເປົ່າ.

ໄດ້ yacc utility ມອບຫມາຍເລກທີ່ບໍ່ຊ້ໍາກັນໃຫ້ກັບແຕ່ລະກົດລະບຽບ. ກົດລະບຽບການນໍາໃຊ້ແຖບຕັ້ງ
notation ແມ່ນກົດລະບຽບທີ່ແຕກຕ່າງກັນ. ຕົວເລກທີ່ຖືກກໍານົດໃຫ້ກົດລະບຽບຈະປາກົດຢູ່ໃນຄໍາອະທິບາຍ
ຍື່ນ.

ອົງ​ປະ​ກອບ​ທີ່​ປະ​ກອບ​ດ້ວຍ​ຮ່າງ​ກາຍ​ແມ່ນ​:

ຊື່, literal
ເຫຼົ່ານີ້ແມ່ນກົດລະບຽບຂອງໄວຍາກອນ: ຊື່ ແມ່ນບໍ່ວ່າຈະເປັນ token ຫຼື ບໍ່ຢູ່ປາຍຍອດ;
literal ຫຍໍ້ມາຈາກຕົວມັນເອງ (ໜ້ອຍກວ່າເຄື່ອງໝາຍວົງຢືມທີ່ຕ້ອງການ).

ຄວາມາຍ ການປະຕິບັດ
ດ້ວຍແຕ່ລະກົດລະບຽບໄວຍະກອນ, ຜູ້ໃຊ້ສາມາດເຊື່ອມໂຍງການປະຕິບັດທີ່ຈະປະຕິບັດໃນແຕ່ລະຄັ້ງ
ກົດລະບຽບໄດ້ຖືກຮັບຮູ້ໃນຂະບວນການປ້ອນຂໍ້ມູນ. (ໃຫ້ສັງເກດວ່າຄໍາວ່າ "ການກະທໍາ" ສາມາດ
ຍັງອ້າງອີງເຖິງການກະທຳຂອງຕົວວິເຄາະ—shift, ຫຼຸດ, ແລະອື່ນໆ.)

ການປະຕິບັດເຫຼົ່ານີ້ສາມາດສົ່ງຄືນຄ່າແລະສາມາດໄດ້ຮັບຄ່າທີ່ສົ່ງຄືນໂດຍກ່ອນຫນ້ານີ້
ການກະທໍາ. ຄ່າເຫຼົ່ານີ້ຖືກເກັບໄວ້ໃນວັດຖຸປະເພດ YYSTYPE (ເບິ່ງ % ສະຫະພັນ) The
ມູນຄ່າຜົນຂອງການປະຕິບັດຈະຖືກເກັບຮັກສາໄວ້ໃນ stack parse ດ້ວຍມືຊ້າຍ
ຂ້າງຂອງກົດລະບຽບ, ທີ່ຈະໄດ້ຮັບການເຂົ້າເຖິງໂດຍການຫຼຸດຜ່ອນອື່ນໆເປັນສ່ວນຫນຶ່ງຂອງມືຂວາຂອງເຂົາເຈົ້າ
ຂ້າງ. ໂດຍ​ການ​ນໍາ​ໃຊ້​ໂຄດ​ຄໍາ​ສັ່ງ> ຂໍ້​ມູນ​ທີ່​ສະ​ຫນອງ​ໃຫ້​ໃນ​ພາກ​ປະ​ກາດ​, ໄດ້​
ລະຫັດທີ່ສ້າງຂຶ້ນໂດຍ yacc ສາມາດຖືກກວດກາປະເພດຢ່າງເຂັ້ມງວດ ແລະບັນຈຸມີ arbitrary
ຂໍ້ມູນ. ນອກຈາກນັ້ນ, ການວິເຄາະ lexical ສາມາດສະຫນອງປະເພດດຽວກັນຂອງ
ຄ່າສໍາລັບ tokens, ຖ້າຕ້ອງການ.

ການກະ ທຳ ເປັນ ຄຳ ຖະແຫຼງ C ທີ່ບໍ່ມັກແລະດັ່ງນັ້ນສາມາດເຮັດການປ້ອນຂໍ້ມູນຫຼືອອກ, ໂທ
ໂຄງການຍ່ອຍ, ແລະປ່ຽນແປງຕົວແປພາຍນອກ. ຄຳສັ່ງແມ່ນໜຶ່ງ ຫຼື ຫຼາຍຄຳຖະແຫຼງ C
ຫຸ້ມຢູ່ໃນວົງເລັບ curly '{' ແລະ '}'. ຖະແຫຼງການຈະຕ້ອງບໍ່ມີ
tokens ການປະມວນຜົນກ່ອນການເຮັດເຊືອກຜູກ curly unbalanced.

ບາງຕົວແປ pseudo ສາມາດຖືກນໍາໃຊ້ໃນການປະຕິບັດ. ເຫຼົ່ານີ້ແມ່ນ macro ສໍາລັບການເຂົ້າເຖິງ
ກັບໂຄງສ້າງຂໍ້ມູນທີ່ຮູ້ຈັກພາຍໃນ yacc.

$$ ຄ່າຂອງການປະຕິບັດສາມາດຖືກກໍານົດໂດຍການມອບຫມາຍໃຫ້ $$. ຖ້າປະເພດ
ການກວດສອບຖືກເປີດໃຊ້ງານ ແລະປະເພດຂອງຄ່າທີ່ຈະມອບໝາຍບໍ່ໄດ້
ຖືກກໍານົດ, ຂໍ້ຄວາມການວິນິດໄສອາດຈະຖືກສ້າງຂື້ນ.

$ຈໍານວນ ນີ້ຫມາຍເຖິງມູນຄ່າທີ່ສົ່ງຄືນໂດຍອົງປະກອບທີ່ລະບຸໄວ້ໂດຍ
token ຈໍານວນ ໃນເບື້ອງຂວາຂອງກົດລະບຽບ, ການອ່ານຈາກຊ້າຍໄປຂວາ;
ຈໍານວນ ສາມາດເປັນສູນ ຫຼືລົບ. ຖ້າ ຈໍານວນ ແມ່ນສູນຫຼືລົບ, ມັນ
ໝາຍເຖິງຂໍ້ມູນທີ່ກ່ຽວຂ້ອງກັບຊື່ໃນ stack ຂອງຕົວແຍກວິເຄາະ
ກ່ອນສັນຍາລັກຊ້າຍສຸດຂອງກົດລະບຽບໃນປະຈຸບັນ. (ນັ້ນ​ແມ່ນ, "$0"
ຫມາຍເຖິງຊື່ທັນທີກ່ອນຊື່ຊ້າຍສຸດໃນ
ກົດ​ລະ​ບຽບ​ໃນ​ປະ​ຈຸ​ບັນ​ຈະ​ໄດ້​ຮັບ​ການ​ພົບ​ເຫັນ​ຢູ່​ໃນ stack ຂອງ parser ແລະ​ "$−1" ຫມາຍເຖິງ
ສັນຍາລັກກັບ ຂອງຕົນ ຊ້າຍ.) ຖ້າ ຈໍານວນ ຫມາຍເຖິງອົງປະກອບທີ່ຜ່ານມາໃນປະຈຸບັນ
ຈຸດໃນກົດລະບຽບ, ຫຼືເກີນລຸ່ມຂອງ stack, ຜົນໄດ້ຮັບແມ່ນ
ບໍ່ໄດ້ກໍານົດ. ຖ້າການກວດສອບປະເພດຖືກເປີດໃຊ້ງານແລະປະເພດຂອງຄ່າທີ່ຈະເປັນ
ການມອບໝາຍບໍ່ສາມາດກຳນົດໄດ້, ຂໍ້ຄວາມການວິນິໄສອາດຈະຖືກສ້າງຂື້ນ.

$<ໂຄດ​ຄໍາ​ສັ່ງ>ຈໍານວນ
ເຫຼົ່ານີ້ກົງກັນແທ້ກັບສັນຍາລັກທີ່ສອດຄ້ອງກັນໂດຍບໍ່ມີການ ໂຄດ​ຄໍາ​ສັ່ງ
ລວມ, ແຕ່ອະນຸຍາດໃຫ້ມີການກວດສອບປະເພດທີ່ເຂັ້ມງວດ (ແລະຂັດຂວາງສິ່ງທີ່ບໍ່ຕ້ອງການ
ປະເພດການແປງ). ຜົນກະທົບແມ່ນວ່າມະຫາພາກແມ່ນຂະຫຍາຍໄປໃຊ້ ໂຄດ​ຄໍາ​ສັ່ງ
ເພື່ອເລືອກອົງປະກອບຈາກສະຫະພັນ YYSTYPE (ໂດຍໃຊ້ dataname.tag).
ນີ້ແມ່ນເປັນປະໂຫຍດໂດຍສະເພາະຖ້າ ຈໍານວນ ບໍ່ແມ່ນບວກ.

$<ໂຄດ​ຄໍາ​ສັ່ງ>$ ອັນນີ້ບັງຄັບໃຫ້ມີການອ້າງອິງເຖິງປະເພດຂອງສະມາຊິກສະຫະພັນທີ່ອ້າງອີງ
by ໂຄດ​ຄໍາ​ສັ່ງ. ການ​ກໍ່​ສ້າງ​ນີ້​ແມ່ນ​ໃຊ້​ໄດ້​ໃນ​ເວ​ລາ​ທີ່​ກະ​ສານ​ອ້າງ​ອີງ​ທາງ​ຊ້າຍ​
ຄ່າບໍລິບົດເກີດຂຶ້ນໃນໄວຍະກອນ, ແລະສະຫນອງ yacc ດ້ວຍວິທີ
ສໍາ​ລັບ​ການ​ເລືອກ​ປະ​ເພດ​.

ການປະຕິບັດສາມາດເກີດຂື້ນໄດ້ທຸກບ່ອນໃນກົດລະບຽບ (ບໍ່ພຽງແຕ່ຢູ່ໃນຕອນທ້າຍ); ການປະຕິບັດສາມາດເຂົ້າເຖິງໄດ້
ຄ່າທີ່ສົ່ງຄືນໂດຍການກະ ທຳ ໄປທາງຊ້າຍຂອງມັນ, ແລະໃນທາງກັບກັນ, ມູນຄ່າທີ່ມັນກັບຄືນມາສາມາດເປັນ
ເຂົ້າເຖິງໂດຍການປະຕິບັດທາງຂວາຂອງມັນ. ການກະ ທຳ ທີ່ປາກົດຢູ່ເຄິ່ງກາງຂອງກົດລະບຽບ
ຈະເທົ່າກັບການປ່ຽນແທນການກະທຳດ້ວຍສັນຍາລັກທີ່ບໍ່ແມ່ນເຄື່ອງໝາຍປາຍທາງໃໝ່ ແລະ
ເພີ່ມກົດລະບຽບຫວ່າງເປົ່າທີ່ມີສັນຍາລັກທີ່ບໍ່ແມ່ນຈຸດຢູ່ໃນເບື້ອງຊ້າຍ. ໄດ້
ການປະຕິບັດ semantic ທີ່ກ່ຽວຂ້ອງກັບກົດລະບຽບໃຫມ່ຈະທຽບເທົ່າກັບຕົ້ນສະບັບ
ການກະທຳ. ການນໍາໃຊ້ການກະທໍາພາຍໃນກົດລະບຽບອາດຈະແນະນໍາຂໍ້ຂັດແຍ່ງທີ່ຈະບໍ່
ຖ້າບໍ່ດັ່ງນັ້ນ.

ໂດຍຄ່າເລີ່ມຕົ້ນ, ມູນຄ່າຂອງກົດລະບຽບຈະເປັນມູນຄ່າຂອງອົງປະກອບທໍາອິດໃນມັນ.
ຖ້າອົງປະກອບທໍາອິດບໍ່ມີປະເພດ (ໂດຍສະເພາະໃນກໍລະນີຂອງ a
literal) ແລະການກວດສອບປະເພດແມ່ນເປີດໂດຍ ປະເພດ, ຂໍ້​ຄວາມ​ຜິດ​ພາດ​ຈະ​ເປັນ​ຜົນ​.

ກ່ອນ ໜ້າ
ຄຳ ສຳ ຄັນ %prec ສາມາດໃຊ້ເພື່ອປ່ຽນລະດັບກ່ອນໜ້າທີ່ກ່ຽວຂ້ອງກັບ a
ກົດລະບຽບໄວຍາກອນໂດຍສະເພາະ. ຕົວຢ່າງນີ້ແມ່ນໃນກໍລະນີທີ່ unary ແລະ binary
ຜູ້ປະກອບການມີສັນຍາລັກດຽວກັນ, ແຕ່ຕ້ອງການໃຫ້ແຕກຕ່າງກັນ
ກ່ອນໜ້າ, ຫຼືບ່ອນທີ່ການຈັດການການກໍ່ສ້າງທີ່ບໍ່ຊັດເຈນ ຖ້າເປັນອັນອື່ນ
ຈໍາເປັນ. ສັນຍາລັກສະຫງວນ %prec ສາມາດປາກົດທັນທີຫຼັງຈາກຮ່າງກາຍຂອງ
ກົດລະບຽບໄວຍາກອນແລະສາມາດປະຕິບັດຕາມໂດຍຊື່ token ຫຼືຕົວຫນັງສື. ມັນຈະ
ເຮັດໃຫ້ຄວາມສຳຄັນຂອງຫຼັກໄວຍາກອນກາຍເປັນຂອງ token ຕໍ່ໄປນີ້
ຊື່ຫຼືຕົວຫນັງສື. ການປະຕິບັດສໍາລັບກົດລະບຽບທັງຫມົດສາມາດປະຕິບັດຕາມ %prec.

ຖ້າພາກສ່ວນໂຄງການປະຕິບັດຕາມ, ຄໍາຮ້ອງສະຫມັກຈະຕ້ອງຮັບປະກັນວ່າກົດລະບຽບໄວຍາກອນແມ່ນ
ສິ້ນສຸດໂດຍ %%.

ໂຄງການ ສ່ວນ
ໄດ້ ໂຄງການ ພາກສ່ວນສາມາດປະກອບມີຄໍານິຍາມຂອງການວິເຄາະ lexical yylex(), ແລະໃດໆ
ຫນ້າທີ່ອື່ນໆ; ຕົວຢ່າງ, ທີ່ໃຊ້ໃນການປະຕິບັດທີ່ລະບຸໄວ້ໃນກົດລະບຽບໄວຍາກອນ. ມັນ
ບໍ່ໄດ້ລະບຸວ່າພາກສ່ວນໂຄງການຈະນໍາໜ້າ ຫຼືປະຕິບັດຕາມການກະທຳ semantic ໃນ
ໄຟລ໌ຜົນຜະລິດ; ດັ່ງນັ້ນ, ຖ້າຄໍາຮ້ອງສະຫມັກມີຄໍານິຍາມມະຫາພາກແລະ
ການປະກາດທີ່ມີຈຸດປະສົງເພື່ອນໍາໃຊ້ກັບລະຫັດໃນການປະຕິບັດ semantic, ມັນຈະວາງພວກມັນ
ພາຍໃນ "%{ ... %}" ຢູ່ໃນພາກສ່ວນການປະກາດ.

ການປ້ອນຂໍ້ມູນ Grammar
ການປ້ອນຂໍ້ມູນຕໍ່ໄປນີ້ໃສ່ yacc yields parser ສໍາລັບ input ກັບ yacc. syntax ຢ່າງເປັນທາງການນີ້
ມີຄວາມສຳຄັນກວ່າຄຳອະທິບາຍໄວຍະກອນຂໍ້ຄວາມກ່ອນໜ້າ.

ໂຄງປະກອບການ lexical ຖືກກໍານົດຫນ້ອຍທີ່ຊັດເຈນ; ໃບລານ ໂຄງສ້າງ of ໄດ້ Grammar ກໍານົດ
ຂໍ້ກໍານົດສ່ວນໃຫຍ່. ການຕອບຮັບລະຫວ່າງຂໍ້ກໍານົດທີ່ຜ່ານມາແລະ tokens ຂ້າງລຸ່ມນີ້ແມ່ນເປັນ
ຕໍ່ໄປນີ້.

ຕົວລະບຸຕົວຕົນ ນີ້ເທົ່າກັບແນວຄວາມຄິດຂອງ ຊື່, ມອບໃຫ້ກ່ອນຫນ້ານີ້. ມັນຍັງປະກອບມີ
ຕົວອັກສອນຕາມທີ່ໄດ້ກໍານົດໄວ້ກ່ອນຫນ້ານີ້.

C_IDENTIFIER
ນີ້ແມ່ນຊື່, ແລະນອກຈາກນັ້ນມັນເປັນທີ່ຮູ້ຈັກທີ່ຈະປະຕິບັດຕາມໂດຍ a . ກ
ຕົວອັກສອນບໍ່ສາມາດໃຫ້ຜົນໄດ້ຮັບ token ນີ້.

NUMBER ສະຕຣິງຂອງຕົວເລກ (ຈຳນວນທົດສະນິຍົມທີ່ບໍ່ແມ່ນລົບ).

TYPE, LEFT, MARK, LCURL, RCURL
ເຫຼົ່ານີ້ກົງກັນໂດຍກົງກັບ ປະເພດ, ເຫຼືອ %, %%, %{, ແລະ %}.

{ ... } ນີ້ຊີ້ໃຫ້ເຫັນລະຫັດແຫຼ່ງພາສາ C, ດ້ວຍການລວມເອົາທີ່ເປັນໄປໄດ້ '$'
ມະຫາພາກຕາມທີ່ໄດ້ສົນທະນາຜ່ານມາ.

/* Grammar ສໍາລັບການ ໄດ້ ການປ້ອນຂໍ້ມູນ to yacc. */
/* ພື້ນຖານ ການອອກສຽງ. */
/* ໄດ້ ດັ່ງຕໍ່ໄປນີ້ ມີ ຮັບການຍອມຮັບ by ໄດ້ lexical ນັກວິເຄາະ. */

%token IDENTIFIER /* ລວມມີຕົວລະບຸຕົວຕົນ ແລະຕົວໜັງສື */
%token C_IDENTIFIER /* ຕົວລະບຸ (ແຕ່ບໍ່ແມ່ນຕົວໜັງສື)
ຕິດຕາມດ້ວຍ :. */
%token NUMBER /* [0-9][0-9]* */

/* ຄໍາທີ່ສະຫງວນ : %type=>TYPE %left=>LEFT, ແລະອື່ນໆ */

%token ຊ້າຍຂວາ NONASSOC TOKEN PREC ປະເພດເລີ່ມຕົ້ນສະຫະພາບ

%token MARK /* ເຄື່ອງໝາຍ %%. */
%token LCURL /* ເຄື່ອງໝາຍ %{. */
%token RCURL /* ເຄື່ອງໝາຍ %}. */

/* ຕົວໜັງສືຕົວອັກສອນ 8-bit ຢືນຢູ່ສຳລັບຕົວມັນເອງ; */
/* tokens ຕ້ອງຖືກກໍານົດສໍາລັບຕົວອັກສອນຫຼາຍໄບ. */

% ເລີ່ມ spec

%%

spec : defs MARK rules tail
;
ຫາງ : MARK
{
/* ໃນການປະຕິບັດນີ້, ຕັ້ງຄ່າສ່ວນທີ່ເຫຼືອຂອງໄຟລ໌. */
}
| /* ຫວ່າງ; MARK ທີສອງແມ່ນທາງເລືອກ. */
;
defs : /* ຫວ່າງເປົ່າ. */
| defs def
;
def : START IDENTIFIER
| ສະຫະພັນ
{
/* ຄັດລອກຄໍານິຍາມຂອງສະຫະພັນເພື່ອຜົນຜະລິດ. */
}
| LCURL
{
/* ຄັດລອກລະຫັດ C ເພື່ອສົ່ງອອກໄຟລ໌. */
}
RCURL
| rword tag nlist
;
rword : TOKEN
| ຊ້າຍ
| ຂວາ
| NONASSOC
| ປະເພດ
;
tag : /* Empty: union tag ID ທາງເລືອກ. */
| '<' ຕົວລະບຸຕົວຕົນ '>'
;
nlist : nmno
| nlist nmno
;
nmno : IDENTIFIER /* ໝາຍເຫດ: ຕົວໜັງສືບໍ່ຖືກຕ້ອງກັບປະເພດ %. */
| IDENTIFIER NUMBER /* ໝາຍເຫດ: ບໍ່ຖືກຕ້ອງກັບປະເພດ %. */
;

/* ພາກ​ລະ​ບຽບ */

ກົດລະບຽບ : C_IDENTIFIER rbody prec
| ກົດ​ລະ​ບຽບ​
;
ກົດລະບຽບ : C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody : /* ຫວ່າງ */
| rbody IDENTIFIER
| rbody ປະຕິບັດ
;
ປະຕິບັດ : '{'
{
/* ການດໍາເນີນການຄັດລອກ, ແປ $$, ແລະອື່ນໆ. */
}
'}'
;
prec : /* ຫວ່າງ */
| PREC IDENTIFIER
| ການກະທໍາ PREC IDENTIFIER
| prec ';'
;

ຂໍ້ຂັດແຍ່ງ
parser ຜະລິດສໍາລັບໄວຍະກອນການປ້ອນຂໍ້ມູນອາດຈະປະກອບດ້ວຍລັດທີ່ຂໍ້ຂັດແຍ່ງເກີດຂຶ້ນ. ໄດ້
ຂໍ້ຂັດແຍ່ງເກີດຂຶ້ນເນື່ອງຈາກວ່າໄວຍາກອນບໍ່ແມ່ນ ລລລ(1). ໄວຍະກອນທີ່ບໍ່ຊັດເຈນມີຢູ່ສະເໝີ
ຢ່າງຫນ້ອຍຫນຶ່ງ ລລລ(1) ຂໍ້ຂັດແຍ່ງ. ໄດ້ yacc ຜົນປະໂຫຍດຈະແກ້ໄຂຂໍ້ຂັດແຍ່ງທັງຫມົດ, ການນໍາໃຊ້ບໍ່ວ່າຈະ
ກົດລະບຽບເລີ່ມຕົ້ນ ຫຼືກົດລະບຽບກ່ອນໜ້າທີ່ລະບຸໂດຍຜູ້ໃຊ້.

ຂໍ້ຂັດແຍ່ງແມ່ນການປ່ຽນແປງ / ຫຼຸດຜ່ອນຄວາມຂັດແຍ້ງຫຼືຫຼຸດຜ່ອນ / ຫຼຸດຜ່ອນຄວາມຂັດແຍ້ງ. ເລື່ອນ/ຫຼຸດ
ຂໍ້ຂັດແຍ່ງແມ່ນບ່ອນທີ່, ສໍາລັບລັດທີ່ກໍານົດແລະສັນຍາລັກເບິ່ງ, ທັງການປະຕິບັດການປ່ຽນແປງແລະ a
ຫຼຸດຜ່ອນການປະຕິບັດແມ່ນເປັນໄປໄດ້. ການຫຼຸດຜ່ອນ / ຫຼຸດຜ່ອນຄວາມຂັດແຍ້ງແມ່ນບ່ອນທີ່, ສໍາລັບລັດໃດຫນຶ່ງແລະ
ສັນຍາລັກ lookahead, ການຫຼຸດຜ່ອນສອງກົດລະບຽບທີ່ແຕກຕ່າງກັນແມ່ນເປັນໄປໄດ້.

ກົດລະບຽບຂ້າງລຸ່ມນີ້ອະທິບາຍວິທີການກໍານົດສິ່ງທີ່ຈະດໍາເນີນການໃນເວລາທີ່ຄວາມຂັດແຍ້ງເກີດຂຶ້ນ. ບໍ່ແມ່ນ
ການ​ປ່ຽນ​ແປງ / ຫຼຸດ​ຜ່ອນ​ຄວາມ​ຂັດ​ແຍ່ງ​ທັງ​ຫມົດ​ສາ​ມາດ​ໄດ້​ຮັບ​ການ​ແກ້​ໄຂ​ສົບ​ຜົນ​ສໍາ​ເລັດ​ດ້ວຍ​ວິ​ທີ​ການ​ເພາະ​ວ່າ​ຂໍ້​ຂັດ​ແຍ່ງ​ອາດ​ຈະ​
ເປັນຍ້ອນສິ່ງອື່ນນອກເໜືອໄປຈາກຄວາມບໍ່ແນ່ນອນ, ສະນັ້ນການນຳໃຊ້ສິ່ງອໍານວຍຄວາມສະດວກເຫຼົ່ານີ້ຢ່າງບໍ່ລະມັດລະວັງສາມາດເຮັດໃຫ້ເກີດ
ພາສາທີ່ຍອມຮັບໂດຍ parser ມີຄວາມແຕກຕ່າງກັນຫຼາຍຈາກຈຸດປະສົງ. ໄດ້
ເອກະສານຄໍາອະທິບາຍຕ້ອງມີຂໍ້ມູນພຽງພໍເພື່ອເຂົ້າໃຈສາເຫດຂອງ
ຂໍ້ຂັດແຍ່ງ. ບ່ອນທີ່ຄວາມບໍ່ຊັດເຈນແມ່ນເຫດຜົນທີ່ວ່າກົດລະບຽບເລີ່ມຕົ້ນຫຼືຢ່າງຊັດເຈນຄວນຈະເປັນ
ພຽງພໍເພື່ອຜະລິດຕົວວິເຄາະທີ່ເຮັດວຽກ.

ຄວາມ​ເປັນ​ມາ​ຂອງ​ການ​ປະ​ກາດ​ແລະ​ສະ​ມາ​ຄົມ (ເບິ່ງ ການປະກາດ ສ່ວນ) ຖືກ​ນໍາ​ໃຊ້​ເພື່ອ​
ແກ້​ໄຂ​ຂໍ້​ຂັດ​ແຍ່ງ​ການ​ວິ​ເຄາະ​ດັ່ງ​ຕໍ່​ໄປ​ນີ້​:

1. ຄວາມສຳຄັນ ແລະ ການເຊື່ອມໂຍງແມ່ນກ່ຽວຂ້ອງກັບແຕ່ລະຫຼັກໄວຍາກອນ; ມັນແມ່ນ
ກ່ອນໜ້າ ແລະການເຊື່ອມໂຍງຂອງ token ສຸດທ້າຍ ຫຼືຕົວໜັງສືຢູ່ໃນຮ່າງກາຍຂອງກົດລະບຽບ. ຖ້າ
ໄດ້ %prec ຄໍາສໍາຄັນຖືກນໍາໃຊ້, ມັນ overrides ຄ່າເລີ່ມຕົ້ນນີ້. ບາງກົດລະບຽບໄວຍາກອນອາດຈະບໍ່
ມີ​ທັງ​ການ​ນໍາ​ຫນ້າ​ແລະ​ສະ​ມາ​ຄົມ​.

2. ຖ້າມີການປ່ຽນ / ຫຼຸດຜ່ອນຄວາມຂັດແຍ້ງ, ແລະທັງກົດລະບຽບໄວຍາກອນແລະສັນຍາລັກປ້ອນເຂົ້າ
ມີຄວາມກ້າວໜ້າ ແລະ ມີຄວາມກ່ຽວຂ້ອງກັນກັບເຂົາເຈົ້າ, ຫຼັງຈາກນັ້ນ, ຄວາມຂັດແຍ້ງຈະຖືກແກ້ໄຂ
ໃນຄວາມໂປດປານຂອງການປະຕິບັດ (shift ຫຼືຫຼຸດລົງ) ທີ່ກ່ຽວຂ້ອງກັບຄວາມກ້າວຫນ້າທີ່ສູງກວ່າ. ຖ້າ
precedences ແມ່ນຄືກັນ, ຫຼັງຈາກນັ້ນສະມາຄົມໄດ້ຖືກນໍາໃຊ້; ສະມາຄົມຊ້າຍຫມາຍເຖິງ
ຫຼຸດຜ່ອນ, ສະມາຄົມທີ່ຖືກຕ້ອງຫມາຍເຖິງການປ່ຽນແປງ, ແລະບໍ່ແມ່ນສະມາຄົມຫມາຍເຖິງຄວາມຜິດພາດໃນ
ສະຕຣິງກຳລັງຖືກວິເຄາະ.

3. ເມື່ອມີການປ່ຽນ / ຫຼຸດຜ່ອນຂໍ້ຂັດແຍ່ງທີ່ບໍ່ສາມາດແກ້ໄຂໄດ້ໂດຍກົດລະບຽບ 2, ການປ່ຽນແປງແມ່ນ
ສຳເລັດແລ້ວ. ການຂັດແຍ້ງທີ່ແກ້ໄຂດ້ວຍວິທີນີ້ແມ່ນຖືກນັບຢູ່ໃນຜົນໄດ້ຮັບການວິນິດໄສທີ່ອະທິບາຍໄວ້ໃນ
Error ການຈັດການ.

4. ເມື່ອມີການຫຼຸດຜ່ອນ / ຫຼຸດຜ່ອນຄວາມຂັດແຍ້ງ, ການຫຼຸດຜ່ອນແມ່ນເຮັດໂດຍກົດລະບຽບໄວຍາກອນທີ່
ເກີດຂຶ້ນກ່ອນໜ້ານີ້ໃນລຳດັບການປ້ອນຂໍ້ມູນ. ຂໍ້ຂັດແຍ່ງທີ່ແກ້ໄຂດ້ວຍວິທີນີ້ແມ່ນຖືກນັບຢູ່ໃນ
ຜົນ​ຜະ​ລິດ​ການ​ວິ​ເຄາະ​ອະ​ທິ​ບາຍ​ໃນ​ Error ການຈັດການ.

ຂໍ້ຂັດແຍ່ງທີ່ແກ້ໄຂໄດ້ຕາມລຳດັບ ຫຼື ສະມາຄົມຈະບໍ່ຖືກນັບເຂົ້າໃນການປ່ຽນແປງ/ຫຼຸດ
ແລະຫຼຸດຜ່ອນ / ຫຼຸດຜ່ອນຂໍ້ຂັດແຍ່ງລາຍງານໂດຍ yacc ກ່ຽວກັບຄວາມຜິດພາດມາດຕະຖານຫຼືຢູ່ໃນ
ໄຟລ໌ຄໍາອະທິບາຍ.

Error ການຈັດການ
ໂທເຄັນ ຄວາມຜິດພາດ ຈະຖືກສະຫງວນໄວ້ສໍາລັບການຈັດການຄວາມຜິດພາດ. ຊື່ ຄວາມຜິດພາດ ສາມາດຖືກນໍາໃຊ້ໃນ
ກົດລະບຽບໄວຍາກອນ. ມັນຊີ້ບອກສະຖານທີ່ບ່ອນທີ່ parser ສາມາດຟື້ນຕົວຈາກຂໍ້ຜິດພາດຂອງ syntax. ໄດ້
ຄ່າເລີ່ມຕົ້ນຂອງ ຄວາມຜິດພາດ ຈະຕ້ອງເປັນ 256. ຄ່າຂອງມັນສາມາດປ່ຽນແປງໄດ້ໂດຍໃຊ້ a %ໂທເຄັນ ການປະກາດ.
ການວິເຄາະ lexical ບໍ່ຄວນກັບຄືນມູນຄ່າຂອງ ຄວາມຜິດພາດ.

parser ຈະກວດພົບຂໍ້ຜິດພາດຂອງ syntax ເມື່ອມັນຢູ່ໃນສະຖານະທີ່ການປະຕິບັດທີ່ກ່ຽວຂ້ອງ
ກັບສັນຍາລັກ lookahead ແມ່ນ ຄວາມຜິດພາດ. ການປະຕິບັດທາງຄວາມຫມາຍສາມາດເຮັດໃຫ້ parser ເລີ່ມຕົ້ນ
ການຈັດການຄວາມຜິດພາດໂດຍການດໍາເນີນການ macro YYERROR. ເມື່ອ YYERROR ຖືກປະຕິບັດ, semantic
ການປະຕິບັດຜ່ານການຄວບຄຸມກັບຄືນໄປຫາຕົວວິເຄາະ. YYERROR ບໍ່ສາມາດໃຊ້ນອກຄວາມຫມາຍໄດ້
ການກະ ທຳ.

ເມື່ອ parser ກວດພົບຂໍ້ຜິດພາດຂອງ syntax, ມັນມັກຈະໂທຫາ yyerror() ກັບລັກສະນະ
string " syntax ຄວາມຜິດພາດ" ເປັນການໂຕ້ຖຽງຂອງຕົນ. ການໂທຈະບໍ່ຖືກເຮັດຖ້າຕົວວິເຄາະຍັງຢູ່
ກູ້ຄືນຈາກຄວາມຜິດພາດທີ່ຜ່ານມາເມື່ອພົບຂໍ້ຜິດພາດ. parser ແມ່ນພິຈາລະນາ
ໄດ້ຮັບການຟື້ນຕົວຈາກຄວາມຜິດພາດທີ່ຜ່ານມາຈົນກ່ວາ parser ໄດ້ຍ້າຍໃນໄລຍະຢ່າງຫນ້ອຍສາມ
ສັນ​ຍາ​ລັກ​ການ​ປ້ອນ​ຂໍ້​ມູນ​ປົກ​ກະ​ຕິ​ນັບ​ຕັ້ງ​ແຕ່​ການ​ພົບ​ເຫັນ​ຄວາມ​ຜິດ​ພາດ​ຄັ້ງ​ສຸດ​ທ້າຍ​ຫຼື​ການ​ປະ​ຕິ​ບັດ semantic ໄດ້​ປະ​ຕິ​ບັດ​
ມະຫາພາກ yyerrok. parser ຈະບໍ່ໂທຫາ yyerror() ເມື່ອ YYERROR ຖືກປະຕິບັດ.

ຟັງຊັນມະຫາພາກ YYRECOVERING ຈະສົ່ງຄືນ 1 ຖ້າ syntax ຜິດພາດໄດ້ຖືກກວດພົບແລະ
parser ຍັງບໍ່ທັນໄດ້ຟື້ນຕົວຢ່າງເຕັມສ່ວນຈາກມັນ. ຖ້າບໍ່ດັ່ງນັ້ນ, ສູນຈະຖືກສົ່ງຄືນ.

ເມື່ອນັກວິເຄາະກວດພົບຂໍ້ຜິດພາດທາງໄວຍະກອນ, ການວິເຄາະເຊີງຈະກວດສອບວ່າໄວຍະກອນກ່ອນໜ້ານີ້ບໍ່
ກວດພົບຂໍ້ຜິດພາດ. ຖ້າ​ຫາກ​ວ່າ​ຄວາມ​ຜິດ​ພາດ​ທີ່​ຜ່ານ​ມາ​ໄດ້​ຖືກ​ກວດ​ພົບ​, ແລະ​ຖ້າ​ຫາກ​ວ່າ​ບໍ່​ມີ​ສັນ​ຍາ​ລັກ​ການ​ປ້ອນ​ຂໍ້​ມູນ​ປົກ​ກະ​ຕິ​
ໄດ້​ຖືກ​ປ່ຽນ​ໄປ​ນັບ​ຕັ້ງ​ແຕ່​ການ​ພົບ​ເຫັນ​ຄວາມ​ຜິດ​ພາດ​ກ່ອນ​ຫນ້າ​ນີ້​, parser ກວດ​ສອບ​ຖ້າ​ຫາກ​ວ່າ​
ສັນຍາລັກ lookahead ແມ່ນເຄື່ອງໝາຍປາຍທາງ (ເບິ່ງ ການໂຕ້ຕອບ to ໄດ້ ໃບລານ ນັກວິເຄາະ). ຖ້າຫາກວ່າມັນແມ່ນ, ໄດ້
parser ຈະກັບຄືນມາດ້ວຍຄ່າທີ່ບໍ່ແມ່ນສູນ. ຖ້າບໍ່ດັ່ງນັ້ນ, ສັນຍາລັກ lookahead ຈະເປັນ
ຍົກເລີກ ແລະ ການແຍກວິເຄາະຕາມປົກກະຕິຈະສືບຕໍ່.

ເມື່ອ YYERROR ຖືກປະຕິບັດຫຼືເມື່ອ parser ກວດພົບຂໍ້ຜິດພາດຂອງ syntax ແລະບໍ່ມີຂໍ້ຜິດພາດທີ່ຜ່ານມາ
ໄດ້​ຖືກ​ກວດ​ພົບ, ຫຼື​ຢ່າງ​ຫນ້ອຍ​ຫນຶ່ງ​ສັນ​ຍາ​ລັກ​ການ​ປ້ອນ​ຂໍ້​ມູນ​ປົກ​ກະ​ຕິ​ໄດ້​ຖືກ​ປ່ຽນ​ຕັ້ງ​ແຕ່​ກ່ອນ​ຫນ້າ​ນີ້
ກວດພົບຂໍ້ຜິດພາດ, ຕົວແຍກວິເຄາະຈະປາກົດຄືນໜຶ່ງສະຖານະເທື່ອລະອັນຈົນກ່ວາການແຍກວິເຄາະແມ່ນ
ຫວ່າງເປົ່າ ຫຼືສະຖານະປັດຈຸບັນອະນຸຍາດໃຫ້ປ່ຽນໄດ້ ຄວາມຜິດພາດ. ຖ້າ parser ເປົ່າ parse
stack, ມັນຈະກັບຄືນມາດ້ວຍຄ່າທີ່ບໍ່ແມ່ນສູນ. ຖ້າບໍ່ດັ່ງນັ້ນ, ມັນຈະປ່ຽນໄປ ຄວາມຜິດພາດ ແລະ
ຈາກນັ້ນສືບຕໍ່ການແຍກວິເຄາະຕາມປົກກະຕິ. ຖ້າຕົວວິເຄາະອ່ານສັນຍາລັກ lookahead ກ່ອນທີ່ຈະມີຂໍ້ຜິດພາດ
ກວດພົບ, ສັນຍາລັກນັ້ນຈະຍັງຄົງເປັນສັນຍາລັກທີ່ໜ້າສົນໃຈ ເມື່ອການວິພາກວິຈານຄືນໃໝ່.

ມະຫາພາກ yyerrok ໃນການປະຕິບັດ semantic ຈະເຮັດໃຫ້ parser ປະຕິບັດຄືກັບວ່າມັນມີຢ່າງເຕັມສ່ວນ
ຟື້ນ​ຕົວ​ຈາກ​ຄວາມ​ຜິດ​ພາດ​ທີ່​ຜ່ານ​ມາ​. ມະຫາພາກ yyclearin ຈະເຮັດໃຫ້ເຄື່ອງວິເຄາະຍົກເລີກ
token ຂອງ lookahead ໃນ​ປະ​ຈຸ​ບັນ​. ຖ້າ token lookahead ໃນປັດຈຸບັນຍັງບໍ່ໄດ້ອ່ານ,
yyclearin ຈະບໍ່ມີຜົນກະທົບ.

Macro YYACCEPT ຈະເຮັດໃຫ້ຕົວແຍກວິເຄາະກັບຄືນມາດ້ວຍຄ່າສູນ. ມະຫາພາກ YYABORT
ຈະເຮັດໃຫ້ຕົວວິເຄາະກັບຄືນດ້ວຍຄ່າທີ່ບໍ່ແມ່ນສູນ.

ການໂຕ້ຕອບ to ໄດ້ ໃບລານ ນັກວິເຄາະ
ໄດ້ yylexຟັງຊັນ () ເປັນຟັງຊັນທີ່ມີຄ່າຈຳນວນເຕັມທີ່ໃຫ້ຜົນຕອບແທນ a token ຈໍານວນ
ເປັນຕົວແທນປະເພດຂອງ token ອ່ານ. ຖ້າມີມູນຄ່າທີ່ກ່ຽວຂ້ອງກັບ token
ກັບຄືນໂດຍ yylex() (ເບິ່ງການສົນທະນາຂອງ ໂຄດ​ຄໍາ​ສັ່ງ ຂ້າງເທິງ), ມັນຈະຖືກມອບຫມາຍໃຫ້
ຕົວແປພາຍນອກ yylval.

ຖ້າ parser ແລະ yylex() ບໍ່ເຫັນດີກັບຕົວເລກ token ເຫຼົ່ານີ້, ການສື່ສານທີ່ເຊື່ອຖືໄດ້
ລະຫວ່າງພວກມັນບໍ່ສາມາດເກີດຂຶ້ນໄດ້. ສໍາ​ລັບ​ຕົວ​ອັກ​ສອນ (ຕົວ​ອັກ​ສອນ​ໄບ​ຕ​໌​ດຽວ​)​, token ແມ່ນ​ພຽງ​ແຕ່​
ຄ່າຕົວເລກຂອງຕົວອັກສອນໃນຊຸດຕົວອັກສອນປັດຈຸບັນ. ຕົວເລກສໍາລັບ token ອື່ນໆ
ສາມາດເລືອກໄດ້ໂດຍ yacc, ຫຼືເລືອກໂດຍຜູ້ໃຊ້. ໃນກໍລະນີໃດກໍ່ຕາມ, ໄດ້ #ກໍານົດ ກໍ່ສ້າງ
ຂອງ C ຖືກນໍາໃຊ້ເພື່ອອະນຸຍາດໃຫ້ yylex() ເພື່ອສົ່ງຄືນຕົວເລກເຫຼົ່ານີ້ເປັນສັນຍາລັກ. ໄດ້ #ກໍານົດ ບົດລາຍງານ
ຖືກໃສ່ເຂົ້າໄປໃນໄຟລ໌ລະຫັດ, ແລະໄຟລ໌ header ຖ້າໄຟລ໌ນັ້ນຖືກຮ້ອງຂໍ. ຊຸດຂອງ
ຕົວອັກສອນທີ່ອະນຸຍາດໂດຍ yacc ໃນຕົວລະບຸແມ່ນໃຫຍ່ກວ່າທີ່ອະນຸຍາດໂດຍ C. Token
ຊື່ທີ່ພົບເຫັນວ່າມີຕົວອັກສອນດັ່ງກ່າວຈະບໍ່ຖືກລວມເຂົ້າໃນ #ກໍານົດ ຖະແຫຼງການ.

ຖ້າຕົວເລກ token ຖືກເລືອກໂດຍ yacc, tokens ອື່ນນອກຈາກຕົວຫນັງສືຈະຖືກມອບຫມາຍ
ຕົວເລກທີ່ໃຫຍ່ກວ່າ 256, ເຖິງແມ່ນວ່າບໍ່ມີຄໍາສັ່ງແມ່ນຫມາຍຄວາມວ່າ. ໂທເຄັນສາມາດຖືກມອບໝາຍຢ່າງຈະແຈ້ງ
ຈໍາ​ນວນ​ຫນຶ່ງ​ໂດຍ​ການ​ປະ​ຕິ​ບັດ​ຕາມ​ລັກ​ສະ​ນະ​ທໍາ​ອິດ​ຂອງ​ຕົນ​ໃນ​ພາກ​ສ່ວນ​ການ​ປະ​ກາດ​ທີ່​ມີ​ຈໍາ​ນວນ​.
ຊື່ແລະຕົວຫນັງສືບໍ່ໄດ້ກໍານົດວິທີການນີ້ຮັກສາຄໍານິຍາມໄວ້ໃນຕອນຕົ້ນຂອງເຂົາເຈົ້າ. ຕົວເລກ token ທັງໝົດ
ມອບ ໝາຍ ໂດຍ yacc ຈະເປັນເອກະລັກແລະແຕກຕ່າງຈາກຕົວເລກ token ທີ່ໃຊ້ສໍາລັບຕົວຫນັງສືແລະ
tokens ຜູ້ໃຊ້ມອບຫມາຍ. ຖ້າຕົວເລກໂທເຄັນຊໍ້າກັນເຮັດໃຫ້ເກີດຂໍ້ຂັດແຍ່ງໃນການຜະລິດຕົວວິເຄາະ,
yacc ຈະຕ້ອງລາຍງານຄວາມຜິດພາດ; ຖ້າບໍ່ດັ່ງນັ້ນ, ມັນບໍ່ໄດ້ຖືກລະບຸວ່າການມອບຫມາຍ token ແມ່ນຫຼືບໍ່
ຍອມຮັບ ຫຼືມີລາຍງານຂໍ້ຜິດພາດ.

ໃນຕອນທ້າຍຂອງການປ້ອນຂໍ້ມູນແມ່ນຫມາຍໂດຍ token ພິເສດທີ່ເອີ້ນວ່າ ເຄື່ອງໝາຍປາຍທາງ, ເຊິ່ງມີ token
ຕົວເລກທີ່ເປັນສູນ ຫຼື ລົບ. (ຄ່າເຫຼົ່ານີ້ແມ່ນບໍ່ຖືກຕ້ອງສໍາລັບ token ອື່ນໆ.) ທັງຫມົດ
ນັກວິເຄາະ lexical ຈະກັບຄືນສູນຫຼືລົບເປັນຈໍານວນ token ເມື່ອເຖິງຈຸດສິ້ນສຸດຂອງ
ວັດສະດຸປ້ອນຂອງເຂົາເຈົ້າ. ຖ້າ tokens ເຖິງ, ແຕ່ບໍ່ລວມ, endmarker ປະກອບເປັນໂຄງສ້າງທີ່
ກົງກັບສັນຍາລັກເລີ່ມຕົ້ນ, parser ຈະຍອມຮັບການປ້ອນຂໍ້ມູນ. ຖ້າຈຸດສຸດທ້າຍແມ່ນເຫັນໄດ້ໃນ
ສະພາບການອື່ນໆ, ມັນຈະຖືກພິຈາລະນາເປັນຄວາມຜິດພາດ.

ສຳ ເລັດ ໄດ້ ໂຄງການ
ນອກ​ຈາກ​ນັ້ນ yyparse() ແລະ yylex(), ຫນ້າທີ່ yyerror() ແລະ ຕົ້ນຕໍ() ຈໍາເປັນຕ້ອງໄດ້
ເຮັດໂຄງການທີ່ສົມບູນ. ຄໍາຮ້ອງສະຫມັກສາມາດສະຫນອງ ຕົ້ນຕໍ() ແລະ yyerror(), ຫຼືເຫຼົ່ານັ້ນ
ປົກກະຕິສາມາດໄດ້ຮັບຈາກ yacc ຫ້ອງສະຫມຸດ.

Yacc ຫ້ອງສະຫມຸດ
ຫນ້າທີ່ຕໍ່ໄປນີ້ຈະປາກົດຢູ່ໃນ yacc ຫ້ອງສະຫມຸດສາມາດເຂົ້າເຖິງໄດ້ໂດຍຜ່ານ −l y
ດໍາເນີນການກັບ c99; ດັ່ງນັ້ນເຂົາເຈົ້າສາມາດຖືກກໍານົດຄືນໃຫມ່ໂດຍຄໍາຮ້ອງສະຫມັກທີ່ສອດຄ່ອງ:

int ຕົ້ນຕໍ(void)
ຟັງຊັນນີ້ຈະໂທຫາ yyparse() ແລະອອກດ້ວຍຄ່າທີ່ບໍ່ລະບຸ. ການປະຕິບັດອື່ນໆ
ພາຍໃນຟັງຊັນນີ້ບໍ່ໄດ້ຖືກລະບຸ.

int yyerror(const char *s)
ຟັງຊັນນີ້ຈະຂຽນ NUL-terminated argument ກັບຄວາມຜິດພາດມາດຕະຖານ, ຕາມດ້ວຍ
ກ .

ຄໍາສັ່ງຂອງ −l y ແລະ −l l operands ມອບໃຫ້ c99 ມີຄວາມສໍາຄັນ; ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​ຈະ​
ບໍ່ວ່າຈະສະຫນອງຂອງຕົນເອງ ຕົ້ນຕໍ() ປະຕິບັດຫນ້າຫຼືໃຫ້ແນ່ໃຈວ່າ −l y ກ່ອນຫນ້າ −l l.

Debugging ໄດ້ Parser
ຕົວວິເຄາະທີ່ສ້າງຂຶ້ນໂດຍ yacc ຕ້ອງມີສິ່ງອໍານວຍຄວາມສະດວກໃນການວິນິດໄສຢູ່ໃນນັ້ນທີ່ສາມາດເລືອກໄດ້
ເປີດໃຊ້ໃນເວລາລວບລວມຫຼືໃນເວລາແລ່ນ (ຖ້າເປີດໃຊ້ໃນເວລາລວບລວມ). ໄດ້
ການລວບລວມລະຫັດດີບັກຂອງ runtime ແມ່ນຢູ່ພາຍໃຕ້ການຄວບຄຸມຂອງ YYDEBUG, preprocessor
ສັນຍາລັກ. ຖ້າ YYDEBUG ມີມູນຄ່າທີ່ບໍ່ແມ່ນສູນ, ລະຫັດດີບັກຈະຖືກລວມເຂົ້າ. ຖ້າມັນ
ຄ່າແມ່ນສູນ, ລະຫັດຈະບໍ່ຖືກລວມເຂົ້າ.

ໃນ parers ທີ່ລະຫັດ debugging ໄດ້ຖືກລວມເຂົ້າ, ພາຍນອກ int yydebug ສາມາດ
ໃຊ້ເພື່ອເປີດການດີບັກ (ດ້ວຍຄ່າທີ່ບໍ່ແມ່ນສູນ) ແລະປິດ (ຄ່າສູນ) ໃນເວລາແລ່ນ. ໄດ້
ມູນຄ່າເບື້ອງຕົ້ນຂອງ yydebug ຈະເປັນສູນ.

ເມື່ອ​ໃດ​ -t ຖືກກໍານົດໄວ້, ໄຟລ໌ລະຫັດຈະຖືກສ້າງຂື້ນເຊັ່ນນັ້ນ, ຖ້າ YYDEBUG ບໍ່ແມ່ນແລ້ວ
ກໍານົດໃນເວລາລວບລວມ (ການນໍາໃຊ້ c99 −D ທາງເລືອກ YYDEBUG, ສໍາລັບການຍົກຕົວຢ່າງ), YYDEBUG ຈະ
ຖືກຕັ້ງຢ່າງຊັດເຈນເປັນ 1. ເມື່ອໃດ -t ບໍ່ໄດ້ລະບຸໄວ້, ໄຟລ໌ລະຫັດຈະຖືກສ້າງຂຶ້ນເຊັ່ນນັ້ນ,
ຖ້າ YYDEBUG ບໍ່ໄດ້ຖືກ ກຳ ນົດໄວ້ແລ້ວ, ມັນຈະຖືກຕັ້ງຢ່າງຈະແຈ້ງເປັນສູນ.

ຮູບແບບຂອງຜົນການດີບັ໊ກແມ່ນບໍ່ໄດ້ລະບຸແຕ່ມີຂໍ້ມູນຢ່າງໜ້ອຍພຽງພໍ
ເພື່ອກໍານົດການປ່ຽນແປງແລະການຫຼຸດຜ່ອນການປະຕິບັດ, ແລະສັນຍາລັກການປ້ອນຂໍ້ມູນ. ມັນຍັງສະຫນອງ
ຂໍ້​ມູນ​ກ່ຽວ​ກັບ​ການ​ຟື້ນ​ຕົວ​ຄວາມ​ຜິດ​ພາດ​.

ລະບົບວິເຄາະ
parser ສ້າງໂດຍ yacc ປະຕິບັດເປັນ ລລລ(1) parsing algorithm ຕາມທີ່ບັນທຶກໄວ້ໃນ
ວັນນະຄະດີ. ມັນບໍ່ໄດ້ຖືກລະບຸວ່າຕົວແຍກວິເຄາະແມ່ນໃຊ້ຕາຕະລາງຫຼືລະຫັດໂດຍກົງ.

ຕົວວິເຄາະທີ່ສ້າງຂຶ້ນໂດຍ yacc ຈະບໍ່ຮ້ອງຂໍໃຫ້ມີສັນຍາລັກປ້ອນຂໍ້ມູນຈາກ yylex() ໃນຂະນະທີ່ຢູ່ໃນ ກ
ລະບຸວ່າການກະທໍາດຽວນອກເຫນືອຈາກການກະທໍາຄວາມຜິດພາດແມ່ນການຫຼຸດຜ່ອນໂດຍກົດລະບຽບດຽວ.

ວັນນະຄະດີຂອງທິດສະດີ parsing ກໍານົດແນວຄວາມຄິດເຫຼົ່ານີ້.

ຈໍາກັດ
ໄດ້ yacc ຜົນປະໂຫຍດອາດຈະມີຕາຕະລາງພາຍໃນຫຼາຍ. ສູງສຸດຕໍາ່ສຸດທີ່ສໍາລັບຕາຕະລາງເຫຼົ່ານີ້
ແມ່ນສະແດງຢູ່ໃນຕາຕະລາງຕໍ່ໄປນີ້. ຄວາມຫມາຍທີ່ແນ່ນອນຂອງຄຸນຄ່າເຫຼົ່ານີ້ແມ່ນການປະຕິບັດ -
ກໍານົດ. ການປະຕິບັດຈະຕ້ອງກໍານົດຄວາມສໍາພັນລະຫວ່າງຄຸນຄ່າເຫຼົ່ານີ້ແລະລະຫວ່າງ
ພວກມັນແລະຂໍ້ຄວາມສະແດງຂໍ້ຜິດພາດທີ່ການປະຕິບັດອາດຈະສ້າງຖ້າມັນຫມົດໄປ
ພື້ນທີ່ສໍາລັບໂຄງສ້າງພາຍໃນໃດໆ. ການປະຕິບັດອາດຈະລວມກຸ່ມຂອງຊັບພະຍາກອນເຫຼົ່ານີ້
ເຂົ້າໄປໃນສະນຸກເກີດຽວຕາບໃດທີ່ຈໍານວນທັງຫມົດທີ່ມີໃຫ້ກັບຜູ້ໃຊ້ບໍ່ຕໍ່າກວ່າຈໍານວນລວມ
ຂອງຂະຫນາດທີ່ລະບຸໄວ້ໃນພາກນີ້.

ຕາຕະລາງ: ພາຍໃນ ຈໍາກັດ in yacc

┌──────────────┬──────────────────────────────── ─────┐
││ ຂັ້ນຕ່ໍາ ││
ຂອບເຂດຈໍາກັດສູງສຸດລາຍລະອຽດ
├───────────────────────────────────────────── ─────┤
│{NTERMS} │ 126 │ ຈຳນວນໂທເຄັນ. │
│{NNONTERM} │ 200 │ ຈຳນວນເຄື່ອງທີ່ບໍ່ແມ່ນເຄື່ອງໃຊ້ໄຟຟ້າ. │
│{NPROD} │ 300 │ ຈຳນວນກົດລະບຽບ. │
│{NSTATES} │ 600 │ ຈຳນວນລັດ. │
│{MEMSIZE} │ 5200 │ ຄວາມຍາວຂອງກົດລະບຽບ. ທັງໝົດ │
│ │ │ ຄວາມຍາວ, ໃນຊື່ (ໂທເຄັນ ແລະ │
│ │ │ ທີ່ບໍ່ແມ່ນເຄື່ອງໝາຍປາຍທາງ), ຂອງທັງໝົດ │
│ │ │ ກົດລະບຽບຂອງໄວຍາກອນ. │
│ │ │ ຊ້າຍມືແມ່ນນັບເປັນ │
│ │ │ ແຕ່ລະກົດລະບຽບ, ເຖິງແມ່ນວ່າມັນບໍ່ແມ່ນ │
│ │ │ ຊ້ຳຢ່າງຈະແຈ້ງ, ເປັນ │
│ │ │ ລະບຸໄວ້ໃນ Grammar ກົດລະບຽບ in
│ │ │ yacc. │
│{ACTSIZE} │ 4000 │ ຈຳນວນຄຳສັ່ງ. ``ການກະທຳ´ │
│ │ │ ທີ່ນີ້ (ແລະໃນຄໍາອະທິບາຍ │
│ │ │ ໄຟລ໌) ອ້າງອີງເຖິງການດໍາເນີນການວິເຄາະ │
│ │ │ (ປ່ຽນ, ຫຼຸດ, ແລະອື່ນໆ) ບໍ່ແມ່ນ │
│ │ │ ຕໍ່ກັບການກະທຳທາງຄວາມໝາຍທີ່ກຳນົດໄວ້ໃນ │
│ │ │ Grammar ກົດລະບຽບ in yacc. │
└───────────────────────────────────────────── ─────┘

ອອກ STATUS


ຄ່າທາງອອກຕໍ່ໄປນີ້ຈະຖືກສົ່ງຄືນ:

0 ສໍາເລັດສົບຜົນສໍາເລັດ.

>0 ເກີດຄວາມຜິດພາດຂຶ້ນ.

ຂໍ້ສັງເກດ OF ຄວາມຜິດພາດ


ຖ້າພົບຂໍ້ຜິດພາດໃດໆ, ການແລ່ນຈະຖືກຍົກເລີກແລະ yacc ອອກດ້ວຍສະຖານະທີ່ບໍ່ແມ່ນສູນ.
ໄຟລ໌ລະຫັດບາງສ່ວນ ແລະໄຟລ໌ສ່ວນຫົວອາດຈະຖືກຜະລິດ. ຂໍ້​ມູນ​ສະ​ຫຼຸບ​ໃນ​
ໄຟລ໌ຄໍາອະທິບາຍສະເຫມີຈະຖືກຜະລິດຖ້າຫາກວ່າ −v ທຸງຢູ່.

ໄດ້ ດັ່ງຕໍ່ໄປນີ້ ພາກສ່ວນ ມີ ຂໍ້ມູນ.

ຄໍາຮ້ອງສະຫມັກ ການນໍາໃຊ້


ການຈັດຕັ້ງປະຕິບັດປະຫວັດສາດປະສົບກັບຄວາມຂັດແຍ້ງກ່ຽວກັບຊື່ yacc.tmp, yacc.acts,
yacc.debug, y.tab.c, y.tab.h, ແລະ y. ຜົນຜະລິດ ຖ້າຫຼາຍກວ່າຫນຶ່ງສໍາເນົາ yacc ແມ່ນແລ່ນຢູ່ໃນ a
ໄດເລກະທໍລີດຽວໃນເວລາດຽວ. ໄດ້ −ຂ ທາງເລືອກໄດ້ຖືກເພີ່ມເພື່ອເອົາຊະນະບັນຫານີ້. ໄດ້
ບັນຫາທີ່ກ່ຽວຂ້ອງຂອງການອະນຸຍາດໃຫ້ຫຼາຍ yacc parser ຈະຖືກຈັດໃສ່ໃນໄຟລ໌ດຽວກັນແມ່ນ
ແກ້ໄຂໂດຍການເພີ່ມ a -ປ ທາງ​ເລືອກ​ທີ່​ຈະ​ລົບ​ລ້າງ​ລະ​ຫັດ​ຍາກ​ໃນ​ເມື່ອ​ກ່ອນ​ yy ຄຳນຳໜ້າຕົວແປ.

ລາຍລະອຽດຂອງ -ປ ທາງ​ເລືອກ​ລະ​ບຸ​ຊຸດ​ຕໍາ​່​ສຸດ​ທີ່​ຂອງ​ຫນ້າ​ທີ່​ແລະ​ຊື່​ຕົວ​ປ່ຽນ​ແປງ​
ທີ່ເຮັດໃຫ້ເກີດຄວາມຂັດແຍ້ງເມື່ອ parser ຫຼາຍເຊື່ອມຕໍ່ກັນ. YYSTYPE ບໍ່ຈໍາເປັນຕ້ອງເປັນ
ປ່ຽນແປງ. ແທນທີ່ຈະ, ຜູ້ຂຽນໂປລແກລມສາມາດນໍາໃຊ້ໄດ້ −ຂ ເພື່ອໃຫ້ໄຟລ໌ header ສໍາລັບ parser ທີ່ແຕກຕ່າງກັນ
ຊື່ທີ່ແຕກຕ່າງກັນ, ແລະຫຼັງຈາກນັ້ນໄຟລ໌ທີ່ມີ yylex() ສໍາລັບ parser ທີ່ໃຫ້ສາມາດປະກອບມີ
ສ່ວນຫົວສຳລັບຕົວວິເຄາະນັ້ນ. ຊື່ເຊັ່ນ yyclearerr ບໍ່ຈໍາເປັນຕ້ອງມີການປ່ຽນແປງເພາະວ່າພວກເຂົາ
ຖືກນໍາໃຊ້ພຽງແຕ່ໃນການປະຕິບັດ; ພວກເຂົາບໍ່ມີການເຊື່ອມໂຍງ. ມັນເປັນໄປໄດ້ວ່າ
ການ​ປະ​ຕິ​ບັດ​ມີ​ຊື່​ອື່ນໆ​, ທັງ​ພາຍ​ໃນ​ສໍາ​ລັບ​ການ​ປະ​ຕິ​ບັດ​ເຊັ່ນ​:​
yyclearerr, ຫຼືການສະຫນອງຄຸນສົມບັດທີ່ບໍ່ແມ່ນມາດຕະຖານທີ່ມັນຕ້ອງການປ່ຽນກັບ -ປ.

ຕົວປະຕິບັດການ Unary ທີ່ເປັນ token ດຽວກັນກັບຕົວປະຕິບັດການສອງໂດຍທົ່ວໄປຕ້ອງການຂອງເຂົາເຈົ້າ
ປັບຕົວກ່ອນແລ້ວ. ນີ້​ແມ່ນ​ການ​ຈັດ​ການ​ໂດຍ​ %prec ສັນຍາລັກທີ່ປຶກສາທີ່ກ່ຽວຂ້ອງກັບ
ກົດລະບຽບຫຼັກໄວຍາກອນທີ່ກໍານົດຕົວປະຕິບັດການ unary ນັ້ນ. (ເບິ່ງ Grammar ກົດລະບຽບ in yacc.)
ແອັບພລິເຄຊັນບໍ່ຈໍາເປັນຕ້ອງໃຊ້ຕົວປະຕິບັດການນີ້ສໍາລັບຕົວປະຕິບັດການ unary, ແຕ່ໄວຍາກອນ
ທີ່ບໍ່ຕ້ອງການມັນແມ່ນຫາຍາກ.

ຕົວຢ່າງ


ການເຂົ້າເຖິງ yacc ຫ້ອງສະຫມຸດແມ່ນໄດ້ຮັບດ້ວຍຕົວປະຕິບັດການຊອກຫາຫ້ອງສະຫມຸດເພື່ອ c99. ການ ນຳ ໃຊ້
yacc ຫ້ອງສະຫມຸດ ຕົ້ນຕໍ():

c99 y.tab.c −l y

ທັງສອງ lex ຫ້ອງສະຫມຸດແລະ yacc ຫ້ອງສະຫມຸດປະກອບດ້ວຍ ຕົ້ນຕໍ(). ເພື່ອເຂົ້າເຖິງ yacc ຕົ້ນຕໍ():

c99 y.tab.c lex.yy.c −l y −l l

ນີ້ຮັບປະກັນວ່າ yacc ຫ້ອງສະຫມຸດໄດ້ຖືກຄົ້ນຫາທໍາອິດ, ດັ່ງນັ້ນມັນ ຕົ້ນຕໍ() ຖືກນໍາໃຊ້.

ປະຫວັດສາດ yacc ຫ້ອງສະຫມຸດມີສອງຫນ້າທີ່ງ່າຍດາຍທີ່ມີລະຫັດປົກກະຕິ
ໂດຍໂປລແກລມແອັບພລິເຄຊັນ. ຟັງຊັນເຫຼົ່ານີ້ແມ່ນຄ້າຍຄືກັນກັບລະຫັດຕໍ່ໄປນີ້:

#include
int ຫຼັກ(void)
{
ພາຍນອກ int yyparse();

setlocale(LC_ALL, "");

/* ຖ້າ parser ຕໍ່ໄປນີ້ແມ່ນຫນຶ່ງທີ່ສ້າງຂຶ້ນໂດຍ lex, the
ແອັບພລິເຄຊັນຕ້ອງລະມັດລະວັງເພື່ອຮັບປະກັນວ່າ LC_CTYPE
ແລະ LC_COLLATE ຖືກຕັ້ງເປັນ POSIX locale. */
(void) yyparse();
ກັບຄືນ (0);
}

#ລວມ

int yyerror(const char *msg)
{
(void) fprintf(stderr, "%s\n", msg);
ກັບຄືນ (0);
}

ສະຖານທີ່


ເອກະສານອ້າງອີງໃນ ອ້າງອີງ ເອ​ກະ​ສານ ອາດຈະເປັນປະໂຫຍດໃນການສ້າງຕົວວິເຄາະ
ເຄື່ອງປັ່ນໄຟ. ບົດຄວາມ DeRemer ແລະ Pennello ອ້າງອີງ (ພ້ອມກັບການເຮັດວຽກຂອງມັນ
ອ້າງອິງ) ອະທິບາຍເຕັກນິກເພື່ອສ້າງຕົວວິເຄາະທີ່ສອດຄ່ອງກັບປະລິມານນີ້
POSIX.1-2008. ວຽກງານໃນຂົງເຂດນີ້ຍັງສືບຕໍ່ເຮັດ, ດັ່ງນັ້ນຜູ້ປະຕິບັດຄວນປຶກສາຫາລື
ວັນນະຄະດີໃນປະຈຸບັນກ່ອນທີ່ຈະດໍາເນີນການໃຫມ່ໃດໆ. ບົດຄວາມຕົ້ນສະບັບ Knuth ແມ່ນ
ພື້ນຖານທາງທິດສະດີສໍາລັບຕົວແຍກປະເພດນີ້, ແຕ່ຕາຕະລາງທີ່ມັນສ້າງແມ່ນ impractically
ຂະຫນາດໃຫຍ່ສໍາລັບໄວຍະກອນທີ່ສົມເຫດສົມຜົນແລະບໍ່ຄວນຖືກນໍາໃຊ້. ຄໍາວ່າ "ທຽບເທົ່າ" ແມ່ນ
ຕັ້ງໃຈເພື່ອຮັບປະກັນວ່າຕາຕະລາງທີ່ດີທີ່ສຸດທີ່ເປັນ ລລລ(1) ສາມາດສ້າງໄດ້.

ມີຄວາມສັບສົນລະຫວ່າງຫ້ອງຮຽນໄວຍາກອນ, ສູດການຄິດໄລ່ທີ່ຈໍາເປັນເພື່ອສ້າງ
parser, ແລະ algorithms ທີ່ຈໍາເປັນເພື່ອວິເຄາະພາສາ. ພວກເຂົາທັງຫມົດແມ່ນສົມເຫດສົມຜົນ
ມຸມສາກ. ໂດຍສະເພາະ, parser generator ທີ່ຍອມຮັບລະດັບເຕັມຂອງ LR(1​)
ໄວຍະກອນບໍ່ຈໍາເປັນຕ້ອງສ້າງຕາຕະລາງທີ່ສະລັບສັບຊ້ອນຫຼາຍກ່ວາຫນຶ່ງທີ່ຍອມຮັບ SLR(1) (ກ
ຫ້ອງຮຽນໄວຍາກອນ LR ທີ່ຂ້ອນຂ້າງອ່ອນ) ສໍາລັບໄວຍາກອນທີ່ເກີດຂື້ນ SLR(1). ດັ່ງກ່າວ
ການປະຕິບັດບໍ່ຈໍາເປັນຕ້ອງຮັບຮູ້ກໍລະນີ, ບໍ່ວ່າຈະ; ການບີບອັດຕາຕະລາງສາມາດໃຫ້ຜົນໄດ້ຮັບ SLR(1​)
ຕາຕະລາງ (ຫຼືຫນຶ່ງແມ້ແຕ່ນ້ອຍກວ່ານັ້ນ) ໂດຍບໍ່ມີການຮັບຮູ້ວ່າໄວຍາກອນແມ່ນ SLR(1). ທ
ຄວາມໄວຂອງການ LR(1) parser ສໍາ​ລັບ​ຫ້ອງ​ຮຽນ​ໃດ​ຫນຶ່ງ​ແມ່ນ​ຂຶ້ນ​ກັບ​ຫຼາຍ​ຂຶ້ນ​ກັບ​ຕົວ​ແທນ​ຕາ​ຕະ​ລາງ​ແລະ​
compression (ຫຼືການສ້າງລະຫັດຖ້າຫາກວ່າ parser ໂດຍກົງແມ່ນຖືກສ້າງຂຶ້ນ) ກ່ວາຕາມຫ້ອງຮຽນ
ຂອງໄວຍາກອນທີ່ເຄື່ອງກໍາເນີດຕາຕະລາງຈັດການ.

ຄວາມໄວຂອງເຄື່ອງສ້າງ parser ແມ່ນຂ້ອນຂ້າງຂື້ນກັບຫ້ອງຮຽນໄວຍາກອນມັນ
ມືຈັບ. ຢ່າງໃດກໍຕາມ, ຕົ້ນສະບັບຂອງບົດຄວາມ Knuth ສໍາລັບການກໍ່ສ້າງຕົວວິເຄາະ LR ແມ່ນ
ຕັດ​ສິນ​ໂດຍ​ຜູ້​ຂຽນ​ຂອງ​ຕົນ​ແມ່ນ​ຊ້າ impractically ໃນ​ເວ​ລາ​ນັ້ນ. ເຖິງແມ່ນວ່າ LR ເຕັມແມ່ນຫຼາຍ
ຊັບຊ້ອນກວ່າ ລລລ(1), ຍ້ອນວ່າຄວາມໄວຂອງຄອມພິວເຕີແລະສູດການຄິດໄລ່ປັບປຸງ, ຄວາມແຕກຕ່າງ (ໃນຂໍ້ກໍານົດ
ເວລາປະຕິບັດໂມງຕິດຝາທີ່ຍອມຮັບໄດ້) ກໍາລັງກາຍເປັນສິ່ງສໍາຄັນຫນ້ອຍລົງ.

ຜູ້ຂຽນທີ່ມີທ່າແຮງໄດ້ຖືກເຕືອນວ່າບົດຄວາມ DeRemer ແລະ Pennello ອ້າງອີງ
ອ້າງເຖິງກ່ອນຫນ້ານີ້ໄດ້ກໍານົດ bug (ເປັນ over-simplification ຂອງການຄິດໄລ່ຂອງ ລລລ(1​)
lookahead sets) ໃນບາງສ່ວນຂອງ ລລລ(1) ຄໍາຖະແຫຼງການ algorithm ທີ່ນໍາຫນ້າມັນໄປ
ສິ່ງພິມ. ພວກເຂົາຄວນໃຊ້ເວລາເພື່ອຊອກຫາເອກະສານນັ້ນ, ເຊັ່ນດຽວກັນກັບປັດຈຸບັນທີ່ກ່ຽວຂ້ອງ
ເຮັດວຽກ, ໂດຍສະເພາະຂອງ Aho.

ໄດ້ −ຂ ທາງ​ເລືອກ​ໄດ້​ຖືກ​ເພີ່ມ​ເພື່ອ​ສະ​ຫນອງ​ວິ​ທີ​ການ Portable ສໍາ​ລັບ​ການ​ອະ​ນຸ​ຍາດ​ yacc ການເຮັດວຽກກ່ຽວກັບ
parser ແຍກຕ່າງຫາກຫຼາຍອັນຢູ່ໃນໄດເລກະທໍລີດຽວກັນ. ຖ້າໄດເຣັກທໍຣີມີຫຼາຍກວ່າຫນຶ່ງ
yacc ໄວຍະກອນ, ແລະໄວຍະກອນທັງສອງແມ່ນຖືກສ້າງຂຶ້ນໃນເວລາດຽວກັນ (ໂດຍ, ສໍາລັບການຍົກຕົວຢ່າງ, a
ຂະຫນານ ເຮັດໃຫ້ program), ຜົນໄດ້ຮັບການຂັດແຍ້ງ. ໃນຂະນະທີ່ການແກ້ໄຂບໍ່ແມ່ນການປະຕິບັດປະຫວັດສາດ,
ມັນແກ້ໄຂຂໍ້ບົກຜ່ອງທີ່ຮູ້ຈັກໃນການປະຕິບັດປະຫວັດສາດ. ການປ່ຽນແປງທີ່ສອດຄ້ອງກັນແມ່ນ
ເຮັດໃສ່ທຸກພາກສ່ວນທີ່ອ້າງອີງຊື່ໄຟລ໌ y.tab.c (ຕອນນີ້ ``ໄຟລ໌ລະຫັດ´),
y.tab.h (ໃນ​ປັດ​ຈຸ​ບັນ ``ໄຟລ​໌​ຫົວ​ຂໍ້​´​)​, ແລະ​ y. ຜົນຜະລິດ (ຕອນນີ້ ``ໄຟລ໌ຄໍາອະທິບາຍ'').

ໄວຍາກອນສໍາລັບ yacc ການປ້ອນຂໍ້ມູນແມ່ນອີງໃສ່ເອກະສານລະບົບ V. ຄໍາອະທິບາຍຂໍ້ຄວາມ
ສະແດງໃຫ້ເຫັນຢູ່ທີ່ນັ້ນ ';' ແມ່ນຕ້ອງການໃນຕອນທ້າຍຂອງກົດລະບຽບ. ໄວຍາກອນແລະ
ການປະຕິບັດບໍ່ຕ້ອງການນີ້. (ການ​ນໍາ​ໃຊ້​ຂອງ​ C_IDENTIFIER ເຮັດໃຫ້ເກີດການຫຼຸດຜ່ອນການເກີດຂື້ນໃນ
ສະ​ຖານ​ທີ່​ທີ່​ເຫມາະ​ສົມ​.)

ນອກຈາກນີ້, ໃນການຈັດຕັ້ງປະຕິບັດນັ້ນ, ການກໍ່ສ້າງເຊັ່ນ: %ໂທເຄັນ ສາມາດຖືກຍົກເລີກໂດຍ a
, ແຕ່ນີ້ບໍ່ໄດ້ຖືກອະນຸຍາດໂດຍໄວຍາກອນ. ຄໍາສໍາຄັນເຊັ່ນ: %ໂທເຄັນ ສາມາດເຮັດໄດ້
ຍັງປາກົດຢູ່ໃນຕົວພິມໃຫຍ່, ເຊິ່ງອີກເທື່ອຫນຶ່ງບໍ່ໄດ້ປຶກສາຫາລື. ໃນສະຖານທີ່ຫຼາຍທີ່ສຸດ '%' ຖືກນໍາໃຊ້,
ສາມາດທົດແທນໄດ້, ແລະມີຕົວສະກົດສະຫຼັບສໍາລັບບາງສັນຍາລັກ
(ຍົກ​ຕົວ​ຢ່າງ, %ຊ້າຍ ສາມາດ "%<" ຫຼື​ແມ້​ກະ​ທັ້ງ "\<").

ທາງປະຫວັດສາດ,ໂຄດ​ຄໍາ​ສັ່ງ> ສາມາດມີຕົວອັກສອນໃດໆ ຍົກເວັ້ນ '>', ລວມທັງພື້ນທີ່ສີຂາວ, ໃນ
ການຈັດຕັ້ງປະຕິບັດ. ຢ່າງໃດກໍຕາມ, ນັບຕັ້ງແຕ່ ໂຄດ​ຄໍາ​ສັ່ງ ຕ້ອງອ້າງອີງເຖິງສະມາຊິກສະຫະພັນມາດຕະຖານ ISO C, ໃນ
ການ​ປະ​ຕິ​ບັດ​ການ​ປະ​ຕິ​ບັດ​ສອດ​ຄ່ອງ​ຈໍາ​ເປັນ​ຕ້ອງ​ສະ​ຫນັບ​ສະ​ຫນູນ​ພຽງ​ແຕ່​ຊຸດ​ຂອງ​ຕົວ​ອັກ​ສອນ​ສໍາ​ລັບ ISO C​
ຕົວລະບຸມາດຕະຖານໃນບໍລິບົດນີ້.

ການປະຕິບັດປະຫວັດສາດບາງຢ່າງແມ່ນເປັນທີ່ຮູ້ຈັກທີ່ຈະຍອມຮັບການກະທໍາທີ່ຖືກຍົກເລີກໂດຍ a
ໄລຍະເວລາ. ການປະຕິບັດປະຫວັດສາດມັກຈະອະນຸຍາດໃຫ້ '$' ໃນ​ຊື່. ການປະຕິບັດທີ່ສອດຄ່ອງ
ບໍ່ຈໍາເປັນຕ້ອງສະຫນັບສະຫນູນພຶດຕິກໍາເຫຼົ່ານີ້.

ການ​ຕັດ​ສິນ​ໃຈ​ໃນ​ເວ​ລາ​ທີ່​ຈະ​ນໍາ​ໃຊ້​ %prec ສະ​ແດງ​ໃຫ້​ເຫັນ​ຄວາມ​ຫຍຸ້ງ​ຍາກ​ໃນ​ການ​ລະ​ບຸ​ພຶດ​ຕິ​ກໍາ​ຂອງ​ yacc.
ອາດຈະມີສະຖານະການທີ່ grammar ບໍ່ແມ່ນ, ເວົ້າຢ່າງເຂັ້ມງວດ, ໃນຄວາມຜິດພາດ, ແລະຍັງ
yacc ບໍ່ສາມາດຕີຄວາມມັນໄດ້ຢ່າງບໍ່ຊັດເຈນ. ການແກ້ໄຂຄວາມບໍ່ແນ່ນອນໃນໄວຍາກອນສາມາດ
ໃນຫຼາຍໆກໍລະນີໄດ້ຮັບການແກ້ໄຂໂດຍການສະຫນອງຂໍ້ມູນເພີ່ມເຕີມ, ເຊັ່ນ: ການນໍາໃຊ້ ປະເພດ or
% ສະຫະພັນ ຖະແຫຼງການ. ມັນມັກຈະງ່າຍຂຶ້ນ ແລະມັນມັກຈະໃຫ້ຜົນຕົວແຍກທີ່ນ້ອຍກວ່າທີ່ຈະເອົາ
ທາງເລືອກນີ້ໃນເວລາທີ່ມັນເຫມາະສົມ.

ຂະ​ຫນາດ​ແລະ​ເວ​ລາ​ປະ​ຕິ​ບັດ​ຂອງ​ໂຄງ​ການ​ທີ່​ຜະ​ລິດ​ໂດຍ​ບໍ່​ມີ​ການ​ລະ​ຫັດ​ດີ​ບັກ runtime ແມ່ນ​
ປົກກະຕິແລ້ວນ້ອຍກວ່າ ແລະໄວກວ່າເລັກນ້ອຍໃນການປະຕິບັດປະຫວັດສາດ.

ຂໍ້ຄວາມສະຖິຕິຈາກການປະຕິບັດປະຫວັດສາດຈໍານວນຫນຶ່ງປະກອບມີປະເພດດັ່ງຕໍ່ໄປນີ້ຂອງ
ຂໍ້ມູນຂ່າວສານ:

n/512 ປາຍ​, n/300 ບໍ່ຢູ່ປາຍຍອດ
n/ 600 ຫຼັກ​ໄວ​ຍາ​ກອນ​, n/1500 ລັດ
n ປ່ຽນ / ຫຼຸດ​ຜ່ອນ​, n ຫຼຸດຜ່ອນ / ຫຼຸດຜ່ອນຂໍ້ຂັດແຍ່ງລາຍງານ
n/ 350 ຊຸດເຮັດວຽກທີ່ໃຊ້
ຫນ່ວຍຄວາມຈໍາ: ລັດ, ແລະອື່ນໆ. n/15000, parser n/ 15000
n/600 ຊຸດ lookahead ທີ່ແຕກຕ່າງ
n ການປິດພິເສດ
n ການ​ປ່ຽນ​ແປງ​ລາຍ​ການ​, n ຍົກເວັ້ນ
n goto ລາຍການ
n ບັນທຶກລາຍການໂດຍ goto ເລີ່ມຕົ້ນ
ພື້ນທີ່ optimizer ໃຊ້: input n/15000, ຜົນຜະລິດ n/ 15000
n ລາຍການຕາຕະລາງ, n ສູນ
ການແຜ່ກະຈາຍສູງສຸດ: n, ຊົດເຊີຍສູງສຸດ: n

ບົດລາຍງານຂອງຕາຕະລາງພາຍໃນໃນໄຟລ໌ຄໍາອະທິບາຍແມ່ນປະໄວ້ການປະຕິບັດທີ່ກໍານົດໄວ້
ເນື່ອງຈາກວ່າທຸກໆດ້ານຂອງຂໍ້ຈໍາກັດເຫຼົ່ານີ້ຍັງຖືກກໍານົດການຈັດຕັ້ງປະຕິບັດ. ການປະຕິບັດບາງຢ່າງ
ອາດຈະໃຊ້ເຕັກນິກການຈັດສັນແບບເຄື່ອນໄຫວ ແລະບໍ່ມີຄ່າຈໍາກັດສະເພາະທີ່ຈະລາຍງານ.

ຮູບແບບຂອງ y. ຜົນຜະລິດ ບໍ່ໄດ້ໃຫ້ໄຟລ໌ເນື່ອງຈາກວ່າສະເພາະຂອງຮູບແບບບໍ່ແມ່ນ
ເຫັນ​ໄດ້​ເພື່ອ​ເສີມ​ຂະ​ຫຍາຍ​ການ​ເຄື່ອນ​ໄຫວ​ຂອງ​ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​. ບັນຊີລາຍຊື່ດັ່ງກ່າວແມ່ນມີຈຸດປະສົງຕົ້ນຕໍເພື່ອຊ່ວຍມະນຸດ
ຜູ້ໃຊ້ເຂົ້າໃຈແລະດີບັກຕົວວິເຄາະ; ການນໍາໃຊ້ y. ຜົນຜະລິດ ໂດຍສະຄຣິບແອັບພລິເຄຊັນທີ່ສອດຄ່ອງ
ຈະຜິດປົກກະຕິ. ຍິ່ງໄປກວ່ານັ້ນ, ການຈັດຕັ້ງປະຕິບັດຍັງບໍ່ທັນໄດ້ຜົນຜະລິດທີ່ສອດຄ່ອງແລະບໍ່ມີ
ຮູບແບບທີ່ນິຍົມແມ່ນປາກົດຂື້ນ. ຮູບແບບທີ່ເລືອກໂດຍການຈັດຕັ້ງປະຕິບັດຄວນຈະເປັນມະນຸດ-
readable, ນອກ​ເຫນືອ​ໄປ​ຈາກ​ຄວາມ​ຕ້ອງ​ການ​ທີ່​ວ່າ​ມັນ​ເປັນ​ໄຟລ​໌​ຂໍ້​ຄວາມ​.

ບົດລາຍງານຄວາມຜິດພາດມາດຕະຖານບໍ່ໄດ້ຖືກອະທິບາຍໂດຍສະເພາະເພາະວ່າພວກມັນບໍ່ຄ່ອຍຈະໃຊ້
ປະຕິບັດຕາມຄໍາຮ້ອງສະຫມັກແລະບໍ່ມີເຫດຜົນທີ່ຈະຈໍາກັດການປະຕິບັດ.

ການປະຕິບັດບາງຢ່າງຮັບຮູ້ "={" ເທົ່າກັບ '{' ເນື່ອງຈາກວ່າມັນປາກົດຢູ່ໃນປະຫວັດສາດ
ເອກະສານ. ການ​ກໍ່​ສ້າງ​ນີ້​ໄດ້​ຮັບ​ການ​ຮັບ​ຮູ້​ແລະ​ເອ​ກະ​ສານ​ເປັນ​ທີ່​ລ້າ​ສະ​ໄຫມ​ເປັນ​ຍາວ​ທີ່​ຜ່ານ​ມາ​
1978, ໃນ​ການ​ອ້າງ​ອີງ Yacc: ຢ່າງໃດກໍ່ຕາມ ອີກປະການຫນຶ່ງ Compiler-Compiler. ປະລິມານນີ້ຂອງ POSIX.1-2008
ເລືອກ​ທີ່​ຈະ​ປະ​ຖິ້ມ​ມັນ​ເປັນ​ລ້າ​ສະ​ໄຫມ​ແລະ omit ມັນ​.

ຕົວອັກສອນຫຼາຍໄບທ໌ຄວນໄດ້ຮັບການຮັບຮູ້ໂດຍຕົວວິເຄາະ lexical ແລະສົ່ງຄືນເປັນ tokens.
ພວກມັນບໍ່ຄວນຖືກສົ່ງຄືນເປັນຕົວອັກສອນຫຼາຍໄບຕ໌. ໂທເຄັນ ຄວາມຜິດພາດ ທີ່ຖືກນໍາໃຊ້
ສໍາ​ລັບ​ການ​ຟື້ນ​ຕົວ​ຄວາມ​ຜິດ​ພາດ​ແມ່ນ​ປົກ​ກະ​ຕິ​ກໍາ​ນົດ​ຄ່າ 256 ໃນ​ການ​ປະ​ຕິ​ບັດ​ປະ​ຫວັດ​ສາດ​.
ດັ່ງນັ້ນ, ຄ່າ token 256, ທີ່ຖືກນໍາໃຊ້ໃນຫຼາຍຊຸດຕົວອັກສອນຫຼາຍໄບ, ບໍ່ແມ່ນ
ມີໃຫ້ໃຊ້ເປັນມູນຄ່າຂອງໂທເຄັນທີ່ຜູ້ໃຊ້ກຳນົດເອງ.

ອະນາຄົດ DIRECTIONS


ບໍ່ມີ.

ໃຊ້ yaccposix ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net


ເຊີບເວີ ແລະສະຖານີເຮັດວຽກຟຣີ

ດາວໂຫຼດແອັບ Windows ແລະ Linux

  • 1
    itop - ITSM CMDB OpenSource
    itop - ITSM CMDB OpenSource
    ປະ​ຕູ​ປະ​ຕິ​ບັດ​ການ IT​: ເປັນ​ການ​ເປີດ​ຄົບ​ຖ້ວນ​ສົມ​ບູນ​
    ແຫຼ່ງ, ITIL, ການບໍລິການທີ່ອີງໃສ່ເວັບ
    ເຄື່ອງ​ມື​ການ​ຄຸ້ມ​ຄອງ​ລວມ​ທັງ​ຫມົດ​
    CMDB ທີ່ສາມາດປັບແຕ່ງໄດ້, ລະບົບ helpdesk ແລະ
    ຜູ້​ຊາຍ​ເອ​ກະ​ສານ ...
    ດາວໂຫລດເທິງ - ITSM CMDB OpenSource
  • 2
    Clementine
    Clementine
    Clementine ເປັນດົນຕີຫຼາຍເວທີ
    ຜູ້ນແລະຜູ້ຈັດຫ້ອງສະຫມຸດໄດ້ຮັບການດົນໃຈໂດຍ
    Amarok 1.4. ມັນ​ມີ​ໄວ​ແລະ​
    ການ​ໂຕ້​ຕອບ​ງ່າຍ​ທີ່​ຈະ​ນໍາ​ໃຊ້​, ແລະ​ອະ​ນຸ​ຍາດ​ໃຫ້​ທ່ານ​
    ຄົ້ນຫາແລະ ...
    ດາວໂຫລດ Clementine
  • 3
    XISMus
    XISMus
    ເອົາ​ໃຈ​ໃສ່​: ການ​ປັບ​ປຸງ​ສະ​ສົມ 2.4.3 ມີ​
    ປ່ອຍອອກມາ!! ການປັບປຸງເຮັດວຽກສໍາລັບການໃດໆ
    ຮຸ່ນ 2.xx ທີ່ຜ່ານມາ. ຖ້າການຍົກລະດັບ
    ຈາກເວີຊັນ v1.xx, ກະລຸນາດາວໂຫຼດ ແລະ
    ຂ້າພະເຈົ້າ ...
    ດາວໂຫລດ XISMuS
  • 4
    facetracknoir
    facetracknoir
    Modular headtracking ໂຄງ​ການ​ທີ່​
    ຮອງຮັບຫຼາຍຕົວຕິດຕາມໃບຫນ້າ, ຕົວກອງ
    ແລະໂປໂຕຄອນເກມ. ໃນບັນດາຜູ້ຕິດຕາມ
    ແມ່ນ SM FaceAPI, AIC Inertial Head
    ບົບຕິດຕາມລຸດ ...
    ດາວໂຫລດ facetracknoir
  • 5
    PHP QR Code
    PHP QR Code
    PHP QR Code ແມ່ນແຫຼ່ງເປີດ (LGPL)
    ຫ້ອງສະຫມຸດສໍາລັບການສ້າງລະຫັດ QR,
    ບາໂຄດ 2 ມິຕິ. ອີງໃສ່
    libqrencode C ຫໍສະຫມຸດ, ສະຫນອງ API ສໍາລັບ
    ສ້າງ QR Code barc...
    ດາວໂຫລດ PHP QR Code
  • 6
    freeciv
    freeciv
    Freeciv ເປັນ turn-based ຟຣີ
    ເກມຍຸດທະສາດ multiplayer, ເຊິ່ງແຕ່ລະຄົນ
    ຜູ້ນກາຍເປັນຜູ້ນໍາຂອງ a
    ພົນ​ລະ​ເຮືອນ​, ການ​ຕໍ່​ສູ້​ເພື່ອ​ໃຫ້​ໄດ້​ຮັບ​
    ເປົ້າໝາຍສູງສຸດ: ຈະເປັນ...
    ດາວໂຫລດ Freeciv
  • ເພີ່ມເຕີມ »

Linux ຄຳ ສັ່ງ

Ad