ນີ້ແມ່ນຄໍາສັ່ງ btyacc ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
btyacc — ເປັນ ລລລ(1) parser generator ສະຫນັບສະຫນູນສໍາລັບການ backtracking
ສະຫຼຸບສັງລວມ
btyac [-ຂ ຄຳ ນຳ ໜ້າ] [-d] [-DNAME ...] [-E] [-l] [-r] [-ສ x.ske] [-t] [-v]
filename.y
ລາຍລະອຽດ
btyacc ແມ່ນສະບັບດັດແກ້ຂອງ byacc (Berkeley YACC), ເຊິ່ງເປັນໂດເມນສາທາລະນະ.
ເວີຊັ່ນຂອງເຄື່ອງແຍກວິເຄາະ AT&T YACC ຕົ້ນສະບັບ.
btyacc ອ່ານສະເພາະໄວຍາກອນໃນໄຟລ໌ filename.y ແລະສ້າງ LR(1)
parser ສໍາລັບມັນ. parser ປະກອບດ້ວຍຊຸດຂອງ ລລລ(1) ຕາຕະລາງການວິເຄາະແລະປົກກະຕິຂອງຄົນຂັບໄດ້
ຂຽນໃນພາສາການຂຽນໂປລແກລມ C. btyacc ປົກກະຕິຂຽນຕາຕະລາງ parse ແລະ
driver routine ກັບໄຟລ໌ ຄຳ ນຳ ໜ້າ.tab.c, ບ່ອນທີ່ ຄຳ ນຳ ໜ້າ ເລີ່ມຕົ້ນເປັນ 'y'.
ສໍາລັບລາຍລະອຽດຂອງຮູບແບບການສະເພາະໄວຍະກອນ, ແລະດີເລີດ
ການສອນກ່ຽວກັບວິທີການນໍາໃຊ້ເຄື່ອງມືຄ້າຍຄື YACC, ເບິ່ງຄູ່ມືຂໍ້ມູນສໍາລັບ GNU bison. btyac-
ສ່ວນຂະຫຍາຍສະເພາະແມ່ນໄດ້ອະທິບາຍໄວ້ຂ້າງລຸ່ມນີ້.
ຫມາຍເຫດ: parser skeleton ທີ່ສະໜອງໃຫ້ໂດຍຜູ້ຂຽນ upstream ຂອງ btyacc ພຽງແຕ່ລວບລວມເປັນ C++. ໃຊ້
ໂຄງກະດູກ /usr/doc/btyacc/examples/btyacc-c.ske ເພື່ອສ້າງຕົວແຍກວິເຄາະທີ່ລວບລວມທັງສອງ
ເປັນ C ແລະ C ++. (ຫນ້າເສຍດາຍ, ໂຄງກະດູກທາງເລືອກນີ້ບໍ່ໄດ້ກວດເບິ່ງ malloc() ໃນປັດຈຸບັນ.
ກັບຄືນມູນຄ່າ.)
ທາງເລືອກໃນການ
-b ຄຳ ນຳ ໜ້າ ປ່ຽນຄຳນຳໜ້າທີ່ນຳໜ້າໃສ່ຊື່ໄຟລ໌ຜົນຜະລິດເປັນສະຕຣິງທີ່ສະແດງໂດຍ
ຄຳ ນຳ ໜ້າ. ຄຳນຳໜ້າເລີ່ມຕົ້ນແມ່ນຕົວອັກສອນ `y'.
-d ສ້າງໄຟລ໌ header ເອີ້ນວ່າ ຄຳ ນຳ ໜ້າ.tab.h ຄຽງຄູ່ກັບການ ຄຳ ນຳ ໜ້າ.tab.c,
ປະກອບດ້ວຍຄໍານິຍາມຂອງສັນຍາລັກແລະການປະກາດສໍາລັບ YYSTYPE ແລະ yylval.
-DNAME ກໍານົດຕົວແປ preprocessor btyacc NAME, ສໍາລັບການນໍາໃຊ້ກັບ %ifdef NAME
ຄໍາແນະນໍາໃນໄຟລ໌ໄວຍາກອນ.
-E ພິມໄວຍະກອນທີ່ປຸງແຕ່ງໄວ້ກ່ອນເປັນຜົນຜະລິດມາດຕະຖານ.
-l ຢ່າໃສ່ #ສາຍ ຄໍາສັ່ງເຂົ້າໄປໃນລະຫັດ parser ທີ່ສ້າງຂຶ້ນ.
-r ຂຽນລະຫັດ parser ແລະຕາຕະລາງທີ່ກ່ຽວຂ້ອງກັບໄຟລ໌ທີ່ແຕກຕ່າງກັນ. ໃນຂະນະທີ່
ຕາຕະລາງສາມາດພົບເຫັນຢູ່ໃນ ຄຳ ນຳ ໜ້າ.tab.c ຄືກັບກ່ອນ, ລະຫັດໄດ້ຖືກຂຽນແລ້ວ
to ຄຳ ນຳ ໜ້າ.code.c.
-S x.ske ເລືອກໂຄງກະດູກຕົວວິເຄາະທີ່ແຕກຕ່າງກັນ. ໂຄງກະດູກເລີ່ມຕົ້ນແມ່ນ hardwired ເຂົ້າໄປໃນ
ໂຄງການ, ແຕ່ສໍາເນົາສາມາດພົບເຫັນຢູ່ໃນໄຟລ໌ btyacpa.ske.
-t ເຮັດໃຫ້ລະຫັດດີບັກຖືກລວບລວມເຂົ້າໄປໃນຕົວແຍກວິເຄາະທີ່ສ້າງຂຶ້ນ.
-v ຂຽນລາຍລະອຽດທີ່ມະນຸດສາມາດອ່ານໄດ້ຂອງຕົວແຍກວິເຄາະທີ່ສ້າງຂຶ້ນ y. ຜົນຜະລິດທີ່ຢູ່ ມັນ
ປະກອບມີລັດຕົວວິເຄາະ, ການປະຕິບັດສໍາລັບ token ເບິ່ງລ່ວງໜ້າ ແລະຂໍ້ມູນກ່ຽວກັບໃດໆ
ຂໍ້ຂັດແຍ່ງ.
BTYACC ການຂະຫຍາຍ
ການຕິດຕາມຫຼັງ ສະຫນັບສະຫນູນ
ເມື່ອໃດກໍ່ຕາມ parser ທີ່ສ້າງຂຶ້ນ btyacc ແລ່ນເຂົ້າໄປໃນ shift-reduce ຫຼືຫຼຸດລົງ-reduce ຄວາມຜິດພາດໃນ
parse ຕາຕະລາງ, ມັນຈື່ຈໍາຈຸດ parse ໃນປະຈຸບັນ (stack ແລະສະຕຣີມ input), ແລະໄປ
ເຂົ້າໄປໃນໂໝດວິເຄາະທົດລອງ. ຈາກນັ້ນມັນສືບຕໍ່ວິເຄາະ, ບໍ່ສົນໃຈການກະທຳຂອງກົດລະບຽບສ່ວນໃຫຍ່. ຖ້າມັນແລ່ນ
ເຂົ້າໄປໃນຄວາມຜິດພາດ (ບໍ່ວ່າຈະຜ່ານຕາຕະລາງວິເຄາະຫຼືໂດຍຜ່ານການໂທຫາການປະຕິບັດ YYERROR), ມັນ
backtracks ກັບຈຸດຂັດແຍ້ງຫຼ້າສຸດແລະພະຍາຍາມທາງເລືອກອື່ນ. ຖ້າຫາກວ່າມັນ
ຊອກຫາເສັ້ນທາງທີ່ສົບຜົນສໍາເລັດ (ເຖິງຕອນທ້າຍຂອງການປ້ອນຂໍ້ມູນຫຼືການຮຽກຮ້ອງການປະຕິບັດ YYVALID), ມັນ
backtracks ໄປຫາຈຸດທີ່ທໍາອິດທີ່ມັນເຂົ້າໄປໃນການທົດລອງ parse mode, ແລະສືບຕໍ່ດ້ວຍເຕັມ
parse (ປະຕິບັດການດໍາເນີນການທັງຫມົດ), ປະຕິບັດຕາມເສັ້ນທາງຂອງການທົດລອງສົບຜົນສໍາເລັດ.
ການປະຕິບັດໃນ btyacc ມີສອງລົດຊາດ: {} ການກະ ທຳ, ເຊິ່ງຖືກປະຕິບັດພຽງແຕ່ເມື່ອບໍ່ຢູ່ໃນ
ຮູບແບບການທົດລອງ, ແລະ [] ການປະຕິບັດ, ເຊິ່ງຖືກປະຕິບັດໂດຍບໍ່ຄໍານຶງເຖິງຮູບແບບ.
ຕົວຢ່າງ: ໃນໄວຍາກອນຂອງ YACC ສໍາລັບ C, ການແຮັກມາດຕະຖານທີ່ເອີ້ນວ່າ "lexer feedback hack" ແມ່ນ
ໃຊ້ເພື່ອຊອກຫາຊື່ typedef. Lexer ໃຊ້ຂໍ້ມູນ semantic ເພື່ອຕັດສິນໃຈວ່າມີການໃຫ້
identifier ແມ່ນຊື່ typedef ຫຼືບໍ່ແລະສົ່ງຄືນ token ພິເສດ. ດ້ວຍ btyacc, ເຈົ້າບໍ່
ຕໍ່ໄປອີກແລ້ວຈໍາເປັນຕ້ອງເຮັດສິ່ງນີ້; lexer ຄວນສົ່ງຄືນຕົວລະບຸສະເໝີ. btyac
ຫຼັງຈາກນັ້ນ, ໄວຍາກອນຕ້ອງການກົດລະບຽບຂອງແບບຟອມ:
ຊື່ປະເພດ: ID [ if (!IsTypeName(LookupId($1))) YYERROR; ]
ຢ່າງໃດກໍຕາມ, ໃຫ້ສັງເກດວ່າການເພີ່ມກົດລະບຽບ backtracking ຊ້າລົງ parser. ໃນການປະຕິບັດ, ທ່ານ
ຄວນພະຍາຍາມຈໍາກັດຈໍານວນຂອງຂໍ້ຂັດແຍ່ງໃນໄວຍາກອນກັບສິ່ງທີ່ເປັນຢ່າງແທ້ຈິງ
ຈໍາເປັນ. ພິຈາລະນາໃຊ້ "lexer feedback hack" ຖ້າມັນເປັນການແກ້ໄຂທີ່ສະອາດ, ແລະ
ສະຫງວນ backtracking ສໍາລັບກໍລະນີພິເສດຈໍານວນຫນ້ອຍ.
btyacc ດໍາເນີນການທົດລອງຂອງຕົນໂດຍໃຊ້ກົດລະບຽບ "ລອງປ່ຽນກ່ອນ, ຫຼັງຈາກນັ້ນພະຍາຍາມຫຼຸດລົງໃນຄໍາສັ່ງ
ກົດລະບຽບທີ່ຂັດແຍ້ງປາກົດຢູ່ໃນໄຟລ໌ປ້ອນຂໍ້ມູນ" ນີ້ຫມາຍຄວາມວ່າທ່ານສາມາດປະຕິບັດໄດ້
ກົດລະບຽບ disambiguation semantic ເຊັ່ນ: (1) ຖ້າມັນເບິ່ງຄືວ່າເປັນການປະກາດ,
ຖ້າບໍ່ດັ່ງນັ້ນ (2) ຖ້າຫາກວ່າມັນຄ້າຍຄືການສະແດງອອກ, ຖ້າບໍ່ດັ່ງນັ້ນ (3) ມັນເປັນ syntax ຜິດພາດ.
[Ellis & Stroustrup, Annotated C++ Reference Manual, p93]. ເພື່ອເຮັດສິ່ງນີ້, ເອົາທັງຫມົດ
ກົດລະບຽບສໍາລັບການປະກາດກ່ອນກົດລະບຽບສໍາລັບການສະແດງອອກໃນໄຟລ໌ໄວຍາກອນ.
Backtracking ແມ່ນກະຕຸ້ນພຽງແຕ່ເມື່ອ parse ບັນລຸການປ່ຽນແປງ / ຫຼຸດລົງຫຼືຫຼຸດລົງ / ຫຼຸດລົງ
ຂໍ້ຂັດແຍ່ງໃນຕາຕະລາງ. ຖ້າທ່ານບໍ່ມີຄວາມຂັດແຍ້ງໃນໄວຍາກອນຂອງທ່ານ, ບໍ່ມີຄ່າໃຊ້ຈ່າຍເພີ່ມເຕີມ,
ນອກ ເໜືອ ໄປຈາກລະຫັດພິເສດບາງຢ່າງທີ່ຈະບໍ່ຖືກເອີ້ນ.
ໃນປັດຈຸບັນ, parser ທີ່ສ້າງຂຶ້ນດໍາເນີນການ no pruning ຂອງເສັ້ນທາງການແຍກສະຫຼັບ. ເພື່ອຫຼີກເວັ້ນການ
ການລະເບີດຂອງ exponential ຂອງເສັ້ນທາງທີ່ເປັນໄປໄດ້ (ແລະເວລາວິເຄາະ), ທ່ານຈໍາເປັນຕ້ອງບອກດ້ວຍຕົນເອງ
parser ເມື່ອມັນສາມາດຖິ້ມເສັ້ນທາງທີ່ບັນທຶກໄວ້ໂດຍໃຊ້ YYVALID ຖະແຫຼງການ. ໃນ
ການປະຕິບັດ, ນີ້ turns ອອກຈະເປັນທໍາມະດາງ່າຍທີ່ຈະເຮັດໄດ້. ຕົວຢ່າງເຊັ່ນ C ++ parser ສາມາດພຽງແຕ່
ບັນຈຸ [YYVALID;] ຫຼັງຈາກການປະກາດຄົບຖ້ວນສົມບູນແລະກົດລະບຽບຖະແຫຼງການ, ຜົນໄດ້ຮັບ
ສະຖານະ backtracking ຖືກຕັດອອກຫຼັງຈາກເຫັນ `;' ຫຼື `}' - ຈະບໍ່ເຄີຍມີ
ສະຖານະການທີ່ມັນເປັນປະໂຫຍດທີ່ຈະກັບຄືນໄປບ່ອນທັງຫມົດຂອງເຫຼົ່ານີ້.
ປັບປຸງ token ຕໍາແຫນ່ງ ການຈັດການ
ຜູ້ລວບລວມຂໍ້ມູນມັກຈະຕ້ອງສ້າງ ASTs (ຕົ້ນໄມ້ syntax ທີ່ບໍ່ມີຕົວຕົນ) ເຊັ່ນວ່າທຸກໆ node ໃນຕົ້ນໄມ້
ສາມາດກ່ຽວຂ້ອງກັບແຫຼ່ງໂຄງການທີ່ໄດ້ວິເຄາະມັນມາຈາກ. ໄດ້ YYPOSN ກົນໄກສະຫນັບສະຫນູນ
ໂດຍ btyacc ຊ່ວຍໃຫ້ທ່ານໃນອັດຕະໂນມັດການຄິດໄລ່ຕໍາແຫນ່ງຂໍ້ຄວາມແລະໃນການມອບຫມາຍ
ຕໍາແຫນ່ງຂໍ້ຄວາມທີ່ຄໍານວນກັບຂໍ້ AST.
ໃນ YACCs ມາດຕະຖານທຸກ token ແລະທຸກ non-terminal ມີ YYSTYPE ຄ່າ semantic
ຕິດກັບມັນ. ດ້ວຍ btyacc, ທຸກໆ token ແລະທຸກ non-terminal ຍັງມີ YYPOSN ຂໍ້ຄວາມ
ຕໍາແຫນ່ງຕິດກັບມັນ. YYPOSN ເປັນປະເພດທີ່ຜູ້ໃຊ້ກໍານົດ.
btyacc ຮັກສາ stack ຂອງຄ່າຕໍາແຫນ່ງຂໍ້ຄວາມໃນແບບດຽວກັນທີ່ມັນຮັກສາ stack
ຂອງຄ່າ semantic. ເພື່ອເຮັດໃຫ້ການນໍາໃຊ້ຄຸນນະສົມບັດຕໍາແຫນ່ງຂໍ້ຄວາມ, ທ່ານຈໍາເປັນຕ້ອງໄດ້ #ກໍານົດ ໄດ້
ຕໍ່ໄປນີ້:
YYPOSN Preprocessor ສັນຍາລັກສໍາລັບປະເພດ C/C++ ຂອງຕໍາແຫນ່ງຂໍ້ຄວາມທີ່ຕິດກັບທຸກ
token ແລະ non-terminal.
yyposn ຕົວແປທົ່ວໂລກຂອງປະເພດ YYPOSN. lexer ຕ້ອງກໍາຫນົດຕໍາແຫນ່ງຂໍ້ຄວາມຂອງ
ກັບຄືນ token ກັບ yyposn, ຄືກັນກັບມັນກໍານົດຄ່າ semantic ຂອງ
ກັບຄືນ token ກັບ yylval.
YYREUCEPOSNFUNC
ສັນຍາລັກຂອງໂປເຊດເຊີ Preprocessor ສໍາລັບຟັງຊັນທີ່ຖືກເອີ້ນວ່າທັນທີຫຼັງຈາກປົກກະຕິ
ການຫຼຸດຜ່ອນກົດລະບຽບໄວຍະກອນໄດ້ຮັບການປະຕິບັດ, ເພື່ອຫຼຸດຜ່ອນຕໍາແຫນ່ງຂໍ້ຄວາມທີ່ຕັ້ງຢູ່
stack ໄດ້.
ໂດຍປົກກະຕິ, ຟັງຊັນນີ້ສະກັດຕໍາແຫນ່ງຂໍ້ຄວາມຈາກກົດລະບຽບດ້ານຂວາມື
ອົງປະກອບ ແລະຈະມອບໃຫ້ເຂົາເຈົ້າກັບໂຄງສ້າງ/ຕົ້ນໄມ້ $$ ຫຼື ຖ້າບໍ່ແມ່ນ
ມູນຄ່າ $$ ຖືກສົ່ງຄືນ, ເຮັດໃຫ້ພວກເຂົາເຂົ້າໄປໃນຕໍາແຫນ່ງຂໍ້ຄວາມ ret ບ່ອນທີ່ມັນຈະຢູ່
ໄດ້ຮັບໂດຍກົດລະບຽບອື່ນໆພາຍຫຼັງ. ຕົ້ນແບບຂອງມັນແມ່ນ:
void ຫຼຸດPosn(
YYPOSN& ການປະຕິເສດ,
YYPOSN* term_posns,
YYSTYPE* term_vals,
int term_no,
int stk_pos,
int yychar,
YYPOSN& yyposn,
ປະເພດຜູ້ໃຊ້ ພິເສດ);
ret ການອ້າງອີງເຖິງຕໍາແຫນ່ງຂໍ້ຄວາມທີ່ສົ່ງຄືນໂດຍກົດລະບຽບ. ທ່ານຕ້ອງຂຽນທັບ
ນີ້ກັບຕໍາແຫນ່ງຂໍ້ຄວາມທີ່ຄໍານວນທີ່ກົດລະບຽບໃຫ້ຜົນ, ປຽບທຽບກັບ
ຄ່າ semantic $$.
term_posns
Array ຂອງອົງປະກອບກົດລະບຽບດ້ານຂວາມື ' YYPOSN ຕໍາແຫນ່ງຂໍ້ຄວາມ,
ປຽບທຽບກັບ $1, $2, ..., $N ສໍາລັບຄ່າ semantic.
term_vals Array ຂອງອົງປະກອບກົດລະບຽບດ້ານຂວາມື ' YYSTYPE ຄຸນຄ່າ. ພວກນີ້ແມ່ນ
$1, ..., $N ດ້ວຍຕົນເອງ.
term_no ຈໍານວນຂອງອົງປະກອບໃນເບື້ອງຂວາຂອງກົດລະບຽບການຫຼຸດຜ່ອນ, ເຊັ່ນ: ໄດ້
ຂະໜາດຂອງ term_posns ແລະ term_vals arrays. ຍັງເທົ່າກັບ N ໃນ $1, ...,
$N.
stk_pos YYSTYPE/YYPOSN ຕໍາແຫນ່ງ stack ກ່ອນທີ່ຈະຫຼຸດລົງ.
yychar Lookahead token ທີ່ທັນທີປະຕິບັດຕາມດ້ານຂວາທີ່ຫຼຸດລົງ
ສ່ວນປະກອບ
yyposn YYPOSN ຂອງ token ທີ່ທັນທີປະຕິບັດຕາມດ້ານຂວາມືທີ່ຫຼຸດລົງ
ສ່ວນປະກອບ
argument ພິເສດທີ່ກໍານົດໂດຍຜູ້ໃຊ້ເພີ່ມເຕີມໄດ້ຖືກສົ່ງໄປຫາ ReducePosn.
YYREUCEPOSNFUNCARG
argument ພິເສດໄດ້ຜ່ານໄປຫາຟັງຊັນ ReducePosn. ການໂຕ້ຖຽງນີ້ສາມາດເປັນອັນໃດກໍໄດ້
ຕົວແປທີ່ກໍານົດໃນ btyacpa.ske.
token ການຈັດສັນ ໃນລະຫວ່າງການ ຄວາມຜິດພາດ ການຟື້ນຟູ
ສໍາລັບເຄື່ອງສ້າງຕົວວິເຄາະຄ້າຍຄື YACC ສ່ວນໃຫຍ່, ການປະຕິບັດຂອງຕົວແຍກວິເຄາະທີ່ສ້າງຂຶ້ນເມື່ອພົບ
parse error ແມ່ນການຖິ້ມຄ່າ semantic ແລະ input tokens ຈົນກ່ວາກົດລະບຽບທີ່ມີ.
ພິເສດທີ່ບໍ່ແມ່ນຢູ່ປາຍຍອດ ຄວາມຜິດພາດ ສາມາດຈັບຄູ່ໄດ້. ການຍົກເລີກ tokens ແມ່ນປະຕິບັດພຽງແຕ່ໂດຍ
ຂຽນທັບຕົວແປແລະລາຍການ array ຂອງປະເພດ YYSTYPE ກັບຄຸນຄ່າໃຫມ່.
ແຕ່ຫນ້າເສຍດາຍ, ວິທີການນີ້ເຮັດໃຫ້ຄວາມຊົງຈໍາຮົ່ວໄຫຼຖ້າ YYSTYPE ເປັນປະເພດຕົວຊີ້. btyac
ອະນຸຍາດໃຫ້ທ່ານເພື່ອສະຫນອງຫນ້າທີ່ສໍາລັບການທໍາຄວາມສະອາດເຖິງ semantic ແລະຄ່າຕໍາແຫນ່ງຂໍ້ຄວາມ, ໂດຍ
#ກໍານົດໂດຍມີສັນຍາລັກຕໍ່ໄປນີ້ຢູ່ໃນຄໍານໍາຂອງໄຟລ໌ໄວຍາກອນຂອງທ່ານ:
YYDELETEVAL
ສັນຍາລັກກ່ອນໂປຣເຊສເຊີສຳລັບຟັງຊັນທີ່ຈະເອີ້ນກ່ອນຄ່າ semantic ຂອງ token
ຫຼືເຄື່ອງທີ່ບໍ່ແມ່ນຢູ່ປາຍທາງຖືກຍົກເລີກ.
YYDELETEPOSN
ສັນຍາລັກຕົວປະມວນຜົນສໍາລັບຫນ້າທີ່ທີ່ຈະໂທຫາກ່ອນທີ່ຕໍາແຫນ່ງຂໍ້ຄວາມຂອງ token ໄດ້
ຫຼືເຄື່ອງທີ່ບໍ່ແມ່ນຢູ່ປາຍທາງຖືກຍົກເລີກ.
ທັງສອງຫນ້າທີ່ຖືກເອີ້ນວ່າມີການໂຕ້ຖຽງສອງຢ່າງ. ການໂຕ້ຖຽງທໍາອິດຂອງປະເພດ YYSTYPE or YYPOSN
ແມ່ນມູນຄ່າທີ່ຈະຖືກຍົກເລີກ. ການໂຕ້ຖຽງທີສອງແມ່ນປະເພດ int ແລະແມ່ນ ໜຶ່ງ ໃນນັ້ນ
ສາມຄຸນຄ່າ:
0 ການຍົກເລີກ token ການປ້ອນຂໍ້ມູນ
1 ລັດການຍົກເລີກໃນ stack
2 ເຮັດຄວາມສະອາດ stack ເມື່ອເອົາລູກອອກ
ລາຍະລະອຽດ syntax ຄວາມຜິດພາດ ການລາຍງານ
ຖ້າເຈົ້າ #ກໍານົດ ຕົວແປຂອງຕົວປະມວນຜົນກ່ອນ YYERROR_DETAILED ໃນໄຟລ໌ໄວຍາກອນຂອງທ່ານ, ທ່ານຕ້ອງ
ຍັງກໍານົດຫນ້າທີ່ການປະມວນຜົນຄວາມຜິດພາດຕໍ່ໄປນີ້:
void yyerror_detailed(
char* ຂໍ້ຄວາມ,
int ຜິດພາດ,
YYSTYPE&
errt_value,
YYPOSN& errt_posn);
ຂໍ້ຄວາມຜິດພາດຂໍ້ຄວາມ
ລະຫັດ errt ຂອງ token ທີ່ເຮັດໃຫ້ເກີດຄວາມຜິດພາດ
errt_value
ຄ່າຂອງ token ທີ່ເຮັດໃຫ້ເກີດຄວາມຜິດພາດ
errt_posn ຕໍາແຫນ່ງຂໍ້ຄວາມຂອງ token ທີ່ເຮັດໃຫ້ເກີດຄວາມຜິດພາດ
ໂປເຈັກເຕີ້ directives
btyacc ສະຫນັບສະຫນູນການກໍານົດສັນຍາລັກແລະປະຕິບັດໃຫ້ເຂົາເຈົ້າກັບຄໍາສັ່ງທີ່ມີເງື່ອນໄຂພາຍໃນ
ໄຟລ໌ໄວຍາກອນ, ບໍ່ແຕກຕ່າງຈາກ C preprocessor.
% ກໍານົດ NAME
ກໍານົດສັນຍາລັກ preprocessor NAME. ເທົ່າກັບການປ່ຽນເສັ້ນຄໍາສັ່ງ
-DNAME.
%ifdef NAME
ຖ້າຕົວປະມວນຜົນ preprocessor ມີການປ່ຽນແປງ NAME ຖືກກໍານົດ, ປະມວນຜົນຂໍ້ຄວາມຈາກນີ້ %ifdef to
ປິດ %endifຖ້າບໍ່ດັ່ງນັ້ນໃຫ້ຂ້າມມັນໄປ.
%endif ຄຳສັ່ງປິດສຳລັບ %ifdef. %ifdefs ບໍ່ສາມາດຖືກຮັງໄດ້.
% ລວມມີ ຊື່ເອກະສານ
ເນື້ອໃນຂະບວນການຂອງໄຟລ໌ທີ່ມີຊື່ ຊື່ເອກະສານ. ພຽງແຕ່ຫນຶ່ງລະດັບການຮັງຂອງ % ລວມມີ
ຖືກອະນຸຍາດ.
%ident ຄັກ
ໃສ່ `#ລະບຸຕົວຕົນ ຄັກ' ຄໍາສັ່ງເຂົ້າໄປໃນໄຟລ໌ຜົນຜະລິດ. ຄັກ ຕ້ອງເປັນ
string ຄົງທີ່ enclosed ໃນ "".
ມູນມໍລະດົກ attributes
ຄຸນສົມບັດທີ່ສືບທອດແມ່ນບໍ່ມີເອກະສານ. (ເບິ່ງ README ແລະລະຫັດແຫຼ່ງ btyacc ສໍາລັບ a
ຂໍ້ ມູນ ພຽງ ເລັກ ນ້ອຍ[email protected]>!
ແມງໄມ້
ຄວາມຊັບຊ້ອນກໍລະນີຮ້າຍແຮງທີ່ສຸດຂອງການແຍກວິເຄາະແມ່ນເລກກຳລັງສຳລັບໄວຍະກອນທີ່ອະນຸຍາດໃຫ້
backtracking ທີ່ຈະເກີດຂຶ້ນ. ໃນຄໍາສັບຕ່າງໆອື່ນໆ, parser ທີ່ສ້າງໂດຍ btyacc ປະກອບເປັນ a
bug ປະຕິເສດການບໍລິການຖ້າຖືກນໍາໃຊ້ໃນແອັບພລິເຄຊັນທີ່ຜູ້ໂຈມຕີສາມາດສະຫນອງໄດ້
ຂໍ້ມູນທີ່ຖືກສ້າງເປັນພິເສດເປັນການປ້ອນຂໍ້ມູນເຂົ້າໄປໃນຕົວວິໄຈ. (ສໍາລັບຂໍ້ມູນການປ້ອນຂໍ້ມູນ "ປົກກະຕິ" ທັງໝົດ, the
ຄວາມສັບສົນທີ່ອາດຈະເປັນຕົວເລກບໍ່ແມ່ນປົກກະຕິເປັນບັນຫາ.)
ຂອງ bison ຄາດຫວັງ ບໍ່ຮອງຮັບຄຳແນະນຳ.
ບໍ່ມີ % ອື່ນໆ ແລະ %ifndef. %ifdefs and % ລວມມີs ບໍ່ສາມາດຖືກຮັງໄດ້.
ຜູ້ຂຽນ
Robert Corbett[email protected]> /[email protected]> ແມ່ນຫນຶ່ງໃນ
ຜູ້ຂຽນຕົ້ນສະບັບຂອງ Berkeley byacc. Chris Dodd[email protected]> ມີ brilliant
ແນວຄວາມຄິດຂອງການເພີ່ມຄວາມສາມາດ backtracking, ແລະຮັບຜິດຊອບສໍາລັບການ backtracking ເບື້ອງຕົ້ນ
ການປ່ຽນແປງ. Vadim Maslov[email protected]> ປັບປຸງລະຫັດຕື່ມອີກ.
ເອກະສານນີ້ຂຽນໂດຍ Richard Atterer[email protected]> ສໍາລັບ Debian
ການແຈກຢາຍ GNU/Linux, ແຕ່ຖືກບໍລິຈາກໃຫ້ສາທາລະນະແລະດັ່ງນັ້ນຈຶ່ງອາດຈະຖືກນໍາໃຊ້ຢ່າງເສລີ
ເພື່ອຈຸດປະສົງໃດກໍ່ຕາມ.
ໄຟ
/usr/doc/btyacc/examples/btyaccpa.ske
/usr/doc/btyacc/examples/btyacc-c.ske
/usr/doc/btyacc/README
ເບິ່ງ ຍັງ
bison(1) (ຫຼື 'info bison'), byacc(1), yacc(1), antlr(1)
btyac(1)
ໃຊ້ btyacc ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net
