ນີ້ແມ່ນຄໍາສັ່ງ pretzel ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
pretzel - ເຄື່ອງພິມ pretty ທົ່ວໄປ
ສະຫຼຸບສັງລວມ
pretzel [-qtgdh] [-o outfile] fileprefix
pretzel [-qtgdh] [-o outfile] file1 file2
ລາຍລະອຽດ
Pretzel ແມ່ນໂຄງການທີ່ສ້າງໂມດູນເຄື່ອງພິມ pretty ຈາກຄໍາອະທິບາຍຢ່າງເປັນທາງການຂອງ
ວິທີການພາສາທີ່ແນ່ນອນຄວນຈະຖືກພິມອອກຢ່າງສວຍງາມ. ກ ເຄື່ອງພິມງາມ ແມ່ນຫນ້າທີ່ຫຼື
ໂຄງການທີ່ຈັດການລະຫັດແຫຼ່ງທີ່ຈະປັບປຸງການອ່ານຂອງຕົນ. ເຄື່ອງພິມງາມທີ່ສ້າງຂຶ້ນ
ໂດຍ pretzel output LaTeX source code ທີ່ສາມາດໃຊ້ພາຍໃນເອກະສານຂອງທ່ານເອງ. NB ນັ້ນ
pretzel ຜະລິດ ໂມດູນ, ບໍ່ແມ່ນໂຄງການ!
ທ່ານຕ້ອງໄດ້ສະຫນອງສອງໄຟລ໌ປ້ອນຂໍ້ມູນເພື່ອ pretzel ທີ່ລະບຸວິທີການໃຫ້ລະຫັດແຫຼ່ງຂໍ້ມູນ
ຄວນຈະໄດ້ຮັບການພິມ pretty. ສອງໄຟລ໌ນີ້ເອີ້ນວ່າ ຈັດຮູບແບບ token ເອກະສານ (ຄຳຕໍ່ທ້າຍ .ft)
ແລະ ຈັດຮູບແບບ grammar ເອກະສານ (ຄຳຕໍ່ທ້າຍ .fg).
ຈາກການປ້ອນຂໍ້ມູນນີ້, pretzel ສ້າງສອງຢ່າງ: ທີ່ຖືກຕ້ອງ flex(1) ໄຟລ໌ທີ່ປະກອບເປັນ
ການພິມງາມ scanner ແລະຖືກຕ້ອງ bison(1) ໄຟລ໌ປ້ອນຂໍ້ມູນທີ່ສາມາດຖືກນໍາໃຊ້ເພື່ອສ້າງ
ການພິມງາມ ແມ່ບົດ (ເຊິ່ງເປັນເຄື່ອງພິມທີ່ສວຍງາມແທ້ໆ). ມີ script ແກະ
pretzel-ມັນ ທີ່ອໍານວຍຄວາມສະດວກໃນການນໍາໃຊ້ pretzel (ເບິ່ງ pretzel-ມັນ(1)). ຫນ້າຜູ້ຊາຍນີ້ແມ່ນພຽງແຕ່ຫມາຍຄວາມວ່າ
ເປັນການອ້າງອິງໄວຕໍ່ກັບການໃຊ້ pretzel. ເບິ່ງເຂົ້າໄປໃນເອກະສານຕົ້ນຕໍຂອງ pretzel ຖ້າທ່ານ
ແມ່ນໃຫມ່ສໍາລັບທັງຫມົດນີ້.
ການຂໍ ວ່ອງໄວ
ການເອີ້ນ pretzel ສາມາດມີສອງຮູບແບບ: ອາດຈະເອີ້ນມັນໂດຍລະບຸພຽງແຕ່ຄໍານໍາຫນ້າທົ່ວໄປຂອງ.
ສອງໄຟລ໌ປ້ອນຂໍ້ມູນ, ຫຼືລະບຸໄຟລ໌ທັງສອງແຍກກັນຢູ່ໃນເສັ້ນຄໍາສັ່ງ. ຖ້າທ່ານລະບຸ
ທັງສອງໄຟລ໌, ໄຟລ໌ token ທີ່ມີຮູບແບບແມ່ນມາກ່ອນ.
ຕົວຢ່າງ
ເວົ້າວ່າໄຟລ໌ປ້ອນຂໍ້ມູນຂອງທ່ານຖືກເອີ້ນ foo.ft ແລະ foo.fg. ແລ້ວເຈົ້າສາມາດເວົ້າໄດ້
ວ່ອງໄວ ຟູ
ເພື່ອເອີ້ນ pretzel ຢ່າງຖືກຕ້ອງ. ຖ້າໄຟລ໌ຂອງທ່ານຖືກເອີ້ນ foo.ft ແລະ bar.fg ຫຼັງ ຈາກ ນັ້ນ ທ່ານ ຈະ ມີ
ເວົ້າ
ວ່ອງໄວ foo.ft bar.fg
ເພື່ອເຮັດວຽກ.
OPTIONS
Pretzel ຮັບຮູ້ທາງເລືອກຕໍ່ໄປນີ້:
-q ແລ່ນຢ່າງງຽບໆ.
-t ປະມວນຜົນໄຟລ໌ token ໃນຮູບແບບເທົ່ານັ້ນ.
-g ຂະບວນການຟໍແມັດໄຟລ໌ໄວຍະກອນເທົ່ານັ້ນ (ຕົວເລືອກ -t ແລະ -g ແມ່ນເຊິ່ງກັນແລະກັນ
ສະເພາະ).
-d ພິມຂໍ້ມູນດີບັກໃສ່ໜ້າຈໍ.
-h ພິມຂໍ້ຄວາມການນໍາໃຊ້ຢ່າງເຕັມທີ່.
-o ຊື່
ການນໍາໃຊ້ ຊື່ ເປັນຄໍານໍາຫນ້າຂອງໄຟລ໌ຜົນຜະລິດທີ່ສ້າງຂຶ້ນ.
ການ ປັດໄຈນໍາເຂົ້າ ເອກະສານ
ພາກນີ້ສະຫຼຸບຮູບແບບຂອງໄຟລ໌ປ້ອນຂໍ້ມູນແລະ ຮູບແບບ ຄໍາສັ່ງ ພື້ນຖານ
ທີ່ pretzel ສະຫນັບສະຫນູນ.
ໄດ້ ຈັດຮູບແບບ token ເອກະສານ
ໄຟລ໌ token ທີ່ມີຮູບແບບມີບັນຊີລາຍຊື່ຂອງຄໍານິຍາມ token ທີ່ສອດຄ້ອງກັນ
ຮູບແບບ "prettyprinted". ຮູບແບບການພິມທີ່ສວຍງາມຂອງ token ຈະຖືກເອີ້ນວ່າ an ຄຸນລັກສະນະ ຫຼື
translation.
ໂຄງຮ່າງທົ່ວໄປຂອງໄຟລ໌ token ທີ່ມີຮູບແບບແມ່ນ
ການປະກາດ
%%
token ຄໍານິຍາມ
ຕາມປົກກະຕິ, ໄດ້ ການປະກາດ ສ່ວນແມ່ນຫວ່າງເປົ່າ. ທ່ານສາມາດໃສ່ຄໍາອະທິບາຍທົ່ວໄປຂອງໄຟລ໌
ທີ່ນີ້ (ເປັນຄໍາຄິດເຫັນ C) ແລະຄໍານິຍາມໃຫມ່ຂອງການໂຕ້ຕອບເລີ່ມຕົ້ນໄປທີ່ນີ້ເຊັ່ນດຽວກັນ.
ໄດ້ token ຄໍານິຍາມ ພາກສ່ວນຂອງໄຟລ໌ token ທີ່ມີຮູບແບບປະກອບມີຊຸດຂອງ token
ຄໍານິຍາມຂອງແບບຟອມ:
ຮູບແບບ token ຄຸນລັກສະນະ
ໄດ້ ຮູບແບບ ຕ້ອງເປັນການສະແດງຜົນປົກກະຕິທີ່ຖືກຕ້ອງ (ໃນແງ່ຂອງ flex(1)) ແລະຕ້ອງເປັນ
ບໍ່ໄດ້ຫຍໍ້ໜ້າ. ໄດ້ token ລະບຸຊື່ສັນຍາລັກຂອງ token ສໍາລັບຮູບແບບແລະເລີ່ມຕົ້ນ
ຢູ່ທີ່ຕົວອັກສອນທີ່ບໍ່ແມ່ນຊ່ອງຂາວທຳອິດຫຼັງຈາກຮູບແບບ. ຊື່ໂທເຄັນຕ້ອງເປັນກົດໝາຍ
ຊື່ສໍາລັບຕົວລະບຸໃນ notation Pascal ແລະ ຕ້ອງ be ທັງຫມົດ in ເທິງ ກໍລະນີ. (ຂີດກ້ອງແມ່ນ
ອະນຸຍາດໃຫ້ແຕ່ບໍ່ແມ່ນໃນຕອນຕົ້ນຂອງຄໍາສັບໃດຫນຶ່ງ.)
ໄດ້ ຄຸນລັກສະນະ ສໍາລັບ token ນີ້, ນັ້ນແມ່ນຮູບແບບທີ່ພິມອອກທີ່ສວຍງາມ, ປະກອບດ້ວຍຂໍ້ຄວາມທັງຫມົດ
ລະຫວ່າງສອງວົງເລັບ curling { ແລະ }. ຄຸນລັກສະນະສາມາດເປັນສະຕຣິງງ່າຍໆ
(ອ້ອມຮອບດ້ວຍວົງຢືມຄູ່), ຄໍາສັ່ງຮູບແບບ (ເບິ່ງຂ້າງລຸ່ມນີ້), ລະຫັດ C++ ຂອງທ່ານເອງ (ຕິດຢູ່ໃນ
ວົງເລັບມຸມ [ ແລະ ], ເບິ່ງຂ້າງລຸ່ມນີ້) ຫຼືການປະສົມປະສານຂອງທັງສອງທີ່ເຂົ້າຮ່ວມກັນໂດຍ an
ທາງເລືອກ + ເຊັນ. ຄໍານິຍາມຄຸນລັກສະນະສາມາດກວມເອົາຫຼາຍເສັ້ນແລະການເລີ່ມຕົ້ນ { ບໍ່ຈໍາເປັນຕ້ອງ
ຢືນຢູ່ໃນເສັ້ນດຽວກັນກັບຄໍານິຍາມ token; ແນວໃດກໍ່ຕາມ ແຖວຕໍ່ໄປຈະຕ້ອງຖືກຫຍໍ້ໜ້າ
ຢ່າງໜ້ອຍໜຶ່ງແຖບຫວ່າງເປົ່າ ຫຼືໜຶ່ງແຖບ.
ຖ້າທ່ານກໍານົດສະຕຣິງເປັນສ່ວນຫນຶ່ງຂອງຄໍານິຍາມຄຸນລັກສະນະ, ທ່ານຕ້ອງລະບຸພວກມັນຢູ່ໃນ C
ປະເພດຂອງຄົນອັບເດດ:, ie ທ່ານສາມາດໃສ່ເສັ້ນໃຫມ່ແລະແຖບທີ່ມີ \n ແລະ \t. ແຕ່ຖ້າທ່ານຕ້ອງການ
ໃສ່ backslash ເຂົ້າໄປໃນ string, ທ່ານຕ້ອງບໍ່ລືມໃສ່ backslash ສອງອັນ \\ ເຂົ້າໄປໃນ
ໄຟລ໌ປ້ອນຂໍ້ມູນ. ນີ້ແມ່ນຫນ້າສັງເກດໂດຍສະເພາະຖ້າທ່ານໃຊ້ TeX ເປັນເຄື່ອງພິມຕົວພິມ.
ຖ້າຄໍານິຍາມຂອງຄຸນລັກສະນະຖືກລະເວັ້ນ pretzel ສ້າງຄຸນລັກສະນະສໍາລັບການນີ້
ຮູບແບບຕາມຄ່າເລີ່ມຕົ້ນ. ຄຸນລັກສະນະເລີ່ມຕົ້ນປະກອບດ້ວຍສະຕຣິງທີ່ມີຂໍ້ຄວາມ
ຈັບຄູ່ໂດຍຮູບແບບທີ່ສອດຄ້ອງກັນ.
ຜູ້ໃຊ້ເອງອາດຈະອ້າງເຖິງຂໍ້ຄວາມທີ່ກົງກັນໂດຍໃຊ້ລໍາດັບ **ທີ່ຢູ່ ດັ່ງນັ້ນ
"ຟູ" BAR
"ຟູ" BAR { ** }
"ຟູ" BAR { "ຟູ" }
ທັງຫມົດມີຄວາມຫມາຍດຽວກັນ.
ທ່ານສາມາດນໍາໃຊ້ໄດ້ | ເຊັນຊື່ເປັນ token; ນີ້ເປັນສັນຍານວ່າການສະແດງອອກປົກກະຕິໃນປະຈຸບັນມີ
ຊື່ token ດຽວກັນ (ແລະຄຸນລັກສະນະດຽວກັນ) ເປັນ token ທີ່ລະບຸໄວ້ໃນຕໍ່ໄປນີ້
ເສັ້ນ (ເສັ້ນຫວ່າງຖືກລະເລີຍ). ຄໍານິຍາມຄຸນສົມບັດທີ່ຢູ່ເບື້ອງຫຼັງ a | ຜິດກົດໝາຍ. ແນວໃດກໍ່ຕາມ
ເຈົ້າອາດຈະລະບຸການສະແດງອອກປົກກະຕິໂດຍບໍ່ມີຊື່ token ຫຼືຄຸນລັກສະນະທີ່ຈະໃຫ້ a
ກົດລະບຽບເລີ່ມຕົ້ນຫຼືກິນພື້ນທີ່ຫວ່າງ.
ຄຳປະກາດ ແລະຄຳນິຍາມໂທເຄັນຕ້ອງຖືກແຍກອອກໂດຍແຖວທີ່ບັນຈຸສະເພາະ
ສອງຕົວອັກສອນ %%.
ຕົວຢ່າງ
ຕົວຢ່າງຕໍ່ໄປນີ້ແມ່ນຄໍານິຍາມ token ທາງດ້ານກົດໝາຍທັງໝົດ:
[0-9] ດີຈີດີ
"{" ເປິດ { "\\{" ຫຍໍ້ ໜ້າ ຜົນບັງຄັບໃຊ້ }
[az][a-z0-9]* ID { "{\\ມັນ " ** "}" }
"ຫນ້າທີ່" |
"ຂັ້ນຕອນ" PROC_INTRO { big_force + ** }
[\t\ \n] |
.
ໄດ້ ຈັດຮູບແບບ grammar ເອກະສານ
ໃນໄຟລ໌ໄວຍາກອນທີ່ມີຮູບແບບຜູ້ໃຊ້ເຂົ້າລະຫັດໄວຍະກອນການພິມທີ່ສວຍງາມທົ່ວໄປສໍາລັບ
ພາສາການຂຽນໂປຼແກຼມ. ອັນນີ້ແມ່ນເຮັດໄດ້ໂດຍການລະບຸໄວຍະກອນທີ່ບໍ່ມີເນື້ອໃນຂອງພາສາ
ແລະໂດຍການເພີ່ມຂໍ້ມູນກ່ຽວກັບການສ້າງຄຸນລັກສະນະໃຫມ່ໃນທຸກໆກົດລະບຽບ. ທົ່ວໄປຂອງມັນ
ໂຄງຮ່າງເບິ່ງຄືດັ່ງນີ້:
token ການປະກາດ
%%
grammar ກົດລະບຽບ
ໄດ້ token ການປະກາດ ພາກສ່ວນອາດຈະຫວ່າງເປົ່າ ແລະຕົວແຍກລະຫວ່າງສອງພາກສ່ວນຂອງ
ເອກະສານ %% ຕ້ອງປະກົດວ່າບໍ່ມີການຫຍໍ້ໜ້າຢູ່ໃນແຖວດຽວດ້ວຍຕົວມັນເອງ.
ໄດ້ grammar ກົດລະບຽບ ພາກສ່ວນປະກອບດ້ວຍການເກັບກໍາຂໍ້ກໍານົດຂອງໄວຍະກອນບໍ່ເສຍຄ່າຂອງເນື້ອໃນ
ທີ່ສາມາດມາພ້ອມກັບຄໍານິຍາມຄຸນລັກສະນະ. ກົດລະບຽບແມ່ນໄດ້ລະບຸໄວ້ໂດຍການ
token ຜົນໄດ້ຮັບ, ຈໍ້າສອງເມັດແລະຫຼັງຈາກນັ້ນຊຸດຂອງ tokens ທີ່ຈະຖືກຫຼຸດລົງໂດຍກົດລະບຽບນີ້.
ກົດລະບຽບແມ່ນສິ້ນສຸດລົງໂດຍ semicolon. ຕົວຢ່າງຂອງຕັນໃນ Pascal ອາດຈະເບິ່ງຄືວ່າ
ນີ້:
block : ເລີ່ມຕົ້ນ stmt_list END ;
ປະຕິບັດຕາມລາຍການ token ຢູ່ເບື້ອງຂວາຂອງຈໍ້າສອງເມັດສາມາດເປັນຄໍານິຍາມຄຸນລັກສະນະ;
ຄໍານິຍາມນີ້ລະບຸ, ວິທີການແປຂອງສັນຍາລັກທີ່ຜະລິດແມ່ນໄດ້ມາຈາກ
tokens ຢູ່ເບື້ອງຂວາຂອງກົດລະບຽບ.
ຄໍານິຍາມຄຸນລັກສະນະຖືກວົງເລັບລະຫວ່າງວົງເລັບ curling { ແລະ } ແລະອີກເທື່ອຫນຶ່ງສາມາດປະກອບດ້ວຍ
ຂອງສະຕຣິງ (ໃນວົງຢືມຄູ່), ຄໍາສັ່ງຮູບແບບຫຼືລະຫັດ C (ປິດຢູ່ໃນວົງເລັບມຸມ [
ແລະ ], ເບິ່ງຂ້າງລຸ່ມນີ້) ເຂົ້າຮ່ວມຮ່ວມກັນໂດຍທາງເລືອກ +. ແຕ່ໃນທີ່ນີ້ທ່ານຍັງສາມາດອ້າງອີງເຖິງ
ຄຸນລັກສະນະຂອງ tokens ຢູ່ເບື້ອງຂວາຂອງກົດລະບຽບ. ນີ້ແມ່ນເຮັດຢູ່ໃນງຸ່ມງ່າມເລັກນ້ອຍ
ຫມາຍເຫດທີ່ມີຕົວເລກທີ່ນໍາຫນ້າດ້ວຍ a $ ເງິນໂດລາ. ຕົວເລກຫມາຍເຖິງ
ຄໍາສັ່ງຂອງຮູບລັກສະນະຂອງສັນຍາລັກຢູ່ເບື້ອງຂວາຂອງກົດລະບຽບ. ດັ່ງນັ້ນ $1 ຫມາຍເຖິງ
token ທໍາອິດຂອງລະບຽບການ, $2 ໄປຫາທີສອງ, ແລະອື່ນໆ.
ອີກເທື່ອ ໜຶ່ງ ຄຳ ນິຍາມຄຸນລັກສະນະແມ່ນອະນຸຍາດໃຫ້ຂະຫຍາຍຫຼາຍເສັ້ນແລະສາຍຕ້ອງເປັນ
ລະບຸໄວ້ໃນລັກສະນະ C.
ນິຍາມຄຸນສົມບັດອາດຈະຖືກລະເວັ້ນ. ຖ້າເປັນດັ່ງນັ້ນ, pretzel ຈະປະກອບເປັນຄ່າເລີ່ມຕົ້ນ
ຄຸນລັກສະນະຂອງສັນຍາລັກທີ່ຜະລິດໄດ້ຈາກ concatenation ງ່າຍດາຍຂອງຄຸນລັກສະນະກ່ຽວກັບການ
ເບື້ອງຂວາຂອງກົດລະບຽບ. ແນ່ນອນ, ທ່ານອາດຈະມີດ້ານຂວາທີ່ຫວ່າງເປົ່າຂອງກົດລະບຽບ (ເຖິງ
ຜະລິດສິ່ງທີ່ອອກຈາກບໍ່ມີຫຍັງ) ຫຼືພຽງແຕ່ concatenate ສອງຫຼືຫຼາຍກວ່າກົດລະບຽບຜົນໃນ
ສັນຍາລັກດຽວກັນກັບ a |.
ສໍາລັບທຸກໆ token terminal ທີ່ປາກົດຢູ່ໃນກົດລະບຽບໄວຍາກອນ, ເສັ້ນພິເສດຕ້ອງມີ
ຂຽນເຂົ້າໄປໃນພາກສ່ວນການປະກາດຂອງໄຟລ໌. ຄໍານິຍາມເຫຼົ່ານີ້ແມ່ນມີຮູບແບບ
%ໂທເຄັນ ຊື່ເຄື່ອງໝາຍ
ມັນເປັນສິ່ງສໍາຄັນທີ່ສຸດທີ່ຈະບໍ່ລືມເລື່ອງນີ້.
ຕົວຢ່າງ
ຕົວຢ່າງ, ອີກເທື່ອຫນຶ່ງນີ້ແມ່ນຄໍານິຍາມທີ່ເປັນໄປໄດ້ຂອງ block ໃນ Pascal, ໃນປັດຈຸບັນກັບ
ຄໍານິຍາມຄຸນລັກສະນະຕົວຢ່າງ:
block : ເລີ່ມຕົ້ນ stmt_list END { $1 $2 ຜົນບັງຄັບໃຊ້ $3 } ;
ຄຸນລັກສະນະຂອງ ກ block ດັ່ງນັ້ນຈຶ່ງຈະປະກອບດ້ວຍຄຸນລັກສະນະຂອງ ເລີ່ມຕົ້ນ ແລະ
stmt_list tokens, ເຂົ້າຮ່ວມຮ່ວມກັນກັບ a ຜົນບັງຄັບໃຊ້ ຄໍາສັ່ງແລະການແປພາສາຂອງ END
ເຄື່ອງ ໝາຍ.
ສອງເສັ້ນນີ້ມີຄວາມໝາຍຄືກັນ:
stmt : block SEMI ;
stmt : block SEMI { $1 $2 } ;
ເຫຼົ່ານີ້ແມ່ນກົດລະບຽບທາງດ້ານກົດຫມາຍເຊັ່ນດຽວກັນ:
stmt_list : { ຜົນບັງຄັບໃຊ້ }
| stmt_list stmt SEMI { $1 $2 $3 ຜົນບັງຄັບໃຊ້ };
ຄວາມຄິດເຫັນ ແລະ ລະຫັດ
ມີວິທີທີ່ງ່າຍດາຍຫຼາຍຂອງການໃສ່ຄໍາຄິດເຫັນເຂົ້າໄປໃນ token ຮູບແບບແລະຮູບແບບ
ໄຟລ໌ໄວຍາກອນ. ນີ້ແມ່ນເຮັດໃນລັກສະນະ C ++ ໂດຍການນໍາຫນ້າຄໍາເຫັນດ້ວຍສອງເທົ່າ
slash //. ຕົວອັກສອນທັງໝົດລະຫວ່າງເຄື່ອງໝາຍນີ້ ແລະທ້າຍແຖວແມ່ນຖືກລະເລີຍໂດຍ
ເຜັດ.
ໃນທັງສອງໄຟລ໌ທ່ານສາມາດໃສ່ລະຫັດ C / C ++ ເພີ່ມເຕີມກ່ອນແລະຫຼັງຈາກຄໍານິຍາມ / ໄວຍະກອນ
ພາກສ່ວນ. ຖ້າທ່ານຕ້ອງການໃສ່ລະຫັດຢູ່ໃນຕອນທ້າຍຂອງໄຟລ໌ຂອງທ່ານ, ທ່ານຕ້ອງໃສ່ວິນາທີ %%
ຢູ່ໃນເສັ້ນດ້ວຍຕົວມັນເອງແລະວາງລະຫັດໄວ້ທາງຫລັງຂອງມັນ. ລະຫັດ C/C++ ກ່ອນກຳນົດ/ກົດລະບຽບ
ພາກສ່ວນຕ້ອງໄດ້ຮັບການຜູກມັດກັບ a %{, %} ຄູ່. ການໃສ່ລະຫັດພິເສດແມ່ນຫນ້າສົນໃຈສໍາລັບ
ຜູ້ທີ່ຕ້ອງການເຂົ້າເຖິງມັນຈາກພາຍໃນຄໍານິຍາມຄຸນລັກສະນະ.
ລະຫັດ ພາຍໃນ ຄຸນລັກສະນະ ຄໍານິຍາມ
ຈາກເວີຊັນ 2.0 ເປັນຕົ້ນໄປ pretzel ອະນຸຍາດໃຫ້ໃສ່ລະຫັດ C++ ເຂົ້າໃນຄຳນິຍາມຄຸນລັກສະນະ.
ນີ້ແມ່ນວິທີທີ່ pretzel ຄາດຫວັງໃຫ້ທ່ານຂຽນລະຫັດພາຍໃນໄຟລ໌ປ້ອນ pretzel ຂອງທ່ານ:
ຊິ້ນສ່ວນລະຫັດຖືກຍຶດຢູ່ໃນວົງເລັບມຸມ. ວົງເລັບມຸມໃດທີ່ປາກົດ
ພາຍໃນລະຫັດ C ຕ້ອງຖືກຫລົບຫນີດ້ວຍ backslash. ມີສາມາດຕັນຂອງລະຫັດກ່ອນແລະ
ທີ່ຢູ່ເບື້ອງຫຼັງການກໍານົດຄຸນລັກສະນະທີ່ຖືກເອີ້ນວ່າ ເລີ່ມຕົ້ນ ລະຫັດ ແລະ ສິ້ນສຸດລະຫັດ. ດຽວເທົ່ານັ້ນ
ການເລີ່ມຕົ້ນຫຼືສິ້ນສຸດການບລັອກລະຫັດແມ່ນອະນຸຍາດໃຫ້. ທັງສອງແມ່ນທາງເລືອກທັງຫມົດ, ແຕ່ຖ້າຫາກວ່າທ່ານຕ້ອງການ
ລະບຸຫຼື, ທ່ານຕ້ອງການຄໍານິຍາມຄຸນລັກສະນະ. ລະຫັດເລີ່ມຕົ້ນຖືກປະຕິບັດກ່ອນ
attribute ຂອງ token ໃຫມ່ແມ່ນຖືກສ້າງຂຶ້ນ, ລະຫັດສິ້ນສຸດຈະຖືກປະຕິບັດຫຼັງຈາກການສ້າງຄຸນລັກສະນະ
ແລະກ່ອນທີ່ຈະກັບຄືນໄປຫາຟັງຊັນການໂທ (ໃນເຄື່ອງສະແກນ).
ພາກສ່ວນລະຫັດພາຍໃນຄໍານິຍາມຄຸນລັກສະນະຈະຕ້ອງສົ່ງຄືນຕົວຊີ້ໄປຫາ an ຄຸນລັກສະນະ ຫ້ອງຮຽນ
(ເບິ່ງໄຟລ໌ attr/attr.nw ໃນການແຈກຢາຍ pretzel ສໍາລັບລາຍລະອຽດ). ພາຍໃນຮູບແບບ
ໄຟລ໌ token, ຂໍ້ຄວາມທີ່ກົງກັນແມ່ນເຫັນໄດ້ໃຫ້ທ່ານເຫັນໃນຮູບແບບຂອງ a char* yytext ຕົວແປ. ໄດ້
ຊື່ສັນຍາລັກຂອງ tokens ແມ່ນມີຢູ່ໃນຊື່ດຽວກັນທີ່ pretzel ໃຫ້ພວກເຂົາ.
ລະຫັດເລີ່ມຕົ້ນ, ລະຫັດພາຍໃນນິຍາມຄຸນສົມບັດ ແລະລະຫັດສິ້ນສຸດແມ່ນທາງເລືອກທັງໝົດ. ແຕ່
ຢູ່ບ່ອນໃດບ່ອນໜຶ່ງທີ່ເຂົາເຈົ້າໄດ້ຮັບອະນຸຍາດ, ອາດຈະຖືກວາງລະຫັດທີ່ມີວົງເລັບອັນດຽວເທົ່ານັ້ນ. ນີ້ແມ່ນ
ຕົວຢ່າງຈາກໄຟລ໌ໄວຍາກອນທີ່ມີຮູບແບບ:
id : ID { [ຊອກຫາ($1) ? ສ້າງ("{\\bf ") :
ສ້າງ("{\\it ")] $1 "}" };
ຕົວຢ່າງນີ້ສະແດງວິທີການຈັດຮູບແບບຕົວລະບຸຂຶ້ນກັບວ່າຢູ່ໃນການຊອກຫາຫຼືບໍ່
ຕາຕະລາງຫຼືບໍ່. ຕົວລະບຸສາມາດຖືກຕິດຕັ້ງຢູ່ໃນຕາຕະລາງຕົວຢ່າງເຊັ່ນນີ້:
ພິມປະເພດ : TYPEDEF_LIKE INT_LIKE ID
[ ຕິດຕັ້ງ($3); ]
{ $1 $2 "{\\bf " $3 "}" };
ຕົວຢ່າງເພີ່ມເຕີມສາມາດພົບໄດ້ໃນ Pretzelbook. ປົກກະຕິທົ່ວໄປເພື່ອຫນີຕົວລະບຸ, to
ສ້າງ ແລະຈັດການຕາຕະລາງຊອກຫາ, ເພື່ອປ່ຽນເປັນ ແລະຈາກ ຄຸນລັກສະນະ* ຫຼືເພື່ອອອກ debug
ຂໍ້ມູນສາມາດພົບເຫັນຢູ່ໃນໄຟລ໌ທີ່ເປັນຂອງ C prettyprinter ໃນໄດເລກະທໍລີ
ພາສາ/ຊີ ຂອງການແຈກຢາຍ pretzel.
ໄດ້ ທີ່ກໍານົດໄວ້ of ຮູບແບບ ຄໍາສັ່ງ
ນີ້ແມ່ນບັນຊີລາຍຊື່ຂອງຄໍາສັ່ງຮູບແບບທີ່ສະຫນັບສະຫນູນໂດຍ pretzel ແລະຄວາມຫມາຍຂອງພວກມັນ:
null ຄໍາສັ່ງຫວ່າງເປົ່າ.
ຫຍໍ້ ໜ້າ ຫຍໍ້ໜ້າແຖວຕໍ່ໄປອີກໜ້ອຍໜຶ່ງ.
ອອກນອກ
ເອົາການຫຍໍ້ໜ້າສຸດທ້າຍຄືນ (de-indent).
ຜົນບັງຄັບໃຊ້ ບັງຄັບໃຫ້ຢຸດແຖວ.
break_space
ຫມາຍເຖິງພື້ນທີ່ທີ່ເປັນໄປໄດ້ສໍາລັບການຢຸດແຖວ.
ເລືອກ 1...ເລືອກ 9
ຫມາຍເຖິງການແບ່ງແຖວທາງເລືອກທີ່ມີເສັ້ນຕໍ່ເນື່ອງ indented a litte ກັບ
ເຄົາລົບກັບຕໍາແຫນ່ງເລີ່ມຕົ້ນປົກກະຕິ.
ສໍາຮອງຂໍ້ມູນ ຫມາຍເຖິງ backspace ຂະຫນາດນ້ອຍ.
big_force
ບັງຄັບໃຫ້ຕັດແຖວ ແລະ ໃສ່ພື້ນທີ່ເພີ່ມເຕີມເລັກນ້ອຍ.
no_indent
ເຮັດໃຫ້ເສັ້ນປະຈຸບັນເປັນ output flushleft.
ຍົກເລີກການ ລົບລ້າງໃດໆ break_space, ເລືອກ, ຜົນບັງຄັບໃຊ້ or big_force ສັ່ງໃຫ້ທັນທີ
ລ່ວງໜ້າ ຫຼືຕິດຕາມມັນ ແລະຍັງຍົກເລີກອັນໃດນຶ່ງ ສໍາຮອງຂໍ້ມູນ ຄໍາສັ່ງທີ່ປະຕິບັດຕາມມັນ.
ສໍາລັບການອ້າງອິງຄົບຖ້ວນສົມບູນກ່ຽວກັບວິທີການຂຽນ pretzel input, ເບິ່ງເຂົ້າໄປໃນ Pretzelbook
ເຊິ່ງລວມຢູ່ໃນການແຈກຢາຍ pretzel.
ຮູບແບບ ຄໍາສັ່ງ ການປຸງແຕ່ງກ່ອນ
ຄໍາສັ່ງຮູບແບບແມ່ນ preprocessed ຕາມສອງກົດລະບຽບດັ່ງຕໍ່ໄປນີ້:
1. ລໍາດັບຂອງລໍາດັບ
break_space, ຜົນບັງຄັບໃຊ້, ແລະ / ຫຼື big_force ຄໍາສັ່ງຖືກແທນທີ່ດ້ວຍຄໍາສັ່ງດຽວ (the
ສູງສຸດຂອງອັນທີ່ໃຫ້).
2. ໄດ້ ຍົກເລີກການ ຄໍາສັ່ງຍົກເລີກໃດໆ break_space, ເລືອກ, ຜົນບັງຄັບໃຊ້ or big_force ຄໍາສັ່ງນັ້ນ
ທັນທີກ່ອນຫຼືປະຕິບັດຕາມມັນແລະຍັງຍົກເລີກການໃດໆ ສໍາຮອງຂໍ້ມູນ ຄໍາສັ່ງດັ່ງຕໍ່ໄປນີ້
ມັນ.
ການ OUTPUT ເອກະສານ
ຖ້າ pretzel ແລ່ນໂດຍບໍ່ມີຂໍ້ຜິດພາດ, ທ່ານຈະໄດ້ຮັບຄໍານິຍາມຂອງ C++ prettyprinter class
ໃນຮູບແບບຂອງສອງໄຟລ໌. ໄຟລ໌ທໍາອິດແມ່ນຖືກຕ້ອງ bison(1) ໄຟລ໌ທີ່ມາຈາກຕົວຈິງ
prettyprinting parser class ສາມາດໄດ້ຮັບ. ໄຟລ໌ທີສອງ (ສ້າງຈາກຮູບແບບ
ໄຟລ໌ token) ສາມາດໄດ້ຮັບການປຸງແຕ່ງດ້ວຍ flex(1) ເຄື່ອງສະແກນເນີເພື່ອສ້າງຮູບແບບການພິມທີ່ສວຍງາມ
ຫ້ອງຮຽນ scanner ໃຊ້ໂດຍ parser.
ໄດ້ bison ເອກະສານ
ໄຟລ໌ bison ສ້າງຂຶ້ນປະກອບດ້ວຍຄໍານິຍາມສໍາລັບຫ້ອງຮຽນ parser ພິມ pretty ວ່າ
ແມ່ນຊັ້ນຍ່ອຍຂອງຊັ້ນພື້ນຖານທີ່ບໍ່ມີຕົວຕົນຕໍ່ໄປນີ້ (ມີຢູ່ໃນໄຟລ໌ Pparse.h ພາຍໃນ
pretzel ປະກອບມີລະບົບ):
#ລວມ
#ລວມທັງ "attr.h"
#include "output.h"
ລະດັບ ແຍກ {
ສາທາລະນະ:
ແຍກ() {};
~Pparse() {};
virtual int prettyprint(istream*, ostream*) = 0;
virtual int prettyprint(istream*, ຜົນຜະລິດ*) = 0;
};
ເຄື່ອງພິມທີ່ສວຍງາມທີ່ຜະລິດໂດຍ pretzel ຈະເປັນປະເພດຍ່ອຍຂອງຮູບແບບຕໍ່ໄປນີ້:
#include Pparse.h // ປະກອບດ້ວຍ ບໍ່ມີຕົວຕົນ ຖານ ລະດັບ
ລະດັບ PPARSE_NAME : ສາທາລະນະ ແຍກ {
ສາທາລະນະ:
PPARSE_NAME(); ~PPARSE_NAME();
int prettyprint(istream*, ostream*);
int prettyprint(istream*, ຜົນຜະລິດ*);
void debug_on(); void debug_off();
};
ຊື່ຂອງຄລາສອາດຈະຖືກປ່ຽນແປງໂດຍການກໍານົດຄືນໃຫມ່ macro preprocessor PPARSE_NAME
ພາຍໃນໄຟລ໌ໄວຍາກອນທີ່ມີຮູບແບບ. ຫນ້າທີ່ການພິມທີ່ສວຍງາມທີ່ແທ້ຈິງແມ່ນ ພິມງາມ ທີ່
ອ່ານຂໍ້ຄວາມຈາກກະແສການປ້ອນຂໍ້ມູນ (ເຊັ່ນ: C++ ໄອສະຕຣີມ object) ແລະສົ່ງຜົນໄດ້ຮັບເປັນ
ກະແສຜົນຜະລິດ (ເຊັ່ນ C++ ໂອເລັນ ວັດຖຸ, ເບິ່ງ ios(3C++)). ສະບັບທີສອງ overloaded
of ພິມງາມ ໃຊ້ເວລາເປັນ ຜົນຜະລິດ ວັດຖຸ (ເບິ່ງໄຟລ໌ output/output.nw ແລະ Pretzelbook
ໃນການແຈກຢາຍ pretzel ສໍາລັບລາຍລະອຽດ) ແລະນໍາໃຊ້ນີ້ເພື່ອອອກລະຫັດ prettyprinted.
ໄດ້ debug ສາມາດນຳໃຊ້ຟັງຊັນຕ່າງໆເພື່ອປ່ຽນຜົນອອກການດີບັກໄປຫາ cerr ເປີດແລະປິດ.
ໄດ້ flex ເອກະສານ
ຫ້ອງຮຽນ parser ພິມ pretty ອີງໃສ່ການບໍລິການຂອງເຄື່ອງສະແກນ prettyprinting ທີ່ສາມາດ
ຜະລິດໂດຍໃຊ້ໄຟລ໌ pretzel ທີສອງ. ມັນປະກອບດ້ວຍຄໍານິຍາມທີ່ສົມບູນແບບຂອງເຄື່ອງສະແກນ
ຊັ້ນຍ່ອຍຂອງຊັ້ນພື້ນຖານທີ່ບໍ່ມີຕົວຕົນນີ້ (ເບິ່ງໄຟລ໌ Pscan.h ໃນ pretzel ປະກອບມີລະບົບ):
#ລວມ #ລວມທັງ "attr.h"
ລະດັບ Pscan {
ສາທາລະນະ:
Pscan(istream*) {}; ~Pscan() {};
virtual int ສະແກນ(ຄຸນສົມບັດ**) = 0;
};
ເຄື່ອງສະແກນຕ້ອງເລີ່ມຕົ້ນດ້ວຍ C++ ໄອສະຕຣີມ ຕົວຊີ້ຈາກທີ່ມັນໃຊ້ເວລາປ້ອນຂໍ້ມູນຂອງມັນ.
ໂທຫາຕົວຈິງ ສະແກນ ຟັງຊັນສົ່ງຄືນຈໍານວນເຕັມ (ລະຫັດ token ຂອງ token ພຽງແຕ່
scanned ຫຼື 0 ໃນຕອນທ້າຍຂອງໄຟລ໌) ບວກກັບການໂທໂດຍຄຸນລັກສະນະອ້າງອີງທີ່ມີເນື້ອໃນຂອງ
token (ເບິ່ງ file attr/attr.nw ຈາກການແຈກຢາຍ pretzel).
ຫ້ອງຮຽນເຄື່ອງສະແກນພິມທີ່ສວຍງາມທີ່ຜະລິດເປັນປະເພດຍ່ອຍແລະມີລັກສະນະນີ້:
#include Pscan.h // ປະກອບດ້ວຍ ບໍ່ມີຕົວຕົນ ຖານ ລະດັບ
ລະດັບ PSCAN_NAME : ສາທາລະນະ Pscan {
ສາທາລະນະ:
PSCAN_NAME(istream*);
~PSCAN_NAME();
int ສະແກນ(ຄຸນສົມບັດ**);
ຊື່ຂອງເຄື່ອງສະແກນສາມາດປ່ຽນແປງໄດ້ພາຍໃນໄຟລ໌ token ທີ່ມີຮູບແບບໂດຍການກໍານົດໃຫມ່
PSCAN_NAME ມະຫາພາກພາຍໃນພາກສ່ວນການປະກາດ. ຫ້ອງຮຽນເຄື່ອງສະແກນຄາດວ່າຈະຊອກຫາ token
ຄໍານິຍາມທົ່ວໄປກັບເຄື່ອງສະແກນແລະເຄື່ອງວິເຄາະໃນໄຟລ໌ທີ່ເອີ້ນວ່າ ptokdefs.h ແລະຈະພະຍາຍາມ
ເພື່ອປະກອບໄຟລ໌ນີ້. ທ່ານຈະຕ້ອງສະຫນອງໄຟລ໌ນີ້ຕົວທ່ານເອງຫຼືການນໍາໃຊ້ -d ທາງເລືອກ
ຂອງ Bison ເພື່ອສ້າງຫນຶ່ງທີ່ເຫມາະສົມກັບໄວຍາກອນທີ່ມີຮູບແບບ (ເບິ່ງ bison(1)). ທ່ານອາດຈະມີການປ່ຽນແປງ
ຊື່ຂອງໄຟລ໌ທີ່ເຄື່ອງສະແກນຄາດຫວັງໂດຍການກໍານົດໃຫມ່ PTOKDEFS_NAME ມະຫາພາກໃນ
ພາກສ່ວນການປະກາດຂອງໄຟລ໌ token ທີ່ມີຮູບແບບ. ໄຟລ໌ສ່ວນຫົວຂອງຄຳເຫັນສຳລັບບົດຄັດຫຍໍ້
ຫ້ອງຮຽນພື້ນຖານແລະຊັ້ນຍ່ອຍເລີ່ມຕົ້ນຢູ່ໃນ pretzel ປະກອບມີໄດເລກະທໍລີ.
ໃຊ້ pretzel ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net