vue2-client 1.15.105 → 1.15.107
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +12 -0
- package/.cursorrules +19 -19
- package/.editorconfig +9 -9
- package/.env +20 -20
- package/.env.apply +19 -19
- package/.env.development +1 -1
- package/.env.gaslink +19 -19
- package/.env.his +19 -19
- package/.env.iot +19 -19
- package/.env.liuli +20 -20
- package/.env.message +19 -19
- package/.env.revenue +19 -19
- package/.env.runtime +19 -19
- package/.env.scada +19 -19
- package/.eslintrc.js +90 -90
- package/.eslintrc.json +5 -5
- package/CHANGELOG.md +824 -824
- package/CLAUDE.md +89 -89
- package/Components.md +60 -60
- package/README.md +65 -65
- package/babel.config.js +21 -21
- package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +46 -46
- package/docs/LowCode/lowcode.md +155 -155
- package/docs/LowCode/lowcodeForDeveloper.md +230 -230
- package/docs/index.md +30 -30
- package/docs/notice.md +22 -22
- package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +179 -185
- package/index.js +31 -31
- package/jest-transform-stub.js +8 -8
- package/jest.config.js +22 -22
- package/jest.setup.js +7 -7
- package/jsconfig.json +19 -19
- package/package.json +111 -111
- package/public/his/editor/editor.html +51 -51
- package/public/his/editor/mock/bind_data.html +779 -779
- package/public/his/editor/mock/data_table.html +40 -40
- package/public/his/editor/mock/sign.html +75 -75
- package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
- package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
- package/public/his/editor/vender/date97/WdatePicker.js +677 -677
- package/public/his/editor/vender/date97/calendar.js +4 -4
- package/public/his/editor/vender/date97/lang/en.js +13 -13
- package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
- package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
- package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
- package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
- package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
- package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
- package/public/his/editor/vender/diff.js +1627 -1627
- package/public/his/editor/vender/editor.js +1 -1
- package/public/his/editor/vender/fabric.js +31187 -31187
- package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
- package/public/his/editor/vender/jquery/jquery.js +10872 -10872
- package/public/his/editor/vender/jquery/jquery.print.js +255 -255
- package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
- package/public/his/editor/vender/mui/mui.min.css +4 -4
- package/public/his/editor/vender/mui/mui.min.js +5 -5
- package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
- package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
- package/public/his/editor/vender/qrcode.js +7 -7
- package/public/his/editor/vender/requirejs/require.js +2145 -2145
- package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
- package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
- package/public/his/editor/vender/signature/jSignature.js +1486 -1486
- package/public/his/editor/vender/validator.js +5094 -5094
- package/public/his/editor/vender/weui/weui.css +5659 -5659
- package/public/his/editor/vender/weui/weui.min.css +4 -4
- package/public/his/editor/vender/weui/weui.min.js +11 -11
- package/public/index.html +27 -27
- package/src/App.vue +196 -196
- package/src/ReportView.js +13 -13
- package/src/assets/img/querySlotDemo.svg +15 -15
- package/src/assets/svg/badtwo.svg +1 -1
- package/src/assets/svg/goodtwo.svg +1 -1
- package/src/base-client/components/AI/AskAiBtn.vue +136 -136
- package/src/base-client/components/AI/demo.vue +31 -31
- package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +532 -532
- package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
- package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
- package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
- package/src/base-client/components/common/AddressSearchCombobox/index.js +3 -3
- package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
- package/src/base-client/components/common/AmapMarker/index.js +3 -3
- package/src/base-client/components/common/CitySelect/CitySelect.vue +376 -376
- package/src/base-client/components/common/CitySelect/demo.vue +43 -43
- package/src/base-client/components/common/CitySelect/index.js +3 -3
- package/src/base-client/components/common/CitySelect/index.md +109 -109
- package/src/base-client/components/common/ColorPickerCombobox/ColorPickerCombobox.vue +99 -99
- package/src/base-client/components/common/ColorPickerCombobox/demo.vue +34 -34
- package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
- package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
- package/src/base-client/components/common/CreateQuery/index.js +3 -3
- package/src/base-client/components/common/CreateQuery/index.md +42 -42
- package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
- package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
- package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
- package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
- package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +146 -146
- package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
- package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
- package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
- package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
- package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
- package/src/base-client/components/common/JSONToTree/index.js +3 -3
- package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
- package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
- package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
- package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
- package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
- package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
- package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
- package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
- package/src/base-client/components/common/PersonSetting/index.js +3 -3
- package/src/base-client/components/common/Recording/Recording.vue +243 -243
- package/src/base-client/components/common/Recording/index.js +3 -3
- package/src/base-client/components/common/Tree/Tree.vue +149 -149
- package/src/base-client/components/common/Tree/index.js +2 -2
- package/src/base-client/components/common/Upload/Upload.vue +323 -323
- package/src/base-client/components/common/Upload/index.js +3 -3
- package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
- package/src/base-client/components/common/XAddForm/index.js +3 -3
- package/src/base-client/components/common/XAddForm/index.md +61 -61
- package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1169 -1169
- package/src/base-client/components/common/XAddNativeForm/demo.vue +54 -54
- package/src/base-client/components/common/XAddNativeForm/index.js +3 -3
- package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
- package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
- package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
- package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
- package/src/base-client/components/common/XAddReport/XAddReport.vue +212 -212
- package/src/base-client/components/common/XAddReport/index.js +3 -3
- package/src/base-client/components/common/XAddReport/index.md +56 -56
- package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
- package/src/base-client/components/common/XBadge/index.js +3 -3
- package/src/base-client/components/common/XBadge/index.md +39 -39
- package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
- package/src/base-client/components/common/XButtons/XButtons.vue +284 -284
- package/src/base-client/components/common/XButtons/index.js +3 -3
- package/src/base-client/components/common/XButtons/index.md +61 -61
- package/src/base-client/components/common/XCalendar/XCalendar.vue +369 -369
- package/src/base-client/components/common/XCalendar/index.md +284 -284
- package/src/base-client/components/common/XCard/XCard.vue +64 -64
- package/src/base-client/components/common/XCard/index.js +3 -3
- package/src/base-client/components/common/XCard/index.md +43 -43
- package/src/base-client/components/common/XCardSet/XCardSet.vue +300 -300
- package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
- package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
- package/src/base-client/components/common/XCollapse/XCollapse.vue +355 -355
- package/src/base-client/components/common/XConversation/XConversation.vue +576 -576
- package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
- package/src/base-client/components/common/XDataCard/XDataCard.vue +629 -629
- package/src/base-client/components/common/XDataCard/index.js +3 -3
- package/src/base-client/components/common/XDataCard/index.md +1 -1
- package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
- package/src/base-client/components/common/XDataDrawer/index.js +3 -3
- package/src/base-client/components/common/XDataDrawer/index.md +41 -41
- package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
- package/src/base-client/components/common/XDatePicker/index.vue +276 -276
- package/src/base-client/components/common/XDescriptions/XDescriptions.vue +174 -174
- package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +314 -314
- package/src/base-client/components/common/XDescriptions/demo.vue +51 -51
- package/src/base-client/components/common/XDescriptions/index.js +3 -3
- package/src/base-client/components/common/XDescriptions/index.md +83 -83
- package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
- package/src/base-client/components/common/XDetailsView/index.js +3 -3
- package/src/base-client/components/common/XForm/XForm.vue +426 -426
- package/src/base-client/components/common/XForm/XFormItem.vue +1479 -1497
- package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
- package/src/base-client/components/common/XForm/XTreeSelect.vue +276 -276
- package/src/base-client/components/common/XForm/demo.vue +105 -105
- package/src/base-client/components/common/XForm/index.js +3 -3
- package/src/base-client/components/common/XForm/index.md +178 -178
- package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
- package/src/base-client/components/common/XFormCol/XFormCol.vue +157 -157
- package/src/base-client/components/common/XFormCol/index.js +3 -3
- package/src/base-client/components/common/XFormCol/index.md +35 -35
- package/src/base-client/components/common/XFormGroup/XFormGroup.vue +301 -301
- package/src/base-client/components/common/XFormGroup/demo.vue +41 -41
- package/src/base-client/components/common/XFormGroup/index.js +3 -3
- package/src/base-client/components/common/XFormGroup/index.md +38 -38
- package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
- package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
- package/src/base-client/components/common/XFormTable/XFormTable.vue +939 -939
- package/src/base-client/components/common/XFormTable/demo.vue +87 -87
- package/src/base-client/components/common/XFormTable/index.js +3 -3
- package/src/base-client/components/common/XFormTable/index.md +92 -92
- package/src/base-client/components/common/XImportExcel/XImportExcel.vue +174 -174
- package/src/base-client/components/common/XImportExcel/index.js +3 -3
- package/src/base-client/components/common/XImportExcel/index.md +38 -38
- package/src/base-client/components/common/XInput/XInput.vue +128 -128
- package/src/base-client/components/common/XInput/index.js +3 -3
- package/src/base-client/components/common/XInput/index.md +97 -97
- package/src/base-client/components/common/XIntervalPicker/XIntervalPicker.vue +121 -121
- package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
- package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
- package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
- package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
- package/src/base-client/components/common/XLicensePlate/index.js +3 -3
- package/src/base-client/components/common/XLicensePlate/index.md +38 -38
- package/src/base-client/components/common/XPrint/Demo.vue +41 -41
- package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
- package/src/base-client/components/common/XPrint/PrintBill.vue +308 -308
- package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
- package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
- package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
- package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
- package/src/base-client/components/common/XPrint/index.vue +97 -97
- package/src/base-client/components/common/XRate/demo.vue +102 -102
- package/src/base-client/components/common/XRate/index.vue +149 -149
- package/src/base-client/components/common/XReport/XReport.vue +963 -963
- package/src/base-client/components/common/XReport/XReportDemo.vue +70 -70
- package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
- package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
- package/src/base-client/components/common/XReport/XReportTrGroup.vue +1005 -1005
- package/src/base-client/components/common/XReport/index.js +3 -3
- package/src/base-client/components/common/XReport/index.md +103 -103
- package/src/base-client/components/common/XReport/print.js +186 -186
- package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
- package/src/base-client/components/common/XReportDrawer/index.js +3 -3
- package/src/base-client/components/common/XReportGrid/XReport.vue +1075 -1075
- package/src/base-client/components/common/XReportGrid/XReportDemo.vue +44 -44
- package/src/base-client/components/common/XReportGrid/XReportDesign.vue +620 -620
- package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +724 -724
- package/src/base-client/components/common/XReportGrid/index.js +3 -3
- package/src/base-client/components/common/XReportGrid/index.md +44 -44
- package/src/base-client/components/common/XReportGrid/print.js +184 -184
- package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
- package/src/base-client/components/common/XReportSlot/index.js +3 -3
- package/src/base-client/components/common/XReportSlot/index.md +48 -48
- package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
- package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
- package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
- package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
- package/src/base-client/components/common/XStepView/index.js +3 -3
- package/src/base-client/components/common/XStepView/index.md +31 -31
- package/src/base-client/components/common/XTab/XTab.vue +299 -299
- package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
- package/src/base-client/components/common/XTab/index.js +3 -3
- package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
- package/src/base-client/components/common/XTable/ExportExcel.vue +283 -283
- package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
- package/src/base-client/components/common/XTable/XTable.vue +1599 -1599
- package/src/base-client/components/common/XTable/XTableWrapper.vue +597 -597
- package/src/base-client/components/common/XTable/index.js +3 -3
- package/src/base-client/components/common/XTable/index.md +255 -255
- package/src/base-client/components/common/XTagGroup/index.vue +52 -52
- package/src/base-client/components/common/XTimeline/XTimeline.vue +358 -358
- package/src/base-client/components/common/XTimeline/index.md +191 -191
- package/src/base-client/components/common/XTree/XTree.vue +424 -424
- package/src/base-client/components/common/XTree/XTreePro.vue +452 -452
- package/src/base-client/components/common/XTree/index.js +3 -3
- package/src/base-client/components/common/XTree/index.md +36 -36
- package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
- package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
- package/src/base-client/components/common/XTreeOne/index.js +3 -3
- package/src/base-client/components/common/XUploadFilesView/index.vue +485 -485
- package/src/base-client/components/common/richTextModal/index.vue +56 -56
- package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
- package/src/base-client/components/his/XCharge/XCharge.vue +238 -238
- package/src/base-client/components/his/XCheckbox/XCheckbox.vue +105 -105
- package/src/base-client/components/his/XCheckbox/index.md +253 -253
- package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +430 -430
- package/src/base-client/components/his/XHDescriptions/index.md +217 -217
- package/src/base-client/components/his/XHisEditor/XHisEditor.vue +629 -678
- package/src/base-client/components/his/XHisEditor/diagnosisAutocomplete.js +263 -263
- package/src/base-client/components/his/XHisEditor/index.js +3 -3
- package/src/base-client/components/his/XImportExcelButton/XFrontImportExcel.vue +218 -218
- package/src/base-client/components/his/XImportExcelButton/XFrontImportExcelDemo.vue +21 -21
- package/src/base-client/components/his/XImportExcelButton/XImportExcelButton.vue +103 -103
- package/src/base-client/components/his/XList/XList.vue +495 -495
- package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.json +3 -3
- package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.vue +106 -106
- package/src/base-client/components/his/XQuestionnaire/XQuestionnaireDemo.vue +51 -51
- package/src/base-client/components/his/XQuestionnaire/XQuestionnaireItem.vue +269 -269
- package/src/base-client/components/his/XRadio/XRadio.vue +125 -125
- package/src/base-client/components/his/XRadio/index.md +234 -234
- package/src/base-client/components/his/XSelect/XSelect.vue +72 -72
- package/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +339 -339
- package/src/base-client/components/his/XShiftSchedule/dome.vue +29 -29
- package/src/base-client/components/his/XSidebar/XSidebar.vue +240 -240
- package/src/base-client/components/his/XSimpleTable/XSimpleTable.vue +119 -88
- package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +162 -162
- package/src/base-client/components/his/XTimeSelect/XTimeSelectDemo.vue +23 -23
- package/src/base-client/components/his/XTitle/README.md +113 -113
- package/src/base-client/components/his/XTitle/XTitle.vue +123 -123
- package/src/base-client/components/his/XTreeRows/TreeNode.vue +107 -107
- package/src/base-client/components/his/XTreeRows/XTreeRows.vue +307 -307
- package/src/base-client/components/his/threeTestOrders/dome.vue +68 -68
- package/src/base-client/components/his/threeTestOrders/textBox.vue +457 -457
- package/src/base-client/components/his/threeTestOrders/threeTestOrders.vue +475 -475
- package/src/base-client/components/index.js +51 -51
- package/src/base-client/components/layout/XPageView/RenderRow.vue +88 -88
- package/src/base-client/components/layout/XPageView/XErrorView.vue +22 -22
- package/src/base-client/components/layout/XPageView/XPageRowTemplate.vue +37 -37
- package/src/base-client/components/layout/XPageView/XPageView.vue +223 -223
- package/src/base-client/components/layout/XPageView/XTab/XTab.vue +96 -96
- package/src/base-client/components/layout/XPageView/XTab/index.js +3 -3
- package/src/base-client/components/layout/XPageView/componentTypes.js +22 -22
- package/src/base-client/components/layout/XPageView/index.js +2 -2
- package/src/base-client/components/layout/XPageView/index.md +96 -96
- package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
- package/src/base-client/components/layout/XTreeView/index.js +3 -3
- package/src/base-client/components/layout/XTreeView/index.md +46 -46
- package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
- package/src/base-client/components/system/DictionaryDetailsView/index.js +3 -3
- package/src/base-client/components/system/DictionaryDetailsView/index.md +41 -41
- package/src/base-client/components/system/LogDetailsView/LogDetailsView.vue +376 -376
- package/src/base-client/components/system/LogDetailsView/index.js +3 -3
- package/src/base-client/components/system/LogDetailsView/index.md +41 -41
- package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
- package/src/base-client/components/system/QueryParamsDetailsView/index.js +3 -3
- package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +807 -807
- package/src/base-client/components/ticket/TicketDetailsView/index.js +3 -3
- package/src/base-client/components/ticket/TicketDetailsView/index.md +29 -29
- package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +260 -260
- package/src/base-client/components/ticket/TicketDetailsView/part/index.js +3 -3
- package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +532 -532
- package/src/base-client/components/ticket/TicketSubmitSuccessView/index.js +3 -3
- package/src/base-client/components/ticket/TicketSubmitSuccessView/index.md +29 -29
- package/src/base-client/plugins/AppData.js +126 -126
- package/src/base-client/plugins/Config.js +19 -19
- package/src/base-client/plugins/GetLoginInfoService.js +183 -183
- package/src/base-client/plugins/PagedList.js +177 -177
- package/src/base-client/plugins/Recording.js +258 -258
- package/src/base-client/plugins/__tests__/selectValueTypeHelper.test.js +154 -154
- package/src/base-client/plugins/authority-plugin.js +167 -167
- package/src/base-client/plugins/compatible/LoginServiceOA.js +20 -20
- package/src/base-client/plugins/i18n-extend.js +32 -32
- package/src/base-client/plugins/index.js +23 -23
- package/src/base-client/plugins/moment.js +8 -8
- package/src/base-client/plugins/selectValueTypeHelper.js +281 -281
- package/src/base-client/plugins/tabs-page-plugin.js +39 -39
- package/src/bootstrap.js +51 -51
- package/src/components/Charts/Bar.vue +62 -62
- package/src/components/Charts/ChartCard.vue +134 -134
- package/src/components/Charts/Liquid.vue +67 -67
- package/src/components/Charts/MiniArea.vue +39 -39
- package/src/components/Charts/MiniBar.vue +39 -39
- package/src/components/Charts/MiniProgress.vue +75 -75
- package/src/components/Charts/MiniSmoothArea.vue +40 -40
- package/src/components/Charts/Radar.vue +68 -68
- package/src/components/Charts/RankList.vue +77 -77
- package/src/components/Charts/TagCloud.vue +113 -113
- package/src/components/Charts/TransferBar.vue +64 -64
- package/src/components/Charts/Trend.vue +82 -82
- package/src/components/Charts/chart.less +12 -12
- package/src/components/Charts/smooth.area.less +13 -13
- package/src/components/CodeMirror/inedx.vue +118 -118
- package/src/components/CodeMirror/setting.js +40 -40
- package/src/components/Ellipsis/Ellipsis.vue +65 -65
- package/src/components/Ellipsis/index.js +3 -3
- package/src/components/Ellipsis/index.md +38 -38
- package/src/components/FileImageItem/FileItem.vue +320 -320
- package/src/components/FileImageItem/FileItemGroup.vue +197 -197
- package/src/components/FileImageItem/ImageItem.vue +107 -107
- package/src/components/FileImageItem/index.js +4 -4
- package/src/components/FilePreview/FilePreview.vue +181 -181
- package/src/components/FilePreview/FilePreviewDemo.vue +30 -30
- package/src/components/FilePreview/index.js +3 -3
- package/src/components/HeightScanner/index.vue +615 -615
- package/src/components/NumberInfo/NumberInfo.vue +54 -54
- package/src/components/NumberInfo/index.js +3 -3
- package/src/components/NumberInfo/index.less +54 -54
- package/src/components/NumberInfo/index.md +43 -43
- package/src/components/STable/README.md +341 -341
- package/src/components/STable/index.js +558 -558
- package/src/components/TableSetting/TableSetting.vue +143 -143
- package/src/components/TableSetting/index.js +3 -3
- package/src/components/Trend/Trend.vue +41 -41
- package/src/components/Trend/index.js +3 -3
- package/src/components/Trend/index.less +41 -41
- package/src/components/Trend/index.md +45 -45
- package/src/components/_util/util.js +46 -46
- package/src/components/cache/AKeepAlive.js +179 -179
- package/src/components/card/ChartCard.vue +79 -79
- package/src/components/chart/Bar.vue +60 -60
- package/src/components/chart/MiniArea.vue +67 -67
- package/src/components/chart/MiniBar.vue +59 -59
- package/src/components/chart/MiniProgress.vue +57 -57
- package/src/components/chart/Radar.vue +80 -80
- package/src/components/chart/RankingList.vue +60 -60
- package/src/components/chart/Trend.vue +79 -79
- package/src/components/chart/index.less +9 -9
- package/src/components/checkbox/ColorCheckbox.vue +157 -157
- package/src/components/checkbox/ImgCheckbox.vue +117 -117
- package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
- package/src/components/checkbox/index.js +9 -9
- package/src/components/exception/ExceptionPage.vue +70 -70
- package/src/components/exception/typeConfig.js +19 -19
- package/src/components/form/FormRow.vue +52 -52
- package/src/components/g2Charts/constants.js +202 -202
- package/src/components/g2Charts/demo.vue +808 -808
- package/src/components/g2Charts/designer.vue +228 -228
- package/src/components/g2Charts/designerBaseConfig.vue +61 -61
- package/src/components/g2Charts/designerDataConfig.vue +259 -259
- package/src/components/g2Charts/designerStyleConfig.vue +16 -16
- package/src/components/g2Charts/index.vue +397 -397
- package/src/components/index.js +36 -36
- package/src/components/index.less +5 -5
- package/src/components/input/IInput.vue +66 -66
- package/src/components/menu/Contextmenu.vue +84 -84
- package/src/components/menu/SideMenu.vue +75 -75
- package/src/components/menu/index.less +38 -38
- package/src/components/menu/menu.js +273 -273
- package/src/components/page/header/PageHeader.vue +64 -64
- package/src/components/page/header/index.less +40 -40
- package/src/components/result/Result.vue +77 -77
- package/src/components/setting/Setting.vue +234 -234
- package/src/components/setting/SettingItem.vue +26 -26
- package/src/components/setting/i18n.js +117 -117
- package/src/components/table/StandardTable.vue +141 -141
- package/src/components/table/advance/ActionColumns.vue +158 -158
- package/src/components/table/advance/ActionSize.vue +45 -45
- package/src/components/table/advance/AdvanceTable.vue +275 -275
- package/src/components/table/advance/SearchArea.vue +355 -355
- package/src/components/table/advance/index.js +2 -2
- package/src/components/table/api/ApiTable.vue +50 -50
- package/src/components/task/TaskGroup.vue +80 -80
- package/src/components/task/TaskItem.vue +26 -26
- package/src/components/tool/AStepItem.vue +60 -60
- package/src/components/tool/AvatarList.vue +68 -68
- package/src/components/tool/DetailList.vue +157 -157
- package/src/components/tool/Drawer.vue +142 -142
- package/src/components/tool/FooterToolBar.vue +30 -30
- package/src/components/tool/HeadInfo.vue +35 -35
- package/src/components/tool/TagSelect.vue +83 -83
- package/src/components/tool/TagSelectOption.vue +33 -33
- package/src/components/transition/PageToggleTransition.vue +97 -97
- package/src/config/CreateQueryConfig.js +325 -325
- package/src/config/default/admin.config.js +18 -18
- package/src/config/default/animate.config.js +21 -21
- package/src/config/default/antd.config.js +89 -89
- package/src/config/default/index.js +6 -6
- package/src/config/default/setting.config.js +55 -55
- package/src/config/index.js +3 -3
- package/src/config/replacer/index.js +10 -10
- package/src/config/replacer/resolve.config.js +67 -67
- package/src/expression/ExpressionRunner.js +26 -26
- package/src/expression/TestExpression.js +509 -509
- package/src/expression/core/Delegate.js +115 -115
- package/src/expression/core/Expression.js +1358 -1358
- package/src/expression/core/Program.js +932 -932
- package/src/expression/core/Token.js +27 -27
- package/src/expression/enums/ExpressionType.js +81 -81
- package/src/expression/enums/TokenType.js +11 -11
- package/src/expression/exception/BreakWayException.js +2 -2
- package/src/expression/exception/ContinueWayException.js +2 -2
- package/src/expression/exception/ExpressionException.js +28 -28
- package/src/expression/exception/ReturnWayException.js +14 -14
- package/src/expression/exception/ServiceException.js +22 -22
- package/src/expression/instances/LogicConsole.js +44 -44
- package/src/expression/ts/ExpressionRunner.ts +28 -28
- package/src/expression/ts/TestExpression.ts +509 -509
- package/src/expression/ts/core/Delegate.ts +114 -114
- package/src/expression/ts/core/Expression.ts +1309 -1309
- package/src/expression/ts/core/Program.ts +950 -950
- package/src/expression/ts/core/Token.ts +29 -29
- package/src/expression/ts/enums/ExpressionType.ts +81 -81
- package/src/expression/ts/enums/TokenType.ts +13 -13
- package/src/expression/ts/exception/BreakWayException.ts +2 -2
- package/src/expression/ts/exception/ContinueWayException.ts +2 -2
- package/src/expression/ts/exception/ExpressionException.ts +28 -28
- package/src/expression/ts/exception/ReturnWayException.ts +14 -14
- package/src/expression/ts/exception/ServiceException.ts +22 -22
- package/src/expression/ts/instances/JSONArray.ts +48 -48
- package/src/expression/ts/instances/JSONObject.ts +109 -109
- package/src/expression/ts/instances/LogicConsole.ts +32 -32
- package/src/font-style/font.css +4 -4
- package/src/layouts/AdminLayout.vue +176 -176
- package/src/layouts/BlankView.vue +81 -81
- package/src/layouts/CommonLayout.vue +56 -56
- package/src/layouts/ComponentLayoutOne.vue +47 -47
- package/src/layouts/GridView.vue +43 -43
- package/src/layouts/PageLayout.vue +151 -151
- package/src/layouts/PageView.vue +55 -55
- package/src/layouts/SinglePageView.vue +136 -136
- package/src/layouts/footer/PageFooter.vue +49 -49
- package/src/layouts/header/AdminHeader.vue +132 -132
- package/src/layouts/header/HeaderAvatar.vue +64 -64
- package/src/layouts/header/HeaderNotice.vue +177 -177
- package/src/layouts/header/HeaderSearch.vue +67 -67
- package/src/layouts/header/InstitutionDetail.vue +181 -181
- package/src/layouts/header/index.less +92 -92
- package/src/layouts/tabs/TabsHead.vue +189 -189
- package/src/layouts/tabs/TabsView.vue +383 -383
- package/src/layouts/tabs/i18n.js +25 -25
- package/src/layouts/tabs/index.js +2 -2
- package/src/lib.js +1 -1
- package/src/logic/LogicRunner.js +62 -62
- package/src/logic/TestLogic.js +13 -13
- package/src/logic/plugins/common/DateTools.js +35 -35
- package/src/logic/plugins/common/VueTools.js +30 -30
- package/src/logic/plugins/index.js +7 -7
- package/src/logic/ts/LogicRunner.ts +67 -67
- package/src/logic/ts/TestLogic.ts +13 -13
- package/src/main.js +33 -33
- package/src/mixins/formValidationMixin.js +46 -46
- package/src/mock/common/activityData.js +32 -32
- package/src/mock/common/index.js +89 -89
- package/src/mock/common/reportData.js +20 -20
- package/src/mock/common/tableData.js +118 -118
- package/src/mock/extend/index.js +84 -84
- package/src/mock/goods/index.js +108 -108
- package/src/mock/index.js +12 -12
- package/src/mock/project/index.js +17 -17
- package/src/mock/user/current.js +13 -13
- package/src/mock/user/login.js +39 -39
- package/src/mock/user/routes.js +61 -61
- package/src/mock/workplace/index.js +15 -15
- package/src/pages/DefaultExample/index.vue +77 -77
- package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
- package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
- package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
- package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
- package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
- package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
- package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
- package/src/pages/DynamicStatistics/index.vue +282 -282
- package/src/pages/Example/childIndex.vue +15 -15
- package/src/pages/Example/index.vue +30 -30
- package/src/pages/LogicCallExample/index.vue +46 -46
- package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
- package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
- package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
- package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
- package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
- package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
- package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
- package/src/pages/NewDynamicStatistics/index.vue +258 -258
- package/src/pages/Recording/index.vue +77 -77
- package/src/pages/ReportGrid/index.vue +76 -76
- package/src/pages/ReportView.vue +50 -50
- package/src/pages/ServiceReview/index.vue +284 -284
- package/src/pages/SubExample/index.vue +26 -26
- package/src/pages/WorkflowDetail/WorkFlowDemo.vue +47 -47
- package/src/pages/WorkflowDetail/WorkFlowDemo2.vue +204 -204
- package/src/pages/WorkflowDetail/WorkFlowDemo3.vue +203 -203
- package/src/pages/WorkflowDetail/WorkflowDetail.vue +397 -397
- package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +388 -388
- package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +415 -415
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1766 -1766
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +975 -975
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowPreview.vue +125 -125
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +929 -929
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +218 -218
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +243 -243
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +188 -188
- package/src/pages/WorkflowDetail/WorkflowPageDetail/components/WorkflowPersonSelector.vue +109 -109
- package/src/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue +97 -97
- package/src/pages/XPageViewExample/index.vue +149 -149
- package/src/pages/XReportView/index.vue +64 -64
- package/src/pages/XTreeOneProExample/index.vue +67 -67
- package/src/pages/addressSelect/addressDemo.vue +24 -24
- package/src/pages/addressSelect/index.vue +270 -270
- package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
- package/src/pages/dashboard/workplace/i18n.js +40 -40
- package/src/pages/dashboard/workplace/index.js +2 -2
- package/src/pages/dashboard/workplace/index.less +59 -59
- package/src/pages/exception/403.vue +21 -21
- package/src/pages/exception/404.vue +24 -24
- package/src/pages/exception/500.vue +21 -21
- package/src/pages/login/Login.vue +380 -380
- package/src/pages/login/LoginV3.vue +389 -389
- package/src/pages/login/index.js +2 -2
- package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
- package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
- package/src/pages/report/ReportTable.js +124 -124
- package/src/pages/report/ReportTableHome.vue +28 -28
- package/src/pages/resourceManage/depListManage.vue +23 -23
- package/src/pages/resourceManage/funListManage.vue +23 -23
- package/src/pages/resourceManage/index.js +15 -15
- package/src/pages/resourceManage/orgListManage.vue +98 -98
- package/src/pages/resourceManage/resourceManageMain.vue +57 -57
- package/src/pages/resourceManage/roleListManage.vue +23 -23
- package/src/pages/resourceManage/staffListManage.vue +23 -23
- package/src/pages/system/dictionary/index.vue +44 -44
- package/src/pages/system/file/Info.vue +56 -56
- package/src/pages/system/file/index.vue +317 -317
- package/src/pages/system/monitor/loginInfor/index.vue +37 -37
- package/src/pages/system/monitor/operLog/index.vue +37 -37
- package/src/pages/system/settings/index.vue +126 -126
- package/src/pages/system/settings/modifyPassword.vue +117 -117
- package/src/pages/system/ticket/index.vue +480 -480
- package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
- package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +77 -77
- package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +75 -75
- package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/InsuranceDetailQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +75 -75
- package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +75 -75
- package/src/pages/userInfoDetailManage/PriceAdjustments/index.vue +64 -64
- package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
- package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +94 -94
- package/src/pages/userInfoDetailManage/UserException/index.vue +64 -64
- package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +87 -87
- package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +74 -74
- package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/index.vue +290 -290
- package/src/pages/userInfoDetailManage/uploadFilesHistory/ImagePreview.vue +101 -101
- package/src/pages/userInfoDetailManage/uploadFilesHistory/index.vue +129 -129
- package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +144 -144
- package/src/plugins/EventLogPlugin.js +33 -33
- package/src/plugins/FindParentsData.js +17 -17
- package/src/plugins/HiPrintPlugin.js +164 -164
- package/src/router/async/config.async.js +35 -35
- package/src/router/async/router.map.js +127 -127
- package/src/router/guards.js +262 -262
- package/src/router/i18n.js +57 -57
- package/src/router/index.js +27 -27
- package/src/router.js +17 -17
- package/src/services/DataModel.js +30 -30
- package/src/services/LodopFuncs.js +137 -137
- package/src/services/api/DictionaryDetailsViewApi.js +6 -6
- package/src/services/api/LogDetailsViewApi.js +10 -10
- package/src/services/api/QueryParamsDetailsViewApi.js +6 -6
- package/src/services/api/TicketDetailsViewApi.js +46 -46
- package/src/services/api/cas.js +79 -79
- package/src/services/api/common.js +346 -346
- package/src/services/api/entity.js +18 -18
- package/src/services/api/index.js +17 -17
- package/src/services/api/logininfor/index.js +6 -6
- package/src/services/api/manage.js +8 -8
- package/src/services/api/restTools.js +215 -215
- package/src/services/api/workFlow.js +57 -57
- package/src/services/apiService.js +16 -16
- package/src/services/dataSource.js +12 -12
- package/src/services/index.js +7 -7
- package/src/services/user.js +92 -92
- package/src/services/v3Api.js +116 -116
- package/src/store/index.js +5 -5
- package/src/store/modules/account.js +115 -115
- package/src/store/modules/index.js +5 -5
- package/src/store/modules/lowCode.js +33 -33
- package/src/store/modules/setting.js +119 -119
- package/src/store/mutation-types.js +4 -4
- package/src/theme/antd/ant-menu.less +2 -2
- package/src/theme/antd/ant-message.less +3 -3
- package/src/theme/antd/ant-table.less +22 -22
- package/src/theme/antd/ant-time-picker.less +3 -3
- package/src/theme/antd/index.less +3 -3
- package/src/theme/default/color.less +43 -43
- package/src/theme/default/index.less +3 -3
- package/src/theme/default/nprogress.less +76 -76
- package/src/theme/default/style.less +58 -58
- package/src/theme/global.less +279 -279
- package/src/theme/index.less +5 -5
- package/src/theme/reportTable.less +58 -58
- package/src/theme/theme.less +1 -1
- package/src/utils/EncryptUtil.js +162 -162
- package/src/utils/Objects.js +25 -25
- package/src/utils/authority-utils.js +85 -85
- package/src/utils/axios-interceptors.js +100 -100
- package/src/utils/colors.js +107 -107
- package/src/utils/common.js +10 -10
- package/src/utils/errorCode.js +6 -6
- package/src/utils/excel/Blob.js +180 -180
- package/src/utils/excel/Export2Excel.js +184 -184
- package/src/utils/filter.js +21 -21
- package/src/utils/formatter.js +74 -74
- package/src/utils/htmlToPDF.js +108 -108
- package/src/utils/htmlToPDFApi.js +5 -5
- package/src/utils/i18n.js +80 -80
- package/src/utils/indexedDB.js +549 -549
- package/src/utils/login.js +188 -188
- package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
- package/src/utils/lowcode/lowcodeLog.js +29 -29
- package/src/utils/lowcode/lowcodeUtils.js +373 -373
- package/src/utils/lowcode/registerComponentForEditor.js +1 -1
- package/src/utils/lowcode/registerComponentForRender.js +11 -11
- package/src/utils/map-utils.js +47 -47
- package/src/utils/microAppUtils.js +49 -49
- package/src/utils/reg.js +95 -95
- package/src/utils/request.js +395 -395
- package/src/utils/routerUtil.js +567 -567
- package/src/utils/runEvalFunction.js +14 -14
- package/src/utils/theme-color-replacer-extend.js +92 -92
- package/src/utils/themeUtil.js +100 -100
- package/src/utils/util.js +329 -329
- package/src/utils/waterMark.js +31 -31
- package/test/Tree.spec.js +168 -168
- package/test/myDialog.spec.js +47 -47
- package/test/request.test.js +17 -17
- package/test/util.test.js +53 -53
- package/test/v3Api.test.js +1984 -1984
- package/tests/unit/ReportTable.spec.js +16 -16
- package/vue.config.js +222 -222
- package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
- package/.history/public/his/editor/editor_20250606134713.html +0 -51
- package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527173925.vue +0 -509
- package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174316.vue +0 -524
- package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174419.vue +0 -524
- package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174422.vue +0 -524
- package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172825.vue +0 -207
- package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172945.vue +0 -211
- package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172949.vue +0 -212
- package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611173010.vue +0 -212
- package/.history/src/base-client/components/common/XForm/XFormItem_20250508134122.vue +0 -1320
- package/.history/src/base-client/components/common/XForm/XFormItem_20250527171604.vue +0 -1332
- package/.history/src/base-client/components/common/XForm/XFormItem_20250527171613.vue +0 -1331
- package/.history/src/base-client/components/common/XForm/XFormItem_20250527171703.vue +0 -1331
- package/.history/src/base-client/components/common/XForm/XFormItem_20250527171720.vue +0 -1331
- package/.history/src/base-client/components/common/XForm/XFormItem_20250527174327.vue +0 -1339
- package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612092804.vue +0 -731
- package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612112546.vue +0 -748
- package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612113808.vue +0 -748
- package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115237.vue +0 -1071
- package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115346.vue +0 -1078
- package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115350.vue +0 -1077
- package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115415.vue +0 -1077
- package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115429.vue +0 -1077
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611091619.vue +0 -442
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092547.vue +0 -442
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092552.vue +0 -442
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092744.vue +0 -475
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092955.vue +0 -475
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092957.vue +0 -475
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095652.vue +0 -477
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095701.vue +0 -477
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095704.vue +0 -477
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100005.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100011.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100014.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100833.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100853.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100940.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101011.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101013.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101014.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101159.vue +0 -473
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101238.vue +0 -474
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101240.vue +0 -474
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101242.vue +0 -474
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101404.vue +0 -472
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101410.vue +0 -472
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101459.vue +0 -472
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101500.vue +0 -472
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101502.vue +0 -472
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101504.vue +0 -472
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101610.vue +0 -501
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101700.vue +0 -501
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101702.vue +0 -501
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101741.vue +0 -504
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101749.vue +0 -504
- package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101759.vue +0 -504
- package/.history/src/base-client/components/his/XHisEditor/dome_20250611091349.vue +0 -131
- package/.history/src/base-client/components/his/XHisEditor/dome_20250611105854.vue +0 -160
- package/.history/src/base-client/components/his/XHisEditor/dome_20250611105902.vue +0 -160
- package/.history/src/base-client/components/his/XHisEditor/dome_20250611105924.vue +0 -160
- package/.history/src/base-client/components/his/XHisEditor/dome_20250611105932.vue +0 -158
- package/.history/src/base-client/components/his/XList/XList_20250609135848.vue +0 -173
- package/.history/src/base-client/components/his/XList/XList_20250609141026.vue +0 -222
- package/.history/src/base-client/components/his/XList/XList_20250609141035.vue +0 -229
- package/.history/src/base-client/components/his/XList/XList_20250609141103.vue +0 -229
- package/.history/src/base-client/components/his/XList/XList_20250609141105.vue +0 -229
- package/.history/src/base-client/components/his/XList/XList_20250609141334.vue +0 -241
- package/.history/src/base-client/components/his/XList/XList_20250609141404.vue +0 -241
- package/.history/src/base-client/components/his/XList/XList_20250609141406.vue +0 -241
- package/.history/src/base-client/components/his/XList/XList_20250609141801.vue +0 -245
- package/.history/src/base-client/components/his/XList/XList_20250609142033.vue +0 -245
- package/.history/src/base-client/components/his/XList/XList_20250609142038.vue +0 -245
- package/.history/src/base-client/components/his/XList/XList_20250609142435.vue +0 -255
- package/.history/src/base-client/components/his/XList/XList_20250609142503.vue +0 -255
- package/.history/src/base-client/components/his/XList/XList_20250609142504.vue +0 -255
- package/.history/src/base-client/components/his/XList/XList_20250609143012.vue +0 -270
- package/.history/src/base-client/components/his/XList/XList_20250609143044.vue +0 -270
- package/.history/src/base-client/components/his/XList/XList_20250609143046.vue +0 -270
- package/.history/src/base-client/components/his/XList/XList_20250609143210.vue +0 -270
- package/.history/src/base-client/components/his/XList/XList_20250609144339.vue +0 -294
- package/.history/src/base-client/components/his/XList/XList_20250609144410.vue +0 -294
- package/.history/src/base-client/components/his/XList/XList_20250609144412.vue +0 -294
- package/.history/src/base-client/components/his/XList/XList_20250609144647.vue +0 -303
- package/.history/src/base-client/components/his/XList/XList_20250609144716.vue +0 -303
- package/.history/src/base-client/components/his/XList/XList_20250609144729.vue +0 -303
- package/.history/src/base-client/components/his/XList/XList_20250609151232.vue +0 -288
- package/.history/src/base-client/components/his/XList/XList_20250609151247.vue +0 -288
- package/.history/src/base-client/components/his/XList/XList_20250609151252.vue +0 -288
- package/.history/src/base-client/components/his/XList/XList_20250609161220.vue +0 -317
- package/.history/src/base-client/components/his/XList/XList_20250609161258.vue +0 -306
- package/.history/src/base-client/components/his/XList/XList_20250609161319.vue +0 -306
- package/.history/src/base-client/components/his/XList/XList_20250609161320.vue +0 -306
- package/.history/src/base-client/components/his/XList/XList_20250704142024.vue +0 -495
- package/.history/src/base-client/components/his/XList/XList_20250704142033.vue +0 -495
- package/.history/src/base-client/components/his/XList/XList_20250704142040.vue +0 -494
- package/.history/src/base-client/components/his/XList/XList_20250704142211.vue +0 -494
- package/.history/src/base-client/components/his/XList/XList_20250704142214.vue +0 -494
- package/.history/src/base-client/components/his/XList/XList_20250704143010.vue +0 -495
- package/.history/src/base-client/components/his/XList/XList_20250704143203.vue +0 -495
- package/.history/src/base-client/components/his/XList/XList_20250707095101.vue +0 -492
- package/.history/src/base-client/components/his/XList/XList_20250707100152.vue +0 -492
- package/.history/src/base-client/components/his/XList/XList_20250707100200.vue +0 -485
- package/.history/src/base-client/components/his/XList/XList_20250707100208.vue +0 -485
- package/.history/src/base-client/components/his/XList/XList_20250707100259.vue +0 -488
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134604.vue +0 -263
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134615.vue +0 -302
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134621.vue +0 -301
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134634.vue +0 -311
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134644.vue +0 -330
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134653.vue +0 -330
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134836.vue +0 -330
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135247.vue +0 -330
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135303.vue +0 -354
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135316.vue +0 -363
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135323.vue +0 -363
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135334.vue +0 -366
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135342.vue +0 -364
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135349.vue +0 -364
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135351.vue +0 -346
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135354.vue +0 -346
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135401.vue +0 -346
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135406.vue +0 -346
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135424.vue +0 -346
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807143043.vue +0 -254
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155506.vue +0 -329
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155535.vue +0 -330
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155543.vue +0 -330
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155926.vue +0 -304
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155928.vue +0 -304
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172548.vue +0 -298
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172609.vue +0 -298
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172623.vue +0 -298
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172631.vue +0 -298
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172701.vue +0 -298
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172704.vue +0 -298
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807175937.vue +0 -290
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807175942.vue +0 -290
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180210.vue +0 -290
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180424.vue +0 -290
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180448.vue +0 -290
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180915.vue +0 -262
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180917.vue +0 -262
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101106.vue +0 -283
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101112.vue +0 -289
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101118.vue +0 -289
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101129.vue +0 -294
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101137.vue +0 -318
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101145.vue +0 -320
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101154.vue +0 -320
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101211.vue +0 -320
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101236.vue +0 -320
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101239.vue +0 -320
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103845.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103852.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103857.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103859.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103907.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103910.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103911.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103913.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103916.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103931.vue +0 -142
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145127.vue +0 -85
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145136.vue +0 -81
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145142.vue +0 -81
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145145.vue +0 -81
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145148.vue +0 -81
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145151.vue +0 -81
- package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145155.vue +0 -81
- package/Users/objecrt/af-vue2-client/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +0 -213
- package/src/base-client/components/TreeList/TreeList.vue +0 -91
- package/src/base-client/components/TreeList/TreeNode.vue +0 -81
- package/src/base-client/components/common/XCardSet/XTiltle.vue +0 -191
- package/src/base-client/components/his/XHisEditor/dome.vue +0 -144
@@ -1,932 +1,932 @@
|
|
1
|
-
import Token from './Token'
|
2
|
-
import Expression from './Expression'
|
3
|
-
import Delegate from './Delegate'
|
4
|
-
import ExpressionType from '../enums/ExpressionType'
|
5
|
-
import TokenType from '../enums/TokenType'
|
6
|
-
|
7
|
-
/**
|
8
|
-
* 表达式入口
|
9
|
-
*/
|
10
|
-
export default class Program {
|
11
|
-
// 源程序
|
12
|
-
SOURCE
|
13
|
-
SOURCE_LENGTH
|
14
|
-
/**
|
15
|
-
* Token队列,用于回退
|
16
|
-
*/
|
17
|
-
tokens = []
|
18
|
-
/**
|
19
|
-
* 字符串处理环节堆栈,$进入字符串处理环节,“{}”中间部分脱离字符串处理环节
|
20
|
-
*/
|
21
|
-
inStrings = []
|
22
|
-
|
23
|
-
/**
|
24
|
-
* 当前获取到的字符位置
|
25
|
-
*/
|
26
|
-
pos = 0
|
27
|
-
|
28
|
-
/**
|
29
|
-
* 当前是否在字符串处理环节
|
30
|
-
*/
|
31
|
-
inString = false
|
32
|
-
|
33
|
-
constructor (source) {
|
34
|
-
this.SOURCE = source
|
35
|
-
this.SOURCE_LENGTH = this.SOURCE.length
|
36
|
-
}
|
37
|
-
|
38
|
-
/**
|
39
|
-
* 调用解析过程
|
40
|
-
*/
|
41
|
-
parse () {
|
42
|
-
// 执行完以下方法后就已经诞生了一个完整的执行流程,也就是被翻译成了一套完整的指令集。
|
43
|
-
return this.createDelegate(this.expression())
|
44
|
-
}
|
45
|
-
|
46
|
-
parseExpression (expression) {
|
47
|
-
// 执行完以下方法后就已经诞生了一个完整的执行流程,也就是被翻译成了一套完整的指令集。
|
48
|
-
return this.createDelegate(expression)
|
49
|
-
}
|
50
|
-
|
51
|
-
/**
|
52
|
-
* 编译,产生可执行单元Delegate
|
53
|
-
*/
|
54
|
-
createDelegate (expression) {
|
55
|
-
return new Delegate(expression, this.SOURCE)
|
56
|
-
}
|
57
|
-
|
58
|
-
/**
|
59
|
-
* 获取完整表达式
|
60
|
-
*/
|
61
|
-
expression () {
|
62
|
-
const expression = this.CommaExp()
|
63
|
-
if (this.pos < this.SOURCE_LENGTH) {
|
64
|
-
throw new Error(this.GetExceptionMessage('需要逗号结尾!'))
|
65
|
-
}
|
66
|
-
return expression
|
67
|
-
}
|
68
|
-
|
69
|
-
/**
|
70
|
-
* 逗号表达式=赋值表达式(,赋值表达式)*
|
71
|
-
*/
|
72
|
-
CommaExp () {
|
73
|
-
const exps = []
|
74
|
-
|
75
|
-
const first = this.AssignExp()
|
76
|
-
exps.push(first)
|
77
|
-
|
78
|
-
let t = this.GetToken()
|
79
|
-
|
80
|
-
// 没有结束
|
81
|
-
while (t.getType() === TokenType.Oper && (t.getValue() === ',' || t.getValue() === ';' || t.getValue() === '\n')) {
|
82
|
-
const r = this.AssignExp()
|
83
|
-
exps.push(r)
|
84
|
-
t = this.GetToken()
|
85
|
-
}
|
86
|
-
|
87
|
-
this.tokens.push(t)
|
88
|
-
|
89
|
-
return Expression.Comma(exps, this.pos)
|
90
|
-
}
|
91
|
-
|
92
|
-
/**
|
93
|
-
* 赋值表达式=对象属性=一般表达式|一般表达式
|
94
|
-
*/
|
95
|
-
AssignExp () {
|
96
|
-
let t = this.GetToken()
|
97
|
-
|
98
|
-
// 把第一个Token的位置记录下来,方便后面回退
|
99
|
-
const firstPos = t.getStartPos()
|
100
|
-
|
101
|
-
if (t.getType() !== TokenType.Identy) {
|
102
|
-
this.pos = firstPos
|
103
|
-
this.tokens.length = 0 // Clear the tokens array
|
104
|
-
this.inString = false
|
105
|
-
return this.Exp()
|
106
|
-
}
|
107
|
-
|
108
|
-
let objExp = Expression.Identity(t.getValue(), this.pos)
|
109
|
-
objExp = this.ObjectPath(objExp)
|
110
|
-
|
111
|
-
// 只能给对象属性或者变量赋值
|
112
|
-
if (objExp.type !== ExpressionType.Property && objExp.type !== ExpressionType.Identity) {
|
113
|
-
this.pos = firstPos
|
114
|
-
this.tokens.length = 0
|
115
|
-
this.inString = false
|
116
|
-
return this.Exp()
|
117
|
-
}
|
118
|
-
|
119
|
-
t = this.GetToken()
|
120
|
-
if (t.getType() !== TokenType.Oper || t.getValue() !== '=') {
|
121
|
-
this.pos = firstPos
|
122
|
-
this.tokens.length = 0
|
123
|
-
this.inString = false
|
124
|
-
return this.Exp()
|
125
|
-
}
|
126
|
-
|
127
|
-
const exp = this.Exp()
|
128
|
-
|
129
|
-
// 如果是属性赋值
|
130
|
-
if (objExp.type === ExpressionType.Property) {
|
131
|
-
// 从属性Expression中获取对象及属性名
|
132
|
-
const name = objExp.value
|
133
|
-
objExp = objExp.children[0]
|
134
|
-
return Expression.Assign(objExp, exp, name, this.pos)
|
135
|
-
} else {
|
136
|
-
// Identity 变量赋值
|
137
|
-
return Expression.Assign(null, exp, objExp.value, this.pos)
|
138
|
-
}
|
139
|
-
}
|
140
|
-
|
141
|
-
Exp () {
|
142
|
-
const v = this.Logic()
|
143
|
-
|
144
|
-
// 是':',表示条件,否则直接返回单结果
|
145
|
-
let t = this.GetToken()
|
146
|
-
if (t.getType() === TokenType.Oper && t.getValue() === ':') {
|
147
|
-
// 第一项转换
|
148
|
-
const result = this.Logic()
|
149
|
-
|
150
|
-
// 下一个是",",继续读取下一个条件结果串,由于是右结合,只能采用递归
|
151
|
-
t = this.GetToken()
|
152
|
-
if (t.getType() === TokenType.Oper && t.getValue() === ',') {
|
153
|
-
// 第二项转换
|
154
|
-
const sExp = this.Exp()
|
155
|
-
// 返回
|
156
|
-
return Expression.Condition(v, result, sExp, this.SOURCE, this.pos)
|
157
|
-
} else {
|
158
|
-
throw new Error(this.GetExceptionMessage('必须有默认值!'))
|
159
|
-
}
|
160
|
-
} else {
|
161
|
-
this.tokens.push(t) // Put the token back
|
162
|
-
return v
|
163
|
-
}
|
164
|
-
}
|
165
|
-
|
166
|
-
Logic () {
|
167
|
-
let t = this.GetToken()
|
168
|
-
|
169
|
-
// !表达式
|
170
|
-
const hasNot = t.getType() === TokenType.Oper && t.getValue() === '!'
|
171
|
-
if (!hasNot) {
|
172
|
-
this.tokens.push(t) // Put the token back if it's not '!'
|
173
|
-
}
|
174
|
-
|
175
|
-
let v = this.Compare()
|
176
|
-
if (hasNot) {
|
177
|
-
v = Expression.Not(v, this.SOURCE, this.pos)
|
178
|
-
}
|
179
|
-
|
180
|
-
t = this.GetToken()
|
181
|
-
while (t.getType() === TokenType.Oper && (t.getValue() === '&&' || t.getValue() === '||')) {
|
182
|
-
// 第二项转换
|
183
|
-
const exp = this.Logic()
|
184
|
-
|
185
|
-
// 执行
|
186
|
-
if (t.getValue() === '&&') {
|
187
|
-
v = Expression.And(v, exp, this.SOURCE, this.pos)
|
188
|
-
} else {
|
189
|
-
v = Expression.Or(v, exp, this.SOURCE, this.pos)
|
190
|
-
}
|
191
|
-
|
192
|
-
t = this.GetToken()
|
193
|
-
}
|
194
|
-
|
195
|
-
this.tokens.push(t) // Put the token back
|
196
|
-
return v
|
197
|
-
}
|
198
|
-
|
199
|
-
Compare () {
|
200
|
-
const left = this.Math()
|
201
|
-
const t = this.GetToken()
|
202
|
-
|
203
|
-
if (t.getType() === TokenType.Oper && (
|
204
|
-
t.getValue() === '>' || t.getValue() === '>=' ||
|
205
|
-
t.getValue() === '<' || t.getValue() === '<=' || t.getValue() === '=>')) {
|
206
|
-
if (t.getValue() === '=>') {
|
207
|
-
this.tokens.push(t) // Push back the token for lambda handling
|
208
|
-
return this.Lambda()
|
209
|
-
}
|
210
|
-
|
211
|
-
const rExp = this.Math()
|
212
|
-
|
213
|
-
switch (t.getValue()) {
|
214
|
-
case '>':
|
215
|
-
return Expression.GreaterThan(left, rExp, this.SOURCE, this.pos)
|
216
|
-
case '>=':
|
217
|
-
return Expression.GreaterThanOrEqual(left, rExp, this.SOURCE, this.pos)
|
218
|
-
case '<':
|
219
|
-
return Expression.LessThan(left, rExp, this.SOURCE, this.pos)
|
220
|
-
case '<=':
|
221
|
-
return Expression.LessThanOrEqual(left, rExp, this.SOURCE, this.pos)
|
222
|
-
}
|
223
|
-
} else if (t.getType() === TokenType.Oper && (
|
224
|
-
t.getValue() === '==' || t.getValue() === '!=')) {
|
225
|
-
const rExp = this.Math()
|
226
|
-
|
227
|
-
// 相等比较
|
228
|
-
if (t.getValue() === '==') {
|
229
|
-
return Expression.Equal(left, rExp, this.SOURCE, this.pos)
|
230
|
-
} else {
|
231
|
-
return Expression.NotEqual(left, rExp, this.SOURCE, this.pos)
|
232
|
-
}
|
233
|
-
}
|
234
|
-
|
235
|
-
// 返回当前的表达式结果
|
236
|
-
this.tokens.push(t) // Push the token back
|
237
|
-
return left
|
238
|
-
}
|
239
|
-
|
240
|
-
Math () {
|
241
|
-
let v = this.Mul()
|
242
|
-
let t = this.GetToken()
|
243
|
-
|
244
|
-
while (t.getType() === TokenType.Oper && (t.getValue() === '+' || t.getValue() === '-')) {
|
245
|
-
// 转换操作数2为数字
|
246
|
-
const r = this.Mul()
|
247
|
-
|
248
|
-
// 开始运算
|
249
|
-
if (t.getValue() === '+') {
|
250
|
-
v = Expression.Add(v, r, this.SOURCE, this.pos)
|
251
|
-
} else {
|
252
|
-
v = Expression.Subtract(v, r, this.SOURCE, this.pos)
|
253
|
-
}
|
254
|
-
|
255
|
-
t = this.GetToken()
|
256
|
-
}
|
257
|
-
|
258
|
-
this.tokens.push(t) // Push the token back
|
259
|
-
return v
|
260
|
-
}
|
261
|
-
|
262
|
-
Lambda () {
|
263
|
-
let t = this.GetToken()
|
264
|
-
if (t.getValue() !== '=>' || t.getValue() == null) {
|
265
|
-
throw new Error(this.GetExceptionMessage('lambda必须以=>开始'))
|
266
|
-
}
|
267
|
-
|
268
|
-
t = this.GetToken()
|
269
|
-
if (t.getValue() !== '{' || t.getValue() == null) {
|
270
|
-
throw new Error(this.GetExceptionMessage('lambda必须以{开始'))
|
271
|
-
}
|
272
|
-
|
273
|
-
// 取lambda中的表达式
|
274
|
-
const exp = this.CommaExp()
|
275
|
-
|
276
|
-
t = this.GetToken()
|
277
|
-
if (t.getValue() !== '}' || t.getValue() == null) {
|
278
|
-
throw new Error(this.GetExceptionMessage('lambda必须以}结束'))
|
279
|
-
}
|
280
|
-
|
281
|
-
return Expression.Lambda(exp, this.pos)
|
282
|
-
}
|
283
|
-
|
284
|
-
Mul () {
|
285
|
-
let v = this.UnarySub()
|
286
|
-
let t = this.GetToken()
|
287
|
-
|
288
|
-
while (t.getType() === TokenType.Oper && (t.getValue() === '*' || t.getValue() === '/' || t.getValue() === '%')) {
|
289
|
-
// Convert the second operand to a number
|
290
|
-
const r = this.UnarySub()
|
291
|
-
|
292
|
-
// Perform the operation
|
293
|
-
if (t.getValue() === '*') {
|
294
|
-
v = Expression.Multiply(v, r, this.SOURCE, this.pos)
|
295
|
-
} else if (t.getValue() === '/') {
|
296
|
-
v = Expression.Divide(v, r, this.SOURCE, this.pos)
|
297
|
-
} else {
|
298
|
-
v = Expression.Modulo(v, r, this.SOURCE, this.pos)
|
299
|
-
}
|
300
|
-
|
301
|
-
t = this.GetToken()
|
302
|
-
}
|
303
|
-
|
304
|
-
this.tokens.push(t)
|
305
|
-
return v
|
306
|
-
}
|
307
|
-
|
308
|
-
UnarySub () {
|
309
|
-
const t = this.GetToken()
|
310
|
-
if (t.getType() === TokenType.Oper && t.getValue() === '-') {
|
311
|
-
const r = this.Item()
|
312
|
-
return Expression.Subtract(Expression.Constant(0, this.pos), r, this.SOURCE, this.pos)
|
313
|
-
}
|
314
|
-
this.tokens.push(t) // Push the token back into the queue
|
315
|
-
return this.Item()
|
316
|
-
}
|
317
|
-
|
318
|
-
Item () {
|
319
|
-
const objName = ''
|
320
|
-
// 获取对象表达式
|
321
|
-
let objExp = this.ItemHead(objName)
|
322
|
-
// 获取对象路径表达式
|
323
|
-
objExp = this.ObjectPath(objExp)
|
324
|
-
return objExp
|
325
|
-
}
|
326
|
-
|
327
|
-
ItemHead (name) {
|
328
|
-
let t = this.GetToken()
|
329
|
-
|
330
|
-
if (t.getType() === TokenType.Oper && t.getValue() === '(') {
|
331
|
-
const result = this.CommaExp()
|
332
|
-
t = this.GetToken()
|
333
|
-
if (t.getType() !== TokenType.Oper || t.getValue() !== ')') {
|
334
|
-
throw new Error(this.GetExceptionMessage('括号不匹配'))
|
335
|
-
}
|
336
|
-
return result
|
337
|
-
} else if (t.getType() === TokenType.Oper && t.getValue() === '{') {
|
338
|
-
// JSON object
|
339
|
-
return this.Json()
|
340
|
-
} else if (t.getType() === TokenType.Oper && t.getValue() === '[') {
|
341
|
-
// JSON array
|
342
|
-
return this.JsonArray()
|
343
|
-
} else if (t.getType() === TokenType.Oper && (t.getValue() === '$' || t.getValue() === '"')) {
|
344
|
-
// String concatenation sequence
|
345
|
-
return this.StringUnion()
|
346
|
-
} else if (t.getType() === TokenType.Int || t.getType() === TokenType.Double || t.getType() === TokenType.Bool) {
|
347
|
-
return Expression.Constant(t.getValue(), this.pos)
|
348
|
-
} else if (t.getType() === TokenType.Identy) {
|
349
|
-
const objName = t.getValue()
|
350
|
-
|
351
|
-
switch (objName) {
|
352
|
-
case 'return':
|
353
|
-
return Expression.Return(this.Exp(), this.pos)
|
354
|
-
case 'try':
|
355
|
-
this.tokens.push(t) // Revert the token back to the queue
|
356
|
-
return this.Try()
|
357
|
-
case 'throw':
|
358
|
-
return Expression.Throw(this.Exp(), this.pos)
|
359
|
-
case 'validate':
|
360
|
-
return this.Validate()
|
361
|
-
case 'assert':
|
362
|
-
return Expression.Assert(this.Exp(), this.pos)
|
363
|
-
case 'break':
|
364
|
-
return Expression.Break(this.pos, undefined)
|
365
|
-
case 'continue':
|
366
|
-
return Expression.Continue(this.pos, undefined)
|
367
|
-
}
|
368
|
-
|
369
|
-
// Return the object name
|
370
|
-
name += objName
|
371
|
-
// Process the object name
|
372
|
-
return this.ObjectName(objName)
|
373
|
-
} else if (t.getType() === TokenType.Null) {
|
374
|
-
return Expression.Constant(null, this.pos)
|
375
|
-
}
|
376
|
-
|
377
|
-
throw new Error(this.GetExceptionMessage('单词类型错误:' + t.getType()))
|
378
|
-
}
|
379
|
-
|
380
|
-
/**
|
381
|
-
* TryCatch := try {expression} (catch(Exception类 名){表达式})* finally{表达式}?
|
382
|
-
*/
|
383
|
-
Try () {
|
384
|
-
let t = this.GetToken()
|
385
|
-
if (t.getValue() !== 'try') {
|
386
|
-
throw new Error(this.GetExceptionMessage('try-catch必须以try开始'))
|
387
|
-
}
|
388
|
-
|
389
|
-
t = this.GetToken()
|
390
|
-
if (t.getValue() !== '{') {
|
391
|
-
throw new Error(this.GetExceptionMessage('try块必须以{开始'))
|
392
|
-
}
|
393
|
-
|
394
|
-
// Get the expression inside the try block
|
395
|
-
const tryExp = this.CommaExp()
|
396
|
-
|
397
|
-
t = this.GetToken()
|
398
|
-
if (t.getValue() !== '}') {
|
399
|
-
throw new Error(this.GetExceptionMessage('try块必须以}结束'))
|
400
|
-
}
|
401
|
-
|
402
|
-
// Handle the catch part
|
403
|
-
const catches = this.Catch()
|
404
|
-
|
405
|
-
// Handle finally
|
406
|
-
let finallyExp
|
407
|
-
t = this.GetToken()
|
408
|
-
if (t.getValue()) {
|
409
|
-
if (t.getValue() === 'finally') {
|
410
|
-
t = this.GetToken()
|
411
|
-
if (t.getValue() !== '{') {
|
412
|
-
throw new Error(this.GetExceptionMessage('finally块必须以{开始'))
|
413
|
-
}
|
414
|
-
|
415
|
-
// Get the expression inside the finally block
|
416
|
-
finallyExp = this.CommaExp()
|
417
|
-
t = this.GetToken()
|
418
|
-
if (t.getValue() !== '}') {
|
419
|
-
throw new Error(this.GetExceptionMessage('finally块必须以}结束'))
|
420
|
-
}
|
421
|
-
t = this.GetToken()
|
422
|
-
}
|
423
|
-
}
|
424
|
-
|
425
|
-
this.tokens.push(t)
|
426
|
-
|
427
|
-
// Return the exception handling expression
|
428
|
-
return Expression.Try(tryExp, catches, this.pos, finallyExp)
|
429
|
-
}
|
430
|
-
|
431
|
-
/**
|
432
|
-
* catch部分处理
|
433
|
-
*/
|
434
|
-
Catch () {
|
435
|
-
const result = []
|
436
|
-
let t = this.GetToken()
|
437
|
-
|
438
|
-
while (t.getValue() === 'catch') {
|
439
|
-
t = this.GetToken()
|
440
|
-
if (t.getValue() !== '(') {
|
441
|
-
throw new Error(this.GetExceptionMessage('catch块参数必须以(开始'))
|
442
|
-
}
|
443
|
-
|
444
|
-
// Get the class name
|
445
|
-
t = this.GetToken()
|
446
|
-
const className = t.getValue()
|
447
|
-
|
448
|
-
// Get the variable name
|
449
|
-
t = this.GetToken()
|
450
|
-
const varName = t.getValue()
|
451
|
-
|
452
|
-
t = this.GetToken()
|
453
|
-
if (t.getValue() !== ')') {
|
454
|
-
throw new Error(this.GetExceptionMessage('catch块参数必须以)结束'))
|
455
|
-
}
|
456
|
-
|
457
|
-
// Get the opening curly brace
|
458
|
-
t = this.GetToken()
|
459
|
-
if (t.getValue() !== '{') {
|
460
|
-
throw new Error(this.GetExceptionMessage('catch块必须以{开始'))
|
461
|
-
}
|
462
|
-
|
463
|
-
// Get the expression inside the catch block
|
464
|
-
const catchExp = this.CommaExp()
|
465
|
-
result.push(Expression.Catch(className, varName, catchExp, this.pos))
|
466
|
-
|
467
|
-
// Get the closing curly brace
|
468
|
-
t = this.GetToken()
|
469
|
-
if (t.getValue() !== '}') {
|
470
|
-
throw new Error(this.GetExceptionMessage('catch块必须以}结束'))
|
471
|
-
}
|
472
|
-
|
473
|
-
// Get the next token
|
474
|
-
t = this.GetToken()
|
475
|
-
}
|
476
|
-
|
477
|
-
this.tokens.push(t)
|
478
|
-
return result
|
479
|
-
}
|
480
|
-
|
481
|
-
/**
|
482
|
-
* Validate block handling
|
483
|
-
*/
|
484
|
-
Validate () {
|
485
|
-
const t = this.GetToken()
|
486
|
-
if (t.getValue() !== '{') {
|
487
|
-
throw new Error(this.GetExceptionMessage('validate只接收Json对象'))
|
488
|
-
}
|
489
|
-
|
490
|
-
// Get the expression in the validate block
|
491
|
-
const exp = this.Json()
|
492
|
-
|
493
|
-
// Return Validate processing expression
|
494
|
-
return Expression.Validate(exp, this.pos)
|
495
|
-
}
|
496
|
-
|
497
|
-
/**
|
498
|
-
* JSON Object ::= {} | {propertyName: propertyValue, propertyName: propertyValue}
|
499
|
-
*/
|
500
|
-
Json () {
|
501
|
-
const children = []
|
502
|
-
|
503
|
-
let t = this.GetToken()
|
504
|
-
// Empty object, return directly
|
505
|
-
if (t.getType() === TokenType.Oper && t.getValue() === '}') {
|
506
|
-
return Expression.Json(children, this.pos)
|
507
|
-
}
|
508
|
-
|
509
|
-
this.tokens.push(t)
|
510
|
-
children.push(this.Attr())
|
511
|
-
t = this.GetToken()
|
512
|
-
|
513
|
-
// If it's a comma, continue checking the next property
|
514
|
-
while (t.getType() === TokenType.Oper && t.getValue() === ',') {
|
515
|
-
const nextT = this.GetToken()
|
516
|
-
if (nextT.getType() === TokenType.Oper && nextT.getValue() === '}') {
|
517
|
-
t = nextT
|
518
|
-
break
|
519
|
-
}
|
520
|
-
this.tokens.push(nextT)
|
521
|
-
children.push(this.Attr())
|
522
|
-
t = this.GetToken()
|
523
|
-
}
|
524
|
-
|
525
|
-
if (t.getType() !== TokenType.Oper || t.getValue() !== '}') {
|
526
|
-
throw new Error(this.GetExceptionMessage('JSON对象构建错误'))
|
527
|
-
}
|
528
|
-
|
529
|
-
return Expression.Json(children, this.pos)
|
530
|
-
}
|
531
|
-
|
532
|
-
/**
|
533
|
-
* JSON Array ::= []
|
534
|
-
*/
|
535
|
-
JsonArray () {
|
536
|
-
let t = this.GetToken()
|
537
|
-
// Empty array, return directly
|
538
|
-
if (t.getType() === TokenType.Oper && t.getValue() === ']') {
|
539
|
-
// Return JSON array constant
|
540
|
-
return Expression.Constant([], this.pos)
|
541
|
-
}
|
542
|
-
|
543
|
-
// Loop to get array contents
|
544
|
-
this.tokens.push(t)
|
545
|
-
const ps = this.Params()
|
546
|
-
t = this.GetToken()
|
547
|
-
if (t.getType() !== TokenType.Oper || t.getValue() !== ']') {
|
548
|
-
throw new Error(this.GetExceptionMessage('JSON集合构建错误'))
|
549
|
-
}
|
550
|
-
|
551
|
-
return Expression.Array(ps, this.pos)
|
552
|
-
}
|
553
|
-
|
554
|
-
/**
|
555
|
-
* Attribute-Value Pair ::= propertyName: propertyValue
|
556
|
-
*/
|
557
|
-
Attr () {
|
558
|
-
const name = this.GetToken()
|
559
|
-
let value
|
560
|
-
if (name.getType() === TokenType.Identy) {
|
561
|
-
value = name.getValue()
|
562
|
-
} else if (name.getType() === TokenType.Oper && (name.getValue() === '$' || name.getValue() === '"')) {
|
563
|
-
const expression = this.StringUnion().children[1]
|
564
|
-
value = expression.value
|
565
|
-
} else {
|
566
|
-
throw new Error(this.GetExceptionMessage('JSON对象的key必须是属性名或字符串'))
|
567
|
-
}
|
568
|
-
|
569
|
-
const t = this.GetToken()
|
570
|
-
if (t.getType() !== TokenType.Oper || t.getValue() !== ':') {
|
571
|
-
throw new Error(this.GetExceptionMessage('JSON构建错误'))
|
572
|
-
}
|
573
|
-
|
574
|
-
const exp = this.Exp()
|
575
|
-
return Expression.Attr(value, exp, this.pos)
|
576
|
-
}
|
577
|
-
|
578
|
-
/**
|
579
|
-
* Parse string concatenation sequence
|
580
|
-
*/
|
581
|
-
StringUnion () {
|
582
|
-
let exp = Expression.Constant('', this.pos)
|
583
|
-
let t = this.GetToken()
|
584
|
-
// Object sequence
|
585
|
-
while ((t.getType() === TokenType.Oper && t.getValue() === '{') || t.getType() === TokenType.String) {
|
586
|
-
// If it's a string, return the concatenated result
|
587
|
-
if (t.getType() === TokenType.String) {
|
588
|
-
exp = Expression.Concat(exp, Expression.Constant(t.getValue(), this.pos), this.SOURCE, this.pos)
|
589
|
-
} else {
|
590
|
-
// Handle content inside the {}
|
591
|
-
const objExp = this.Exp()
|
592
|
-
t = this.GetToken()
|
593
|
-
if (t.getType() !== TokenType.Oper || t.getValue() !== '}') {
|
594
|
-
throw new Error(this.GetExceptionMessage("缺少'}'"))
|
595
|
-
}
|
596
|
-
// String concatenation
|
597
|
-
exp = Expression.Concat(exp, objExp, this.SOURCE, this.pos)
|
598
|
-
}
|
599
|
-
t = this.GetToken()
|
600
|
-
}
|
601
|
-
this.tokens.push(t)
|
602
|
-
return exp
|
603
|
-
}
|
604
|
-
|
605
|
-
/**
|
606
|
-
* Get object and object expression by name
|
607
|
-
*/
|
608
|
-
ObjectName (objName) {
|
609
|
-
return Expression.Identity(objName, this.pos)
|
610
|
-
}
|
611
|
-
|
612
|
-
/**
|
613
|
-
* Object path parsing, handles method calls, properties, and array indices
|
614
|
-
*/
|
615
|
-
ObjectPath (inExp) {
|
616
|
-
let objExp = this.ArrayIndex(inExp)
|
617
|
-
let t = this.GetToken()
|
618
|
-
while (t.getType() === TokenType.Oper && t.getValue() === '.') {
|
619
|
-
const nameToken = this.GetToken()
|
620
|
-
const n = this.GetToken()
|
621
|
-
if (n.getType() === TokenType.Oper && n.getValue() === '(') {
|
622
|
-
const name = nameToken.getValue()
|
623
|
-
if (name === 'each') {
|
624
|
-
objExp = this.For(objExp)
|
625
|
-
} else {
|
626
|
-
objExp = this.MethodCall(name, objExp)
|
627
|
-
}
|
628
|
-
} else {
|
629
|
-
this.tokens.push(n)
|
630
|
-
const pi = nameToken.getValue()
|
631
|
-
objExp = Expression.Property(objExp, pi, this.pos)
|
632
|
-
objExp = this.ArrayIndex(objExp)
|
633
|
-
}
|
634
|
-
t = this.GetToken()
|
635
|
-
}
|
636
|
-
this.tokens.push(t)
|
637
|
-
|
638
|
-
return objExp
|
639
|
-
}
|
640
|
-
|
641
|
-
/**
|
642
|
-
* Array index parsing with optional condition
|
643
|
-
*/
|
644
|
-
ArrayIndex (objExp) {
|
645
|
-
let n = this.GetToken()
|
646
|
-
if (n.getType() === TokenType.Oper && n.getValue() === '[') {
|
647
|
-
const exp = this.Exp()
|
648
|
-
n = this.GetToken()
|
649
|
-
if (n.getType() !== TokenType.Oper || n.getValue() !== ']') {
|
650
|
-
throw new Error(this.GetExceptionMessage("缺少']'"))
|
651
|
-
}
|
652
|
-
return Expression.ArrayIndex(objExp, exp, this.SOURCE, this.pos)
|
653
|
-
}
|
654
|
-
this.tokens.push(n)
|
655
|
-
return objExp
|
656
|
-
}
|
657
|
-
|
658
|
-
/**
|
659
|
-
* For loop handling
|
660
|
-
*/
|
661
|
-
For (obj) {
|
662
|
-
const exp = this.CommaExp()
|
663
|
-
const t = this.GetToken()
|
664
|
-
if (t.getType() !== TokenType.Oper || t.getValue() !== ')') {
|
665
|
-
throw new Error(this.GetExceptionMessage('函数调用括号不匹配'))
|
666
|
-
}
|
667
|
-
return Expression.For(obj, exp, this.SOURCE, this.pos)
|
668
|
-
}
|
669
|
-
|
670
|
-
/**
|
671
|
-
* Method call handling with parameters
|
672
|
-
*/
|
673
|
-
MethodCall (name, obj) {
|
674
|
-
let t = this.GetToken()
|
675
|
-
if (t.getType() === TokenType.Oper && t.getValue() === ')') {
|
676
|
-
const ps = []
|
677
|
-
return Expression.Call(obj, name, ps, this.pos)
|
678
|
-
}
|
679
|
-
|
680
|
-
this.tokens.push(t)
|
681
|
-
const ps = this.Params()
|
682
|
-
t = this.GetToken()
|
683
|
-
if (t.getType() !== TokenType.Oper || t.getValue() !== ')') {
|
684
|
-
throw new Error(this.GetExceptionMessage('函数调用括号不匹配'))
|
685
|
-
}
|
686
|
-
|
687
|
-
return Expression.Call(obj, name, ps, this.pos)
|
688
|
-
}
|
689
|
-
|
690
|
-
/**
|
691
|
-
* Function parameter list handling
|
692
|
-
*/
|
693
|
-
Params () {
|
694
|
-
const ps = []
|
695
|
-
let name = this.paramName()
|
696
|
-
let exp = this.Exp()
|
697
|
-
this.procParam(ps, exp, name)
|
698
|
-
let t = this.GetToken()
|
699
|
-
while (t.getType() === TokenType.Oper && t.getValue() === ',') {
|
700
|
-
name = this.paramName()
|
701
|
-
exp = this.Exp()
|
702
|
-
this.procParam(ps, exp, name)
|
703
|
-
t = this.GetToken()
|
704
|
-
}
|
705
|
-
this.tokens.push(t)
|
706
|
-
return ps
|
707
|
-
}
|
708
|
-
|
709
|
-
/**
|
710
|
-
* Parse parameter name
|
711
|
-
*/
|
712
|
-
paramName () {
|
713
|
-
const t = this.GetToken()
|
714
|
-
if (t.getType() === TokenType.Identy) {
|
715
|
-
const t1 = this.GetToken()
|
716
|
-
if (t1.getValue() === ':') {
|
717
|
-
return t.getValue()
|
718
|
-
} else {
|
719
|
-
this.tokens.push(t)
|
720
|
-
this.tokens.push(t1)
|
721
|
-
return ''
|
722
|
-
}
|
723
|
-
} else {
|
724
|
-
this.tokens.push(t)
|
725
|
-
return ''
|
726
|
-
}
|
727
|
-
}
|
728
|
-
|
729
|
-
/**
|
730
|
-
* Process parameters, especially if it contains the "data" object
|
731
|
-
*/
|
732
|
-
procParam (ps, exp, name) {
|
733
|
-
const delegate = this.createDelegate(exp)
|
734
|
-
if (delegate.containsKey('data')) {
|
735
|
-
ps.push(Expression.Constant(delegate, this.pos))
|
736
|
-
} else {
|
737
|
-
ps.push(Expression.Param(exp, name, this.pos))
|
738
|
-
}
|
739
|
-
}
|
740
|
-
|
741
|
-
/**
|
742
|
-
* Get exception message with position information
|
743
|
-
*/
|
744
|
-
GetExceptionMessage (msg) {
|
745
|
-
const result = this.SOURCE.substring(0, this.pos) + ' <- ' + this.SOURCE.substring(this.pos)
|
746
|
-
return `${msg}:\n${result}`
|
747
|
-
}
|
748
|
-
|
749
|
-
GetToken () {
|
750
|
-
// If there are tokens in the queue, return the last one saved
|
751
|
-
if (this.tokens.length > 0) {
|
752
|
-
return this.tokens.shift()
|
753
|
-
}
|
754
|
-
|
755
|
-
const sPos = this.pos
|
756
|
-
let hasKeyword = this.pos < this.SOURCE_LENGTH
|
757
|
-
let value = null
|
758
|
-
|
759
|
-
if (hasKeyword) {
|
760
|
-
value = this.SOURCE.charAt(this.pos)
|
761
|
-
}
|
762
|
-
|
763
|
-
// If it's '{', save the previous state and change to non-string state
|
764
|
-
if (hasKeyword && value === '{') {
|
765
|
-
this.inStrings.push(this.inString)
|
766
|
-
this.inString = false
|
767
|
-
const str = this.SOURCE.substring(this.pos, this.pos + 1)
|
768
|
-
this.pos += 1
|
769
|
-
return new Token(TokenType.Oper, str, sPos)
|
770
|
-
}
|
771
|
-
|
772
|
-
// If in string state, process the string
|
773
|
-
if (this.inString) {
|
774
|
-
const startPos = this.pos
|
775
|
-
while (hasKeyword && value !== '{' && value !== '}' && value !== '$' && value !== '\"') {
|
776
|
-
if (value === '\\') {
|
777
|
-
const nextStrValue = this.SOURCE.charAt(this.pos + 1)
|
778
|
-
if (this.pos + 1 < this.SOURCE_LENGTH && ['{', '}', '\"', '$', '\\'].includes(nextStrValue)) {
|
779
|
-
this.pos++
|
780
|
-
} else {
|
781
|
-
break
|
782
|
-
}
|
783
|
-
}
|
784
|
-
this.pos++
|
785
|
-
if (this.pos < this.SOURCE_LENGTH) {
|
786
|
-
value = this.SOURCE.charAt(this.pos)
|
787
|
-
} else {
|
788
|
-
hasKeyword = false
|
789
|
-
}
|
790
|
-
}
|
791
|
-
if (!(hasKeyword && value === '{')) {
|
792
|
-
this.inString = this.inStrings.pop()
|
793
|
-
}
|
794
|
-
const t = new Token(TokenType.String, this.SOURCE.substring(startPos, this.pos)
|
795
|
-
.replace('\\$', '$')
|
796
|
-
.replace('\\{', '{')
|
797
|
-
.replace('\\}', '}')
|
798
|
-
.replace(/\\"/g, '"')
|
799
|
-
.replace('\\\\', '\\'), sPos)
|
800
|
-
|
801
|
-
if (hasKeyword && (value === '$' || value === '\"')) {
|
802
|
-
this.pos++
|
803
|
-
}
|
804
|
-
return t
|
805
|
-
}
|
806
|
-
|
807
|
-
// Skip whitespace and comments
|
808
|
-
while (hasKeyword && (value === ' ' || value === '\n' || value === '\t' || (this.pos < this.SOURCE_LENGTH - 2 && value === '/' && this.SOURCE.charAt(this.pos + 1) === '/'))) {
|
809
|
-
if (value !== ' ' && value !== '\n' && value !== '\t') {
|
810
|
-
this.pos += 2
|
811
|
-
if (this.pos < this.SOURCE_LENGTH) {
|
812
|
-
value = this.SOURCE.charAt(this.pos)
|
813
|
-
} else {
|
814
|
-
hasKeyword = false
|
815
|
-
}
|
816
|
-
while (hasKeyword && value !== '\n') {
|
817
|
-
this.pos++
|
818
|
-
if (this.pos < this.SOURCE_LENGTH) {
|
819
|
-
value = this.SOURCE.charAt(this.pos)
|
820
|
-
} else {
|
821
|
-
hasKeyword = false
|
822
|
-
}
|
823
|
-
}
|
824
|
-
}
|
825
|
-
this.pos++
|
826
|
-
if (this.pos < this.SOURCE_LENGTH) {
|
827
|
-
value = this.SOURCE.charAt(this.pos)
|
828
|
-
} else {
|
829
|
-
hasKeyword = false
|
830
|
-
}
|
831
|
-
}
|
832
|
-
|
833
|
-
// If we are at the end of the source, return an "End" token
|
834
|
-
if (this.pos === this.SOURCE_LENGTH) {
|
835
|
-
return new Token(TokenType.End, null, sPos)
|
836
|
-
}
|
837
|
-
|
838
|
-
if (value !== null) {
|
839
|
-
// Handle number tokens
|
840
|
-
if (value >= '0' && value <= '9') {
|
841
|
-
const oldPos = this.pos
|
842
|
-
while (hasKeyword && value >= '0' && value <= '9') {
|
843
|
-
this.pos++
|
844
|
-
if (this.pos < this.SOURCE_LENGTH) {
|
845
|
-
value = this.SOURCE.charAt(this.pos)
|
846
|
-
} else {
|
847
|
-
hasKeyword = false
|
848
|
-
}
|
849
|
-
}
|
850
|
-
|
851
|
-
if (hasKeyword && value === '.') {
|
852
|
-
do {
|
853
|
-
this.pos++
|
854
|
-
if (this.pos < this.SOURCE_LENGTH) {
|
855
|
-
value = this.SOURCE.charAt(this.pos)
|
856
|
-
} else {
|
857
|
-
hasKeyword = false
|
858
|
-
}
|
859
|
-
} while (hasKeyword && value >= '0' && value <= '9')
|
860
|
-
const str = this.SOURCE.substring(oldPos, this.pos)
|
861
|
-
return new Token(TokenType.Double, parseFloat(str), sPos)
|
862
|
-
} else {
|
863
|
-
const str = this.SOURCE.substring(oldPos, this.pos)
|
864
|
-
return new Token(TokenType.Int, parseInt(str, 10), sPos)
|
865
|
-
}
|
866
|
-
} else if ((value >= 'a' && value <= 'z') || (value >= 'A' && value <= 'Z') || value === '_' || /[\u4e00-\u9fa5]/.test(value)) {
|
867
|
-
const oldPos = this.pos
|
868
|
-
while (hasKeyword && ((value >= 'a' && value <= 'z') || (value >= 'A' && value <= 'Z') || (value >= '0' && value <= '9') || value === '_' || /[\u4e00-\u9fa5]/.test(value))) {
|
869
|
-
this.pos++
|
870
|
-
if (this.pos < this.SOURCE_LENGTH) {
|
871
|
-
value = this.SOURCE.charAt(this.pos)
|
872
|
-
} else {
|
873
|
-
hasKeyword = false
|
874
|
-
}
|
875
|
-
}
|
876
|
-
const str = this.SOURCE.substring(oldPos, this.pos)
|
877
|
-
switch (str) {
|
878
|
-
case 'false':
|
879
|
-
case 'true':
|
880
|
-
return new Token(TokenType.Bool, Boolean(str), sPos)
|
881
|
-
case 'null':
|
882
|
-
return new Token(TokenType.Null, null, sPos)
|
883
|
-
default:
|
884
|
-
return new Token(TokenType.Identy, str, sPos)
|
885
|
-
}
|
886
|
-
} else if ((value === '&' && this.SOURCE.charAt(this.pos + 1) === '&') || (value === '|' && this.SOURCE.charAt(this.pos + 1) === '|')) {
|
887
|
-
const str = this.SOURCE.substring(this.pos, this.pos + 2)
|
888
|
-
this.pos += 2
|
889
|
-
return new Token(TokenType.Oper, str, sPos)
|
890
|
-
} else if (['+', '-', '*', '/', '%', '>', '<', '!'].includes(value)) {
|
891
|
-
let str = ''
|
892
|
-
if (this.SOURCE.charAt(this.pos + 1) === '=') {
|
893
|
-
str = this.SOURCE.substring(this.pos, this.pos + 2)
|
894
|
-
this.pos += 2
|
895
|
-
} else {
|
896
|
-
str = this.SOURCE.substring(this.pos, this.pos + 1)
|
897
|
-
this.pos += 1
|
898
|
-
}
|
899
|
-
return new Token(TokenType.Oper, str, sPos)
|
900
|
-
} else if (value === '=') {
|
901
|
-
let str
|
902
|
-
if (this.SOURCE.charAt(this.pos + 1) === '=' || this.SOURCE.charAt(this.pos + 1) === '>') {
|
903
|
-
str = this.SOURCE.substring(this.pos, this.pos + 2)
|
904
|
-
this.pos += 2
|
905
|
-
} else {
|
906
|
-
str = this.SOURCE.substring(this.pos, this.pos + 1)
|
907
|
-
this.pos += 1
|
908
|
-
}
|
909
|
-
return new Token(TokenType.Oper, str, sPos)
|
910
|
-
} else if ('()[],;.:@{}"$'.includes(value)) {
|
911
|
-
if (value === '$' || value === '\"') {
|
912
|
-
this.inStrings.push(false)
|
913
|
-
this.inString = true
|
914
|
-
} else if ((value === '{' || value === '}') && this.inStrings.length) {
|
915
|
-
if (value === '{') {
|
916
|
-
this.inStrings.push(false)
|
917
|
-
this.inString = false
|
918
|
-
} else {
|
919
|
-
this.inString = this.inStrings.pop()
|
920
|
-
}
|
921
|
-
}
|
922
|
-
const str = this.SOURCE.substring(this.pos, this.pos + 1)
|
923
|
-
this.pos += 1
|
924
|
-
return new Token(TokenType.Oper, str, sPos)
|
925
|
-
} else {
|
926
|
-
throw new Error(`Invalid token: '${value}'`)
|
927
|
-
}
|
928
|
-
}
|
929
|
-
|
930
|
-
throw new Error('Unknown error while parsing.')
|
931
|
-
}
|
932
|
-
}
|
1
|
+
import Token from './Token'
|
2
|
+
import Expression from './Expression'
|
3
|
+
import Delegate from './Delegate'
|
4
|
+
import ExpressionType from '../enums/ExpressionType'
|
5
|
+
import TokenType from '../enums/TokenType'
|
6
|
+
|
7
|
+
/**
|
8
|
+
* 表达式入口
|
9
|
+
*/
|
10
|
+
export default class Program {
|
11
|
+
// 源程序
|
12
|
+
SOURCE
|
13
|
+
SOURCE_LENGTH
|
14
|
+
/**
|
15
|
+
* Token队列,用于回退
|
16
|
+
*/
|
17
|
+
tokens = []
|
18
|
+
/**
|
19
|
+
* 字符串处理环节堆栈,$进入字符串处理环节,“{}”中间部分脱离字符串处理环节
|
20
|
+
*/
|
21
|
+
inStrings = []
|
22
|
+
|
23
|
+
/**
|
24
|
+
* 当前获取到的字符位置
|
25
|
+
*/
|
26
|
+
pos = 0
|
27
|
+
|
28
|
+
/**
|
29
|
+
* 当前是否在字符串处理环节
|
30
|
+
*/
|
31
|
+
inString = false
|
32
|
+
|
33
|
+
constructor (source) {
|
34
|
+
this.SOURCE = source
|
35
|
+
this.SOURCE_LENGTH = this.SOURCE.length
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* 调用解析过程
|
40
|
+
*/
|
41
|
+
parse () {
|
42
|
+
// 执行完以下方法后就已经诞生了一个完整的执行流程,也就是被翻译成了一套完整的指令集。
|
43
|
+
return this.createDelegate(this.expression())
|
44
|
+
}
|
45
|
+
|
46
|
+
parseExpression (expression) {
|
47
|
+
// 执行完以下方法后就已经诞生了一个完整的执行流程,也就是被翻译成了一套完整的指令集。
|
48
|
+
return this.createDelegate(expression)
|
49
|
+
}
|
50
|
+
|
51
|
+
/**
|
52
|
+
* 编译,产生可执行单元Delegate
|
53
|
+
*/
|
54
|
+
createDelegate (expression) {
|
55
|
+
return new Delegate(expression, this.SOURCE)
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* 获取完整表达式
|
60
|
+
*/
|
61
|
+
expression () {
|
62
|
+
const expression = this.CommaExp()
|
63
|
+
if (this.pos < this.SOURCE_LENGTH) {
|
64
|
+
throw new Error(this.GetExceptionMessage('需要逗号结尾!'))
|
65
|
+
}
|
66
|
+
return expression
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* 逗号表达式=赋值表达式(,赋值表达式)*
|
71
|
+
*/
|
72
|
+
CommaExp () {
|
73
|
+
const exps = []
|
74
|
+
|
75
|
+
const first = this.AssignExp()
|
76
|
+
exps.push(first)
|
77
|
+
|
78
|
+
let t = this.GetToken()
|
79
|
+
|
80
|
+
// 没有结束
|
81
|
+
while (t.getType() === TokenType.Oper && (t.getValue() === ',' || t.getValue() === ';' || t.getValue() === '\n')) {
|
82
|
+
const r = this.AssignExp()
|
83
|
+
exps.push(r)
|
84
|
+
t = this.GetToken()
|
85
|
+
}
|
86
|
+
|
87
|
+
this.tokens.push(t)
|
88
|
+
|
89
|
+
return Expression.Comma(exps, this.pos)
|
90
|
+
}
|
91
|
+
|
92
|
+
/**
|
93
|
+
* 赋值表达式=对象属性=一般表达式|一般表达式
|
94
|
+
*/
|
95
|
+
AssignExp () {
|
96
|
+
let t = this.GetToken()
|
97
|
+
|
98
|
+
// 把第一个Token的位置记录下来,方便后面回退
|
99
|
+
const firstPos = t.getStartPos()
|
100
|
+
|
101
|
+
if (t.getType() !== TokenType.Identy) {
|
102
|
+
this.pos = firstPos
|
103
|
+
this.tokens.length = 0 // Clear the tokens array
|
104
|
+
this.inString = false
|
105
|
+
return this.Exp()
|
106
|
+
}
|
107
|
+
|
108
|
+
let objExp = Expression.Identity(t.getValue(), this.pos)
|
109
|
+
objExp = this.ObjectPath(objExp)
|
110
|
+
|
111
|
+
// 只能给对象属性或者变量赋值
|
112
|
+
if (objExp.type !== ExpressionType.Property && objExp.type !== ExpressionType.Identity) {
|
113
|
+
this.pos = firstPos
|
114
|
+
this.tokens.length = 0
|
115
|
+
this.inString = false
|
116
|
+
return this.Exp()
|
117
|
+
}
|
118
|
+
|
119
|
+
t = this.GetToken()
|
120
|
+
if (t.getType() !== TokenType.Oper || t.getValue() !== '=') {
|
121
|
+
this.pos = firstPos
|
122
|
+
this.tokens.length = 0
|
123
|
+
this.inString = false
|
124
|
+
return this.Exp()
|
125
|
+
}
|
126
|
+
|
127
|
+
const exp = this.Exp()
|
128
|
+
|
129
|
+
// 如果是属性赋值
|
130
|
+
if (objExp.type === ExpressionType.Property) {
|
131
|
+
// 从属性Expression中获取对象及属性名
|
132
|
+
const name = objExp.value
|
133
|
+
objExp = objExp.children[0]
|
134
|
+
return Expression.Assign(objExp, exp, name, this.pos)
|
135
|
+
} else {
|
136
|
+
// Identity 变量赋值
|
137
|
+
return Expression.Assign(null, exp, objExp.value, this.pos)
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
141
|
+
Exp () {
|
142
|
+
const v = this.Logic()
|
143
|
+
|
144
|
+
// 是':',表示条件,否则直接返回单结果
|
145
|
+
let t = this.GetToken()
|
146
|
+
if (t.getType() === TokenType.Oper && t.getValue() === ':') {
|
147
|
+
// 第一项转换
|
148
|
+
const result = this.Logic()
|
149
|
+
|
150
|
+
// 下一个是",",继续读取下一个条件结果串,由于是右结合,只能采用递归
|
151
|
+
t = this.GetToken()
|
152
|
+
if (t.getType() === TokenType.Oper && t.getValue() === ',') {
|
153
|
+
// 第二项转换
|
154
|
+
const sExp = this.Exp()
|
155
|
+
// 返回
|
156
|
+
return Expression.Condition(v, result, sExp, this.SOURCE, this.pos)
|
157
|
+
} else {
|
158
|
+
throw new Error(this.GetExceptionMessage('必须有默认值!'))
|
159
|
+
}
|
160
|
+
} else {
|
161
|
+
this.tokens.push(t) // Put the token back
|
162
|
+
return v
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
Logic () {
|
167
|
+
let t = this.GetToken()
|
168
|
+
|
169
|
+
// !表达式
|
170
|
+
const hasNot = t.getType() === TokenType.Oper && t.getValue() === '!'
|
171
|
+
if (!hasNot) {
|
172
|
+
this.tokens.push(t) // Put the token back if it's not '!'
|
173
|
+
}
|
174
|
+
|
175
|
+
let v = this.Compare()
|
176
|
+
if (hasNot) {
|
177
|
+
v = Expression.Not(v, this.SOURCE, this.pos)
|
178
|
+
}
|
179
|
+
|
180
|
+
t = this.GetToken()
|
181
|
+
while (t.getType() === TokenType.Oper && (t.getValue() === '&&' || t.getValue() === '||')) {
|
182
|
+
// 第二项转换
|
183
|
+
const exp = this.Logic()
|
184
|
+
|
185
|
+
// 执行
|
186
|
+
if (t.getValue() === '&&') {
|
187
|
+
v = Expression.And(v, exp, this.SOURCE, this.pos)
|
188
|
+
} else {
|
189
|
+
v = Expression.Or(v, exp, this.SOURCE, this.pos)
|
190
|
+
}
|
191
|
+
|
192
|
+
t = this.GetToken()
|
193
|
+
}
|
194
|
+
|
195
|
+
this.tokens.push(t) // Put the token back
|
196
|
+
return v
|
197
|
+
}
|
198
|
+
|
199
|
+
Compare () {
|
200
|
+
const left = this.Math()
|
201
|
+
const t = this.GetToken()
|
202
|
+
|
203
|
+
if (t.getType() === TokenType.Oper && (
|
204
|
+
t.getValue() === '>' || t.getValue() === '>=' ||
|
205
|
+
t.getValue() === '<' || t.getValue() === '<=' || t.getValue() === '=>')) {
|
206
|
+
if (t.getValue() === '=>') {
|
207
|
+
this.tokens.push(t) // Push back the token for lambda handling
|
208
|
+
return this.Lambda()
|
209
|
+
}
|
210
|
+
|
211
|
+
const rExp = this.Math()
|
212
|
+
|
213
|
+
switch (t.getValue()) {
|
214
|
+
case '>':
|
215
|
+
return Expression.GreaterThan(left, rExp, this.SOURCE, this.pos)
|
216
|
+
case '>=':
|
217
|
+
return Expression.GreaterThanOrEqual(left, rExp, this.SOURCE, this.pos)
|
218
|
+
case '<':
|
219
|
+
return Expression.LessThan(left, rExp, this.SOURCE, this.pos)
|
220
|
+
case '<=':
|
221
|
+
return Expression.LessThanOrEqual(left, rExp, this.SOURCE, this.pos)
|
222
|
+
}
|
223
|
+
} else if (t.getType() === TokenType.Oper && (
|
224
|
+
t.getValue() === '==' || t.getValue() === '!=')) {
|
225
|
+
const rExp = this.Math()
|
226
|
+
|
227
|
+
// 相等比较
|
228
|
+
if (t.getValue() === '==') {
|
229
|
+
return Expression.Equal(left, rExp, this.SOURCE, this.pos)
|
230
|
+
} else {
|
231
|
+
return Expression.NotEqual(left, rExp, this.SOURCE, this.pos)
|
232
|
+
}
|
233
|
+
}
|
234
|
+
|
235
|
+
// 返回当前的表达式结果
|
236
|
+
this.tokens.push(t) // Push the token back
|
237
|
+
return left
|
238
|
+
}
|
239
|
+
|
240
|
+
Math () {
|
241
|
+
let v = this.Mul()
|
242
|
+
let t = this.GetToken()
|
243
|
+
|
244
|
+
while (t.getType() === TokenType.Oper && (t.getValue() === '+' || t.getValue() === '-')) {
|
245
|
+
// 转换操作数2为数字
|
246
|
+
const r = this.Mul()
|
247
|
+
|
248
|
+
// 开始运算
|
249
|
+
if (t.getValue() === '+') {
|
250
|
+
v = Expression.Add(v, r, this.SOURCE, this.pos)
|
251
|
+
} else {
|
252
|
+
v = Expression.Subtract(v, r, this.SOURCE, this.pos)
|
253
|
+
}
|
254
|
+
|
255
|
+
t = this.GetToken()
|
256
|
+
}
|
257
|
+
|
258
|
+
this.tokens.push(t) // Push the token back
|
259
|
+
return v
|
260
|
+
}
|
261
|
+
|
262
|
+
Lambda () {
|
263
|
+
let t = this.GetToken()
|
264
|
+
if (t.getValue() !== '=>' || t.getValue() == null) {
|
265
|
+
throw new Error(this.GetExceptionMessage('lambda必须以=>开始'))
|
266
|
+
}
|
267
|
+
|
268
|
+
t = this.GetToken()
|
269
|
+
if (t.getValue() !== '{' || t.getValue() == null) {
|
270
|
+
throw new Error(this.GetExceptionMessage('lambda必须以{开始'))
|
271
|
+
}
|
272
|
+
|
273
|
+
// 取lambda中的表达式
|
274
|
+
const exp = this.CommaExp()
|
275
|
+
|
276
|
+
t = this.GetToken()
|
277
|
+
if (t.getValue() !== '}' || t.getValue() == null) {
|
278
|
+
throw new Error(this.GetExceptionMessage('lambda必须以}结束'))
|
279
|
+
}
|
280
|
+
|
281
|
+
return Expression.Lambda(exp, this.pos)
|
282
|
+
}
|
283
|
+
|
284
|
+
Mul () {
|
285
|
+
let v = this.UnarySub()
|
286
|
+
let t = this.GetToken()
|
287
|
+
|
288
|
+
while (t.getType() === TokenType.Oper && (t.getValue() === '*' || t.getValue() === '/' || t.getValue() === '%')) {
|
289
|
+
// Convert the second operand to a number
|
290
|
+
const r = this.UnarySub()
|
291
|
+
|
292
|
+
// Perform the operation
|
293
|
+
if (t.getValue() === '*') {
|
294
|
+
v = Expression.Multiply(v, r, this.SOURCE, this.pos)
|
295
|
+
} else if (t.getValue() === '/') {
|
296
|
+
v = Expression.Divide(v, r, this.SOURCE, this.pos)
|
297
|
+
} else {
|
298
|
+
v = Expression.Modulo(v, r, this.SOURCE, this.pos)
|
299
|
+
}
|
300
|
+
|
301
|
+
t = this.GetToken()
|
302
|
+
}
|
303
|
+
|
304
|
+
this.tokens.push(t)
|
305
|
+
return v
|
306
|
+
}
|
307
|
+
|
308
|
+
UnarySub () {
|
309
|
+
const t = this.GetToken()
|
310
|
+
if (t.getType() === TokenType.Oper && t.getValue() === '-') {
|
311
|
+
const r = this.Item()
|
312
|
+
return Expression.Subtract(Expression.Constant(0, this.pos), r, this.SOURCE, this.pos)
|
313
|
+
}
|
314
|
+
this.tokens.push(t) // Push the token back into the queue
|
315
|
+
return this.Item()
|
316
|
+
}
|
317
|
+
|
318
|
+
Item () {
|
319
|
+
const objName = ''
|
320
|
+
// 获取对象表达式
|
321
|
+
let objExp = this.ItemHead(objName)
|
322
|
+
// 获取对象路径表达式
|
323
|
+
objExp = this.ObjectPath(objExp)
|
324
|
+
return objExp
|
325
|
+
}
|
326
|
+
|
327
|
+
ItemHead (name) {
|
328
|
+
let t = this.GetToken()
|
329
|
+
|
330
|
+
if (t.getType() === TokenType.Oper && t.getValue() === '(') {
|
331
|
+
const result = this.CommaExp()
|
332
|
+
t = this.GetToken()
|
333
|
+
if (t.getType() !== TokenType.Oper || t.getValue() !== ')') {
|
334
|
+
throw new Error(this.GetExceptionMessage('括号不匹配'))
|
335
|
+
}
|
336
|
+
return result
|
337
|
+
} else if (t.getType() === TokenType.Oper && t.getValue() === '{') {
|
338
|
+
// JSON object
|
339
|
+
return this.Json()
|
340
|
+
} else if (t.getType() === TokenType.Oper && t.getValue() === '[') {
|
341
|
+
// JSON array
|
342
|
+
return this.JsonArray()
|
343
|
+
} else if (t.getType() === TokenType.Oper && (t.getValue() === '$' || t.getValue() === '"')) {
|
344
|
+
// String concatenation sequence
|
345
|
+
return this.StringUnion()
|
346
|
+
} else if (t.getType() === TokenType.Int || t.getType() === TokenType.Double || t.getType() === TokenType.Bool) {
|
347
|
+
return Expression.Constant(t.getValue(), this.pos)
|
348
|
+
} else if (t.getType() === TokenType.Identy) {
|
349
|
+
const objName = t.getValue()
|
350
|
+
|
351
|
+
switch (objName) {
|
352
|
+
case 'return':
|
353
|
+
return Expression.Return(this.Exp(), this.pos)
|
354
|
+
case 'try':
|
355
|
+
this.tokens.push(t) // Revert the token back to the queue
|
356
|
+
return this.Try()
|
357
|
+
case 'throw':
|
358
|
+
return Expression.Throw(this.Exp(), this.pos)
|
359
|
+
case 'validate':
|
360
|
+
return this.Validate()
|
361
|
+
case 'assert':
|
362
|
+
return Expression.Assert(this.Exp(), this.pos)
|
363
|
+
case 'break':
|
364
|
+
return Expression.Break(this.pos, undefined)
|
365
|
+
case 'continue':
|
366
|
+
return Expression.Continue(this.pos, undefined)
|
367
|
+
}
|
368
|
+
|
369
|
+
// Return the object name
|
370
|
+
name += objName
|
371
|
+
// Process the object name
|
372
|
+
return this.ObjectName(objName)
|
373
|
+
} else if (t.getType() === TokenType.Null) {
|
374
|
+
return Expression.Constant(null, this.pos)
|
375
|
+
}
|
376
|
+
|
377
|
+
throw new Error(this.GetExceptionMessage('单词类型错误:' + t.getType()))
|
378
|
+
}
|
379
|
+
|
380
|
+
/**
|
381
|
+
* TryCatch := try {expression} (catch(Exception类 名){表达式})* finally{表达式}?
|
382
|
+
*/
|
383
|
+
Try () {
|
384
|
+
let t = this.GetToken()
|
385
|
+
if (t.getValue() !== 'try') {
|
386
|
+
throw new Error(this.GetExceptionMessage('try-catch必须以try开始'))
|
387
|
+
}
|
388
|
+
|
389
|
+
t = this.GetToken()
|
390
|
+
if (t.getValue() !== '{') {
|
391
|
+
throw new Error(this.GetExceptionMessage('try块必须以{开始'))
|
392
|
+
}
|
393
|
+
|
394
|
+
// Get the expression inside the try block
|
395
|
+
const tryExp = this.CommaExp()
|
396
|
+
|
397
|
+
t = this.GetToken()
|
398
|
+
if (t.getValue() !== '}') {
|
399
|
+
throw new Error(this.GetExceptionMessage('try块必须以}结束'))
|
400
|
+
}
|
401
|
+
|
402
|
+
// Handle the catch part
|
403
|
+
const catches = this.Catch()
|
404
|
+
|
405
|
+
// Handle finally
|
406
|
+
let finallyExp
|
407
|
+
t = this.GetToken()
|
408
|
+
if (t.getValue()) {
|
409
|
+
if (t.getValue() === 'finally') {
|
410
|
+
t = this.GetToken()
|
411
|
+
if (t.getValue() !== '{') {
|
412
|
+
throw new Error(this.GetExceptionMessage('finally块必须以{开始'))
|
413
|
+
}
|
414
|
+
|
415
|
+
// Get the expression inside the finally block
|
416
|
+
finallyExp = this.CommaExp()
|
417
|
+
t = this.GetToken()
|
418
|
+
if (t.getValue() !== '}') {
|
419
|
+
throw new Error(this.GetExceptionMessage('finally块必须以}结束'))
|
420
|
+
}
|
421
|
+
t = this.GetToken()
|
422
|
+
}
|
423
|
+
}
|
424
|
+
|
425
|
+
this.tokens.push(t)
|
426
|
+
|
427
|
+
// Return the exception handling expression
|
428
|
+
return Expression.Try(tryExp, catches, this.pos, finallyExp)
|
429
|
+
}
|
430
|
+
|
431
|
+
/**
|
432
|
+
* catch部分处理
|
433
|
+
*/
|
434
|
+
Catch () {
|
435
|
+
const result = []
|
436
|
+
let t = this.GetToken()
|
437
|
+
|
438
|
+
while (t.getValue() === 'catch') {
|
439
|
+
t = this.GetToken()
|
440
|
+
if (t.getValue() !== '(') {
|
441
|
+
throw new Error(this.GetExceptionMessage('catch块参数必须以(开始'))
|
442
|
+
}
|
443
|
+
|
444
|
+
// Get the class name
|
445
|
+
t = this.GetToken()
|
446
|
+
const className = t.getValue()
|
447
|
+
|
448
|
+
// Get the variable name
|
449
|
+
t = this.GetToken()
|
450
|
+
const varName = t.getValue()
|
451
|
+
|
452
|
+
t = this.GetToken()
|
453
|
+
if (t.getValue() !== ')') {
|
454
|
+
throw new Error(this.GetExceptionMessage('catch块参数必须以)结束'))
|
455
|
+
}
|
456
|
+
|
457
|
+
// Get the opening curly brace
|
458
|
+
t = this.GetToken()
|
459
|
+
if (t.getValue() !== '{') {
|
460
|
+
throw new Error(this.GetExceptionMessage('catch块必须以{开始'))
|
461
|
+
}
|
462
|
+
|
463
|
+
// Get the expression inside the catch block
|
464
|
+
const catchExp = this.CommaExp()
|
465
|
+
result.push(Expression.Catch(className, varName, catchExp, this.pos))
|
466
|
+
|
467
|
+
// Get the closing curly brace
|
468
|
+
t = this.GetToken()
|
469
|
+
if (t.getValue() !== '}') {
|
470
|
+
throw new Error(this.GetExceptionMessage('catch块必须以}结束'))
|
471
|
+
}
|
472
|
+
|
473
|
+
// Get the next token
|
474
|
+
t = this.GetToken()
|
475
|
+
}
|
476
|
+
|
477
|
+
this.tokens.push(t)
|
478
|
+
return result
|
479
|
+
}
|
480
|
+
|
481
|
+
/**
|
482
|
+
* Validate block handling
|
483
|
+
*/
|
484
|
+
Validate () {
|
485
|
+
const t = this.GetToken()
|
486
|
+
if (t.getValue() !== '{') {
|
487
|
+
throw new Error(this.GetExceptionMessage('validate只接收Json对象'))
|
488
|
+
}
|
489
|
+
|
490
|
+
// Get the expression in the validate block
|
491
|
+
const exp = this.Json()
|
492
|
+
|
493
|
+
// Return Validate processing expression
|
494
|
+
return Expression.Validate(exp, this.pos)
|
495
|
+
}
|
496
|
+
|
497
|
+
/**
|
498
|
+
* JSON Object ::= {} | {propertyName: propertyValue, propertyName: propertyValue}
|
499
|
+
*/
|
500
|
+
Json () {
|
501
|
+
const children = []
|
502
|
+
|
503
|
+
let t = this.GetToken()
|
504
|
+
// Empty object, return directly
|
505
|
+
if (t.getType() === TokenType.Oper && t.getValue() === '}') {
|
506
|
+
return Expression.Json(children, this.pos)
|
507
|
+
}
|
508
|
+
|
509
|
+
this.tokens.push(t)
|
510
|
+
children.push(this.Attr())
|
511
|
+
t = this.GetToken()
|
512
|
+
|
513
|
+
// If it's a comma, continue checking the next property
|
514
|
+
while (t.getType() === TokenType.Oper && t.getValue() === ',') {
|
515
|
+
const nextT = this.GetToken()
|
516
|
+
if (nextT.getType() === TokenType.Oper && nextT.getValue() === '}') {
|
517
|
+
t = nextT
|
518
|
+
break
|
519
|
+
}
|
520
|
+
this.tokens.push(nextT)
|
521
|
+
children.push(this.Attr())
|
522
|
+
t = this.GetToken()
|
523
|
+
}
|
524
|
+
|
525
|
+
if (t.getType() !== TokenType.Oper || t.getValue() !== '}') {
|
526
|
+
throw new Error(this.GetExceptionMessage('JSON对象构建错误'))
|
527
|
+
}
|
528
|
+
|
529
|
+
return Expression.Json(children, this.pos)
|
530
|
+
}
|
531
|
+
|
532
|
+
/**
|
533
|
+
* JSON Array ::= []
|
534
|
+
*/
|
535
|
+
JsonArray () {
|
536
|
+
let t = this.GetToken()
|
537
|
+
// Empty array, return directly
|
538
|
+
if (t.getType() === TokenType.Oper && t.getValue() === ']') {
|
539
|
+
// Return JSON array constant
|
540
|
+
return Expression.Constant([], this.pos)
|
541
|
+
}
|
542
|
+
|
543
|
+
// Loop to get array contents
|
544
|
+
this.tokens.push(t)
|
545
|
+
const ps = this.Params()
|
546
|
+
t = this.GetToken()
|
547
|
+
if (t.getType() !== TokenType.Oper || t.getValue() !== ']') {
|
548
|
+
throw new Error(this.GetExceptionMessage('JSON集合构建错误'))
|
549
|
+
}
|
550
|
+
|
551
|
+
return Expression.Array(ps, this.pos)
|
552
|
+
}
|
553
|
+
|
554
|
+
/**
|
555
|
+
* Attribute-Value Pair ::= propertyName: propertyValue
|
556
|
+
*/
|
557
|
+
Attr () {
|
558
|
+
const name = this.GetToken()
|
559
|
+
let value
|
560
|
+
if (name.getType() === TokenType.Identy) {
|
561
|
+
value = name.getValue()
|
562
|
+
} else if (name.getType() === TokenType.Oper && (name.getValue() === '$' || name.getValue() === '"')) {
|
563
|
+
const expression = this.StringUnion().children[1]
|
564
|
+
value = expression.value
|
565
|
+
} else {
|
566
|
+
throw new Error(this.GetExceptionMessage('JSON对象的key必须是属性名或字符串'))
|
567
|
+
}
|
568
|
+
|
569
|
+
const t = this.GetToken()
|
570
|
+
if (t.getType() !== TokenType.Oper || t.getValue() !== ':') {
|
571
|
+
throw new Error(this.GetExceptionMessage('JSON构建错误'))
|
572
|
+
}
|
573
|
+
|
574
|
+
const exp = this.Exp()
|
575
|
+
return Expression.Attr(value, exp, this.pos)
|
576
|
+
}
|
577
|
+
|
578
|
+
/**
|
579
|
+
* Parse string concatenation sequence
|
580
|
+
*/
|
581
|
+
StringUnion () {
|
582
|
+
let exp = Expression.Constant('', this.pos)
|
583
|
+
let t = this.GetToken()
|
584
|
+
// Object sequence
|
585
|
+
while ((t.getType() === TokenType.Oper && t.getValue() === '{') || t.getType() === TokenType.String) {
|
586
|
+
// If it's a string, return the concatenated result
|
587
|
+
if (t.getType() === TokenType.String) {
|
588
|
+
exp = Expression.Concat(exp, Expression.Constant(t.getValue(), this.pos), this.SOURCE, this.pos)
|
589
|
+
} else {
|
590
|
+
// Handle content inside the {}
|
591
|
+
const objExp = this.Exp()
|
592
|
+
t = this.GetToken()
|
593
|
+
if (t.getType() !== TokenType.Oper || t.getValue() !== '}') {
|
594
|
+
throw new Error(this.GetExceptionMessage("缺少'}'"))
|
595
|
+
}
|
596
|
+
// String concatenation
|
597
|
+
exp = Expression.Concat(exp, objExp, this.SOURCE, this.pos)
|
598
|
+
}
|
599
|
+
t = this.GetToken()
|
600
|
+
}
|
601
|
+
this.tokens.push(t)
|
602
|
+
return exp
|
603
|
+
}
|
604
|
+
|
605
|
+
/**
|
606
|
+
* Get object and object expression by name
|
607
|
+
*/
|
608
|
+
ObjectName (objName) {
|
609
|
+
return Expression.Identity(objName, this.pos)
|
610
|
+
}
|
611
|
+
|
612
|
+
/**
|
613
|
+
* Object path parsing, handles method calls, properties, and array indices
|
614
|
+
*/
|
615
|
+
ObjectPath (inExp) {
|
616
|
+
let objExp = this.ArrayIndex(inExp)
|
617
|
+
let t = this.GetToken()
|
618
|
+
while (t.getType() === TokenType.Oper && t.getValue() === '.') {
|
619
|
+
const nameToken = this.GetToken()
|
620
|
+
const n = this.GetToken()
|
621
|
+
if (n.getType() === TokenType.Oper && n.getValue() === '(') {
|
622
|
+
const name = nameToken.getValue()
|
623
|
+
if (name === 'each') {
|
624
|
+
objExp = this.For(objExp)
|
625
|
+
} else {
|
626
|
+
objExp = this.MethodCall(name, objExp)
|
627
|
+
}
|
628
|
+
} else {
|
629
|
+
this.tokens.push(n)
|
630
|
+
const pi = nameToken.getValue()
|
631
|
+
objExp = Expression.Property(objExp, pi, this.pos)
|
632
|
+
objExp = this.ArrayIndex(objExp)
|
633
|
+
}
|
634
|
+
t = this.GetToken()
|
635
|
+
}
|
636
|
+
this.tokens.push(t)
|
637
|
+
|
638
|
+
return objExp
|
639
|
+
}
|
640
|
+
|
641
|
+
/**
|
642
|
+
* Array index parsing with optional condition
|
643
|
+
*/
|
644
|
+
ArrayIndex (objExp) {
|
645
|
+
let n = this.GetToken()
|
646
|
+
if (n.getType() === TokenType.Oper && n.getValue() === '[') {
|
647
|
+
const exp = this.Exp()
|
648
|
+
n = this.GetToken()
|
649
|
+
if (n.getType() !== TokenType.Oper || n.getValue() !== ']') {
|
650
|
+
throw new Error(this.GetExceptionMessage("缺少']'"))
|
651
|
+
}
|
652
|
+
return Expression.ArrayIndex(objExp, exp, this.SOURCE, this.pos)
|
653
|
+
}
|
654
|
+
this.tokens.push(n)
|
655
|
+
return objExp
|
656
|
+
}
|
657
|
+
|
658
|
+
/**
|
659
|
+
* For loop handling
|
660
|
+
*/
|
661
|
+
For (obj) {
|
662
|
+
const exp = this.CommaExp()
|
663
|
+
const t = this.GetToken()
|
664
|
+
if (t.getType() !== TokenType.Oper || t.getValue() !== ')') {
|
665
|
+
throw new Error(this.GetExceptionMessage('函数调用括号不匹配'))
|
666
|
+
}
|
667
|
+
return Expression.For(obj, exp, this.SOURCE, this.pos)
|
668
|
+
}
|
669
|
+
|
670
|
+
/**
|
671
|
+
* Method call handling with parameters
|
672
|
+
*/
|
673
|
+
MethodCall (name, obj) {
|
674
|
+
let t = this.GetToken()
|
675
|
+
if (t.getType() === TokenType.Oper && t.getValue() === ')') {
|
676
|
+
const ps = []
|
677
|
+
return Expression.Call(obj, name, ps, this.pos)
|
678
|
+
}
|
679
|
+
|
680
|
+
this.tokens.push(t)
|
681
|
+
const ps = this.Params()
|
682
|
+
t = this.GetToken()
|
683
|
+
if (t.getType() !== TokenType.Oper || t.getValue() !== ')') {
|
684
|
+
throw new Error(this.GetExceptionMessage('函数调用括号不匹配'))
|
685
|
+
}
|
686
|
+
|
687
|
+
return Expression.Call(obj, name, ps, this.pos)
|
688
|
+
}
|
689
|
+
|
690
|
+
/**
|
691
|
+
* Function parameter list handling
|
692
|
+
*/
|
693
|
+
Params () {
|
694
|
+
const ps = []
|
695
|
+
let name = this.paramName()
|
696
|
+
let exp = this.Exp()
|
697
|
+
this.procParam(ps, exp, name)
|
698
|
+
let t = this.GetToken()
|
699
|
+
while (t.getType() === TokenType.Oper && t.getValue() === ',') {
|
700
|
+
name = this.paramName()
|
701
|
+
exp = this.Exp()
|
702
|
+
this.procParam(ps, exp, name)
|
703
|
+
t = this.GetToken()
|
704
|
+
}
|
705
|
+
this.tokens.push(t)
|
706
|
+
return ps
|
707
|
+
}
|
708
|
+
|
709
|
+
/**
|
710
|
+
* Parse parameter name
|
711
|
+
*/
|
712
|
+
paramName () {
|
713
|
+
const t = this.GetToken()
|
714
|
+
if (t.getType() === TokenType.Identy) {
|
715
|
+
const t1 = this.GetToken()
|
716
|
+
if (t1.getValue() === ':') {
|
717
|
+
return t.getValue()
|
718
|
+
} else {
|
719
|
+
this.tokens.push(t)
|
720
|
+
this.tokens.push(t1)
|
721
|
+
return ''
|
722
|
+
}
|
723
|
+
} else {
|
724
|
+
this.tokens.push(t)
|
725
|
+
return ''
|
726
|
+
}
|
727
|
+
}
|
728
|
+
|
729
|
+
/**
|
730
|
+
* Process parameters, especially if it contains the "data" object
|
731
|
+
*/
|
732
|
+
procParam (ps, exp, name) {
|
733
|
+
const delegate = this.createDelegate(exp)
|
734
|
+
if (delegate.containsKey('data')) {
|
735
|
+
ps.push(Expression.Constant(delegate, this.pos))
|
736
|
+
} else {
|
737
|
+
ps.push(Expression.Param(exp, name, this.pos))
|
738
|
+
}
|
739
|
+
}
|
740
|
+
|
741
|
+
/**
|
742
|
+
* Get exception message with position information
|
743
|
+
*/
|
744
|
+
GetExceptionMessage (msg) {
|
745
|
+
const result = this.SOURCE.substring(0, this.pos) + ' <- ' + this.SOURCE.substring(this.pos)
|
746
|
+
return `${msg}:\n${result}`
|
747
|
+
}
|
748
|
+
|
749
|
+
GetToken () {
|
750
|
+
// If there are tokens in the queue, return the last one saved
|
751
|
+
if (this.tokens.length > 0) {
|
752
|
+
return this.tokens.shift()
|
753
|
+
}
|
754
|
+
|
755
|
+
const sPos = this.pos
|
756
|
+
let hasKeyword = this.pos < this.SOURCE_LENGTH
|
757
|
+
let value = null
|
758
|
+
|
759
|
+
if (hasKeyword) {
|
760
|
+
value = this.SOURCE.charAt(this.pos)
|
761
|
+
}
|
762
|
+
|
763
|
+
// If it's '{', save the previous state and change to non-string state
|
764
|
+
if (hasKeyword && value === '{') {
|
765
|
+
this.inStrings.push(this.inString)
|
766
|
+
this.inString = false
|
767
|
+
const str = this.SOURCE.substring(this.pos, this.pos + 1)
|
768
|
+
this.pos += 1
|
769
|
+
return new Token(TokenType.Oper, str, sPos)
|
770
|
+
}
|
771
|
+
|
772
|
+
// If in string state, process the string
|
773
|
+
if (this.inString) {
|
774
|
+
const startPos = this.pos
|
775
|
+
while (hasKeyword && value !== '{' && value !== '}' && value !== '$' && value !== '\"') {
|
776
|
+
if (value === '\\') {
|
777
|
+
const nextStrValue = this.SOURCE.charAt(this.pos + 1)
|
778
|
+
if (this.pos + 1 < this.SOURCE_LENGTH && ['{', '}', '\"', '$', '\\'].includes(nextStrValue)) {
|
779
|
+
this.pos++
|
780
|
+
} else {
|
781
|
+
break
|
782
|
+
}
|
783
|
+
}
|
784
|
+
this.pos++
|
785
|
+
if (this.pos < this.SOURCE_LENGTH) {
|
786
|
+
value = this.SOURCE.charAt(this.pos)
|
787
|
+
} else {
|
788
|
+
hasKeyword = false
|
789
|
+
}
|
790
|
+
}
|
791
|
+
if (!(hasKeyword && value === '{')) {
|
792
|
+
this.inString = this.inStrings.pop()
|
793
|
+
}
|
794
|
+
const t = new Token(TokenType.String, this.SOURCE.substring(startPos, this.pos)
|
795
|
+
.replace('\\$', '$')
|
796
|
+
.replace('\\{', '{')
|
797
|
+
.replace('\\}', '}')
|
798
|
+
.replace(/\\"/g, '"')
|
799
|
+
.replace('\\\\', '\\'), sPos)
|
800
|
+
|
801
|
+
if (hasKeyword && (value === '$' || value === '\"')) {
|
802
|
+
this.pos++
|
803
|
+
}
|
804
|
+
return t
|
805
|
+
}
|
806
|
+
|
807
|
+
// Skip whitespace and comments
|
808
|
+
while (hasKeyword && (value === ' ' || value === '\n' || value === '\t' || (this.pos < this.SOURCE_LENGTH - 2 && value === '/' && this.SOURCE.charAt(this.pos + 1) === '/'))) {
|
809
|
+
if (value !== ' ' && value !== '\n' && value !== '\t') {
|
810
|
+
this.pos += 2
|
811
|
+
if (this.pos < this.SOURCE_LENGTH) {
|
812
|
+
value = this.SOURCE.charAt(this.pos)
|
813
|
+
} else {
|
814
|
+
hasKeyword = false
|
815
|
+
}
|
816
|
+
while (hasKeyword && value !== '\n') {
|
817
|
+
this.pos++
|
818
|
+
if (this.pos < this.SOURCE_LENGTH) {
|
819
|
+
value = this.SOURCE.charAt(this.pos)
|
820
|
+
} else {
|
821
|
+
hasKeyword = false
|
822
|
+
}
|
823
|
+
}
|
824
|
+
}
|
825
|
+
this.pos++
|
826
|
+
if (this.pos < this.SOURCE_LENGTH) {
|
827
|
+
value = this.SOURCE.charAt(this.pos)
|
828
|
+
} else {
|
829
|
+
hasKeyword = false
|
830
|
+
}
|
831
|
+
}
|
832
|
+
|
833
|
+
// If we are at the end of the source, return an "End" token
|
834
|
+
if (this.pos === this.SOURCE_LENGTH) {
|
835
|
+
return new Token(TokenType.End, null, sPos)
|
836
|
+
}
|
837
|
+
|
838
|
+
if (value !== null) {
|
839
|
+
// Handle number tokens
|
840
|
+
if (value >= '0' && value <= '9') {
|
841
|
+
const oldPos = this.pos
|
842
|
+
while (hasKeyword && value >= '0' && value <= '9') {
|
843
|
+
this.pos++
|
844
|
+
if (this.pos < this.SOURCE_LENGTH) {
|
845
|
+
value = this.SOURCE.charAt(this.pos)
|
846
|
+
} else {
|
847
|
+
hasKeyword = false
|
848
|
+
}
|
849
|
+
}
|
850
|
+
|
851
|
+
if (hasKeyword && value === '.') {
|
852
|
+
do {
|
853
|
+
this.pos++
|
854
|
+
if (this.pos < this.SOURCE_LENGTH) {
|
855
|
+
value = this.SOURCE.charAt(this.pos)
|
856
|
+
} else {
|
857
|
+
hasKeyword = false
|
858
|
+
}
|
859
|
+
} while (hasKeyword && value >= '0' && value <= '9')
|
860
|
+
const str = this.SOURCE.substring(oldPos, this.pos)
|
861
|
+
return new Token(TokenType.Double, parseFloat(str), sPos)
|
862
|
+
} else {
|
863
|
+
const str = this.SOURCE.substring(oldPos, this.pos)
|
864
|
+
return new Token(TokenType.Int, parseInt(str, 10), sPos)
|
865
|
+
}
|
866
|
+
} else if ((value >= 'a' && value <= 'z') || (value >= 'A' && value <= 'Z') || value === '_' || /[\u4e00-\u9fa5]/.test(value)) {
|
867
|
+
const oldPos = this.pos
|
868
|
+
while (hasKeyword && ((value >= 'a' && value <= 'z') || (value >= 'A' && value <= 'Z') || (value >= '0' && value <= '9') || value === '_' || /[\u4e00-\u9fa5]/.test(value))) {
|
869
|
+
this.pos++
|
870
|
+
if (this.pos < this.SOURCE_LENGTH) {
|
871
|
+
value = this.SOURCE.charAt(this.pos)
|
872
|
+
} else {
|
873
|
+
hasKeyword = false
|
874
|
+
}
|
875
|
+
}
|
876
|
+
const str = this.SOURCE.substring(oldPos, this.pos)
|
877
|
+
switch (str) {
|
878
|
+
case 'false':
|
879
|
+
case 'true':
|
880
|
+
return new Token(TokenType.Bool, Boolean(str), sPos)
|
881
|
+
case 'null':
|
882
|
+
return new Token(TokenType.Null, null, sPos)
|
883
|
+
default:
|
884
|
+
return new Token(TokenType.Identy, str, sPos)
|
885
|
+
}
|
886
|
+
} else if ((value === '&' && this.SOURCE.charAt(this.pos + 1) === '&') || (value === '|' && this.SOURCE.charAt(this.pos + 1) === '|')) {
|
887
|
+
const str = this.SOURCE.substring(this.pos, this.pos + 2)
|
888
|
+
this.pos += 2
|
889
|
+
return new Token(TokenType.Oper, str, sPos)
|
890
|
+
} else if (['+', '-', '*', '/', '%', '>', '<', '!'].includes(value)) {
|
891
|
+
let str = ''
|
892
|
+
if (this.SOURCE.charAt(this.pos + 1) === '=') {
|
893
|
+
str = this.SOURCE.substring(this.pos, this.pos + 2)
|
894
|
+
this.pos += 2
|
895
|
+
} else {
|
896
|
+
str = this.SOURCE.substring(this.pos, this.pos + 1)
|
897
|
+
this.pos += 1
|
898
|
+
}
|
899
|
+
return new Token(TokenType.Oper, str, sPos)
|
900
|
+
} else if (value === '=') {
|
901
|
+
let str
|
902
|
+
if (this.SOURCE.charAt(this.pos + 1) === '=' || this.SOURCE.charAt(this.pos + 1) === '>') {
|
903
|
+
str = this.SOURCE.substring(this.pos, this.pos + 2)
|
904
|
+
this.pos += 2
|
905
|
+
} else {
|
906
|
+
str = this.SOURCE.substring(this.pos, this.pos + 1)
|
907
|
+
this.pos += 1
|
908
|
+
}
|
909
|
+
return new Token(TokenType.Oper, str, sPos)
|
910
|
+
} else if ('()[],;.:@{}"$'.includes(value)) {
|
911
|
+
if (value === '$' || value === '\"') {
|
912
|
+
this.inStrings.push(false)
|
913
|
+
this.inString = true
|
914
|
+
} else if ((value === '{' || value === '}') && this.inStrings.length) {
|
915
|
+
if (value === '{') {
|
916
|
+
this.inStrings.push(false)
|
917
|
+
this.inString = false
|
918
|
+
} else {
|
919
|
+
this.inString = this.inStrings.pop()
|
920
|
+
}
|
921
|
+
}
|
922
|
+
const str = this.SOURCE.substring(this.pos, this.pos + 1)
|
923
|
+
this.pos += 1
|
924
|
+
return new Token(TokenType.Oper, str, sPos)
|
925
|
+
} else {
|
926
|
+
throw new Error(`Invalid token: '${value}'`)
|
927
|
+
}
|
928
|
+
}
|
929
|
+
|
930
|
+
throw new Error('Unknown error while parsing.')
|
931
|
+
}
|
932
|
+
}
|