⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qbasbnf.prs

📁 [随书类]Dos6.0源代码
💻 PRS
📖 第 1 页 / 共 2 页
字号:
              (tkINPUT   MARK(2)) | 
              (tkOUTPUT  MARK(3)) |
              (tkRANDOM  MARK(4)) |
              (tkBINARY  MARK(5))))]
     [tkACCESS ((tkREAD  MARK(6) [tkWRITE MARK(8)]) | (tkWRITE MARK(7)))]
     [(tkLOCK ((tkREAD ((tkWRITE MARK(11)) | MARK(9))) |
               (tkWRITE MARK(10)))) |
      (tkSHARED MARK(12))]
     tkAS optFilenum [tkLEN tkEQ Exp MARK(13)])  |
    (tkComma optFilenum exp12 MARK(14));
      <CgOpen(opStOpen2)>
   tkOPTION tkBASE ((Lit0 EMIT(opStOptionBase0)) |
                    (Lit1 EMIT(opStOptionBase1)));
   tkOUT expCommaExp EMIT(opStOut);
   /* PAINT (x,y) ==> <coords> null null opStPaint2 */
   /* PAINT (x,y), a, b ==> <coords> a b opStPaint2 */
   /* PAINT (x,y), a, b, c ==> <coords> a b c opStPaint3 */
   tkPAINT coordStep commaOptExp commaOptExp
      ((commaExp EMIT(opStPaint3)) | (EMIT(opStPaint2)));
   tkPALETTE ((tkUSING IdAryGetPut EMIT(opStPaletteUsing)) |
      (expCommaExp EMIT(opStPalette2)) |
      (EMIT(opStPalette0)));
   tkPCOPY expCommaExp EMIT(opStPCopy);
   tkPEN EMIT(opEvPen) evSwitch;
   tkPLAY Exp EMIT(opStPlay);
   tkPLAY EMIT(opEvPlay0) evSwitch;
   tkPOKE expCommaExp EMIT(opStPoke);
   tkPRESET coordStep optCommaExp;
      <Cg2or3Args(opStPreset)>
   tkPRINT [lbsExpComma] printList;
   tkPSET coordStep optCommaExp;
      <Cg2or3Args(opStPset)>
   /* PUT [#]chan [, [rec] [, id]] */
   tkPUT optFilenum
    (((tkComma
     ((Exp (tkComma IdAryElemRef EMIT(opStPutRec3) EMITFFFF) | EMIT(opStPut2)) |
      (tkComma IdAryElemRef EMIT(opStPutRec2) EMITFFFF)))) |
     EMIT(opStPut1));
   /* NOTE: values for OR..XOR are passed straight through to runtime */
   tkPUT coordStep tkComma IdAryGetPut EMIT(opStGraphicsPut)
     ((tkComma
       (tkAND EMIT(1)) |
       (tkOR EMIT(0)) | 
       (tkPRESET EMIT(2)) | 
       (tkPSET EMIT(3)) | 
       (tkXOR EMIT(4))) |
     (EMITFFFF));
   tkRANDOMIZE ((Exp EMIT(opStRandomize1)) | EMIT(opStRandomize0));
   tkREAD IdAryElemRef EMIT(opStRead) {tkComma IdAryElemRef EMIT(opStRead)};
   tkREDIM [tkSHARED ACTIONidShared EMIT(opShared)]
      IdAryRedim {tkComma IdAryRedim};
   /* tkREM is handled specially by parser */
   tkRESET EMIT(opStReset);
   tkRESTORE MARK(1) [LabLn MARK(2)];
      <CgInsert0or1(opStRestore0)>
   tkRESUME MARK(1) [(Lit0 MARK(3)) | (LabLn MARK(2)) | (tkNEXT MARK(4))];
   /* NOTE: Lit0 must precede LabLn, or LabLn will recognize 0 as valid label */
      <CgInsert0or1(opStResume0)>
   tkRETURN MARK(1) [LabLn MARK(2)];
      <CgInsert0or1(opStReturn0)>
   tkRMDIR Exp EMIT(opStRmdir);
   tkRSET MARK(1) IdAryElemRef MARK(2) tkEQ Exp;
      <CgMoveOpsToEnd(opStRset)>
   tkRUN [(Ln MARK(1)) | (Exp MARK(2))];
      <CgRun()>
   tkSCREEN NArgsMax4;
     <CgStmtCnt(opStScreen)>
   tkSEEK optFilenum commaExp EMIT(opStSeek);
   tkSELECT tkCASE Exp EMIT(opStSelectCase) EMITFFFF;
   tkSHARED EMIT(opStShared) EMITFFFF ACTIONidShared IdAry {tkComma IdAry};
   tkSHELL [Exp];
      <Cg0or1Args(opStShell0)>
   tkSIGNAL fn1arg EMIT(opEvSignal) evSwitch;
   tkSLEEP ( (Exp EMIT(opStSleep1)) | (EMIT(opStSleep0)) );
   tkSOUND expCommaExp EMIT(opStSound);
   tkSTATIC EMIT(opStStatic) EMITFFFF ACTIONidStatic IdAryI {tkComma IdAryI};
   tkSTOP EMIT(opStStop) EMIT(opNop);
   /* opNop is emitted so user interface TRACING looks ok when STOP executes */
   tkSTRIG (fn1arg EMIT(opEvStrig) evSwitch) | tkON | tkOFF;
   /* NOTE that STRIG ON and STRIG OFF generate no pcode - dead statements */
   tkSUB ErrIfNot1st IdSubDef MARK(3) parms [tkSTATIC MARK(4)];
     <CgDeclare(opStSub)>
   tkSWAP IdAryElemRef tkComma IdAryElemRef EMIT(opStSwap) EMITFFFF;
   tkSYSTEM EMIT(opStSystem);
   tkTIME_ tkEQ Exp EMIT(opStTime_);
   tkTIMER EMIT(opEvTimer0) evSwitch;
   tkTROFF EMIT(opStTroff);
   tkTRON EMIT(opStTron);
   tkTYPE EMIT(opStType) EMITFFFF IdType;
   tkUNLOCK optFilenum
      [tkComma (Exp MARK(1) [tkTO MARK(2) Exp]) | (tkTO MARK(3) Exp)];
      <CgLock(opStUnlock)>
   tkUEVENT EMIT(opEvUEvent) evSwitch;
   tkVIEW ((tkPRINT (Exp tkTO Exp EMIT(opStViewPrint2)) |
                    (EMIT(opStViewPrint0))) |
           (tkSCREEN fn2arg tkMinus fn2arg commaOptExp commaOptExp
               EMIT(opStViewScreen)) |
           (fn2arg tkMinus fn2arg commaOptExp commaOptExp EMIT(opStView)) |
           (EMIT(opStView0)));
/* tkVIEW ((tkPRINT (Exp tkTO Exp EMIT(opStViewPrint2)) |  */
/*                  (EMIT(opStViewPrint0))) | */
/*         (((tkSCREEN fn2arg tkMinus fn2arg EMIT(opStViewScreen)) | */
/*           (fn2arg tkMinus fn2arg EMIT(opStView))) */
/*          [commaOptExpNil EMIT(opViewColor) */
/*            [commaExp EMIT(opViewBoundary)]] ) | */
/*         (EMIT(opStView0))); */
   tkWAIT Exp exp12;
      <Cg2or3Args(opStWait2)>
   tkWEND EMIT(opStWend) EMITFFFF;
   tkWHILE Exp EMIT(opStWhile) EMITFFFF;
   tkWIDTH (tkLbs Exp EMIT(opLbs) tkComma Exp EMIT(opStWidthFile)) | 
           (tkLPRINT Exp EMIT(opStWidthLprint)) |
           ((Exp (commaExp | EMIT(opUndef))) |
            (tkComma EMIT(opUndef) Exp) EMIT(opStWidth2));
   tkWINDOW ((tkSCREEN fn2arg tkMinus fn2arg EMIT(opStWindowScreen)) |
             (fn2arg tkMinus fn2arg EMIT(opStWindow)) |
             (EMIT(opStWindow0)));
   tkWRITE EMIT(opStWrite) [lbsExpComma]
      ((Exp {(tkComma | tkSColon) EMIT(opPrintItemComma) Exp}
        EMIT(opPrintItemEos)) |
       (EMIT(opPrintEos)));

Functions:
   tkABS fn1arg EMIT(opFnAbs);
   tkASC fn1arg EMIT(opFnAsc);
   tkATN fn1arg EMIT(opFnAtn);
   tkCDBL fn1arg EMIT(opCoerce,ET_R8);
   tkCHR_ fn1arg EMIT(opFnChr_);
   tkCINT fn1arg EMIT(opCoerce,ET_I2);
   tkCLNG fn1arg EMIT(opCoerce,ET_I4);
   tkCOMMAND_ EMIT(opFnCommand_);
   tkCOS fn1arg EMIT(opFnCos);
   tkCSNG fn1arg EMIT(opCoerce,ET_R4);
   tkCSRLIN EMIT(opFnCsrlin);
   tkCVD fn1arg EMIT(opFnCvd);
   tkCVDMBF fn1arg EMIT(opFnCvdmbf);
   tkCVI fn1arg EMIT(opFnCvi);
   tkCVL fn1arg EMIT(opFnCvl);
   tkCVS fn1arg EMIT(opFnCvs);
   tkCVSMBF fn1arg EMIT(opFnCvsmbf);
   tkDATE_ EMIT(opFnDate_);
   tkENVIRON_ fn1arg EMIT(opFnEnviron_);
   tkEOF fn1arg EMIT(opFnEof);
   tkERDEV EMIT(opFnErdev);
   tkERDEV_ EMIT(opFnErdev_);
   tkERL EMIT(opFnErl);
   tkERR EMIT(opFnErr);
   tkEXP fn1arg EMIT(opFnExp);
   tkFILEATTR fn2arg EMIT(opFnFileattr);
   tkFIX fn1arg EMIT(opFnFix);
   tkFRE fn1arg EMIT(opFnFre);
   tkFREEFILE EMIT(opFnFreefile);
   tkHEX_ fn1arg EMIT(opFnHex_);
   tkINKEY_ EMIT(opFnInkey_);
   tkINP fn1arg EMIT(opFnInp);
   tkINPUT_ tkLParen Exp [tkComma optFilenum] tkRParen;
     <Cg1or2Args(opFnInput_1)>
   tkINSTR fn23arg; <Cg2or3Args(opFnInstr2)>
   tkINT fn1arg EMIT(opFnInt);
   tkIOCTL_ tkLParen optFilenum tkRParen EMIT(opFnIoctl_);
   tkLBOUND fnBoundArg; <Cg1or2Args(opFnLbound1)>
   tkLCASE_ fn1arg EMIT(opFnLcase_);
   tkLEFT_ fn2arg EMIT(opFnLeft_);
   tkLEN fn1arg EMIT(opFnLen) EMITFFFF;
   tkLOC fn1arg EMIT(opFnLoc);
   tkLOF fn1arg EMIT(opFnLof);
   tkLOG fn1arg EMIT(opFnLog);
   tkLPOS fn1arg EMIT(opFnLpos);
   tkLTRIM_ fn1arg EMIT(opFnLtrim_);
   tkMID_ fn23arg; <Cg2or3Args(opFnMid_2)>
   tkMKD_ fn1arg EMIT(opFnMkd_);
   tkMKDMBF_ fn1arg EMIT(opFnMkdmbf_);
   tkMKI_ fn1arg EMIT(opFnMki_);
   tkMKL_ fn1arg EMIT(opFnMkl_);
   tkMKS_ fn1arg EMIT(opFnMks_);
   tkMKSMBF_ fn1arg EMIT(opFnMksmbf_);
   tkOCT_ fn1arg EMIT(opFnOct_);
   tkPEEK fn1arg EMIT(opFnPeek);
   tkPEN fn1arg EMIT(opFnPen);
   tkPLAY fn1arg EMIT(opFnPlay);
   tkPMAP fn2arg EMIT(opFnPmap);
   tkPOINT fn12arg; <Cg1or2Args(opFnPoint1)>
   tkPOS fn1arg EMIT(opFnPos);
   tkRIGHT_ fn2arg EMIT(opFnRight_);
   tkRND [fn1arg]; <Cg0or1Args(opFnRnd)>
   tkRTRIM_ fn1arg EMIT(opFnRtrim_);
   tkSADD tkLParen IdAryElemRef tkRParen EMIT(opFnSadd);
   tkSCREEN fn23arg; <Cg2or3Args(opFnScreen2)>
   tkSEEK fn1arg EMIT(opFnSeek);
   tkSETMEM fn1arg EMIT(opFnSetmem);
   tkSGN fn1arg EMIT(opFnSgn);
   tkSHELL fn1arg EMIT(opFnShell);
   tkSIN fn1arg EMIT(opFnSin);
   tkSPACE_ fn1arg EMIT(opFnSpace_);
   tkSQR fn1arg EMIT(opFnSqr);
   tkSTICK fn1arg EMIT(opFnStick);
   tkSTR_ fn1arg EMIT(opFnStr_);
   tkSTRIG fn1arg EMIT(opFnStrig);
   tkSTRING_ fn2arg EMIT(opFnString_);
   tkTAN fn1arg EMIT(opFnTan);
   tkTIME_ EMIT(opFnTime_);
   tkTIMER EMIT(opFnTimer);
   tkUBOUND fnBoundArg; <Cg1or2Args(opFnUbound1)>
   tkUCASE_ fn1arg EMIT(opFnUcase_);
   tkVAL fn1arg EMIT(opFnVal);
   tkVARPTR tkLParen IdAryElemRef tkRParen EMIT(opFnVarptr);
   tkVARPTR_ tkLParen IdAryElemRef tkRParen EMIT(opFnVarptr_) EMITFFFF;
   tkVARSEG tkLParen IdAryElemRef tkRParen EMIT(opFnVarseg);

/* please keep the nonterminals organized alphabetically */
/* state nonterminals begin with lower case */
/* external nonterminals begin with upper case */

NonTerminals:

/* ACTION non terminals, by convention, don't consume anything, */
/* they just take some parser action (like setting a state variable) */
/* and always return PR_GoodSyntax */

ACTIONidCommon:
   EXTERNAL;
ACTIONidShared:
   EXTERNAL;
ACTIONidStatic:
   EXTERNAL;
Assignment:
   EXTERNAL MSG_ExpAssignment;  /* "var=exp" */
/* AsClause, AsClauseAny and AsClausePrim are invoked by NtId() */
/* accepts:  AS INTEGER...STRING */
AsClausePrim:
   ((tkINTEGER EMIT(opAsTypeExp) EMIT(ET_I2)) |
    (tkLONG EMIT(opAsTypeExp) EMIT(ET_I4)) |
    (tkSINGLE EMIT(opAsTypeExp) EMIT(ET_R4)) |
    (tkDOUBLE EMIT(opAsTypeExp) EMIT(ET_R8)) |
    (tkSTRING EMIT(opAsTypeExp) EMIT(ET_SD)));
    <INDEX>
/* accepts:  AS INTEGER...STRING or AS <userType> */
AsClause:
    AsClausePrim | (EMIT(opAsType) IdType);
   <INDEX>
/* accepts:  AS INTEGER...STRING or AS <userType> or AS ANY */
AsClauseAny:
    AsClausePrim |
    (tkANY EMIT(opAsTypeExp) EMIT(ET_IMP)) |
    (EMIT(opAsType) IdType);
    <INDEX>
caseItem:
   (Exp ((tkTO Exp EMIT(opStCaseTo)) | EMIT(opStCase))) |
   ([tkIS] CaseRelation);
CaseRelation:
   EXTERNAL MSG_ExpRel;  /* <,<=,=,<>,>,>= */
commaExp:
   tkComma Exp;
/* ',exp' ==> <exp>;  ',...' ==>opUndef;  '' ==> opUndef */
commaOptExp:
   commaOptExpNil | EMIT(opUndef);
/* ',exp' ==> <exp>;  ',...' ==>opUndef; */
commaOptExpNil:
   (CommaNoEos (Exp | EMIT(opUndef)));
/* ',exp' ==> <exp>;  ',...' ==>opNull; */
commaOptExpNull:
   (CommaNoEos (Exp | EMIT(opNull)));
CommaNoEos:
   EXTERNAL;
ConstAssign:
   EXTERNAL;
coordStep:
   (tkSTEP fn2arg EMIT(opCoordStep)) | (fn2arg EMIT(opCoord));
coord2Step:
   (tkSTEP fn2arg EMIT(opCoordStepSecond)) | (fn2arg EMIT(opCoordSecond));
DeflistI2:
   EXTERNAL;  /* "letter" */
DeflistI4:
   EXTERNAL;  /* "letter" */
DeflistR4:
   EXTERNAL;  /* "letter" */
DeflistR8:
   EXTERNAL;  /* "letter" */
DeflistSD:
   EXTERNAL;  /* "letter" */
EndPrint:
   EXTERNAL;
EndPrintExp:
   EXTERNAL;
EMITFFFF:
   EMIT(UNDEFINED);
ErrIfNot1st:
   EXTERNAL; /* generates error if not 1st statement on line */
event:
   (tkCOM fn1arg EMIT(opEvCom)) |
   (tkKEY fn1arg EMIT(opEvKey)) |
   (tkPEN EMIT(opEvPen)) |
   (tkPLAY fn1arg EMIT(opEvPlay1)) |
   (tkSIGNAL fn1arg EMIT(opEvSignal)) |
   (tkSTRIG fn1arg EMIT(opEvStrig)) |
   (tkTIMER fn1arg EMIT(opEvTimer1)) |
   (tkUEVENT EMIT(opEvUEvent));
evSwitch:
   (tkON EMIT(opEvOn)) | (tkOFF EMIT(opEvOff)) | (tkSTOP EMIT(opEvStop));
Exp:
   EXTERNAL MSG_ExpExp;  /* "expression" */
exp12:
   commaExp optCommaExp;
expCommaExp:
   Exp tkComma Exp;
fn1arg:
   tkLParen Exp tkRParen;
fn12arg:                /* expects 1 or 2 arguments */
   tkLParen Exp optCommaExp tkRParen;
fn2arg:
   tkLParen expCommaExp tkRParen;
fn23arg:                /* expects 2 or 3 arguments */
   tkLParen Exp exp12 tkRParen;
fnBoundArg:
   tkLParen IdArray optCommaExp tkRParen;
IdAry:
   EXTERNAL MSG_ExpVar;  /* "id[()]" */
IdAryDim:
   EXTERNAL MSG_ExpVar;  /* "id[(exp [TO exp][,...])]" */
IdAryRedim:
   EXTERNAL MSG_ExpVar;  /* "id[(exp [TO exp][,...])]" */
IdAryElem:
   EXTERNAL MSG_ExpVar;  /* "id[(exp[,exp...])]" */
IdAryElemRef:
   EXTERNAL MSG_ExpVar;  /* "id[(exp[,exp...])]" */
IdAryGetPut:
   EXTERNAL MSG_ExpVar;  /* "id[(exp[,exp...])]" */
IdAryI:
   EXTERNAL MSG_ExpVar;  /* "id[([integer])]" */
IdArray:
   EXTERNAL MSG_ExpVar;  /* "variable" */
IdCallArg:
   EXTERNAL MSG_ExpIdCallArg;  /* "[BYVAL] [SEG] expression" */
IdFor:
   EXTERNAL MSG_ExpVar;  /* "variable" */
IdFn:
   EXTERNAL;  /* "FNid" - error if not found */
IdFuncDecl:
   EXTERNAL;  /* "id" - error if not found */
IdFuncDef:
   EXTERNAL;  /* "id" - error if not found */
IdType:
   EXTERNAL MSG_ExpId;  /* "identifier" */
IdNamCom:
   EXTERNAL;  /* "id" - error if not found */
IdParm:
   EXTERNAL MSG_ExpIdParm;  /* "[BYVAL | SEG] variable" */
IdSubDecl:
   EXTERNAL;  /* "id" - error if not found */
IdSubDef:
   EXTERNAL;  /* "id" - error if not found */
IdSubRef:
   EXTERNAL;  /* "id" - error if not found */
IfStmt:
   EXTERNAL;
LabLn:
   EXTERNAL MSG_ExpLabLn;  /* "label or line number" */
   /* causes 16 bit oNam for label to be emitted */
lbsExpComma:
   tkLbs Exp EMIT(opLbs) EMIT(opChanOut) tkComma;
lbsInpExpComma:
   tkLbs Exp EMIT(opLbs) EMIT(opInputChan) tkComma;
LitString:
   EXTERNAL MSG_ExpLitString;  /* "string" */
Lit0:
   EXTERNAL MSG_ExpLit0;  /* "0" */
Lit1:
   EXTERNAL MSG_ExpLit1;  /* "1" */
Ln:
   EXTERNAL MSG_ExpLabLn;  /* "line number" */
   /* causes 16 bit oNam for line number to be emitted */
NArgsMax3:
   EXTERNAL MSG_ExpNArgs;  /* "[exp],..." */
NArgsMax4:
   EXTERNAL MSG_ExpNArgs;  /* "[exp],..." */
NArgsMax5:
   EXTERNAL MSG_ExpNArgs;  /* "[exp],..." */
   /* flag word (1) is emitted for each specified arg */
   /* flag word (0) is emitted for each unspecified arg */
optCommaExp:
   [commaExp];
optFilenum:
   (tkLbs Exp EMIT(opLbs)) | Exp;
parms:
   [tkLParen MARK(6) [IdParm {tkComma IdParm}] tkRParen];
parms1:
   [tkLParen MARK(6) IdParm {tkComma IdParm} tkRParen];
printItem:
   (EndPrint) |
   (tkTAB fn1arg EMIT(opPrintTab)) |
   (tkSPC fn1arg EMIT(opPrintSpc)) |
   (tkComma EMIT(opPrintComma)) |
   (tkSColon EMIT(opPrintSemi)) |
   (Exp (tkComma EMIT(opPrintItemComma)) |
        (tkSColon EMIT(opPrintItemSemi)) |
        (EndPrintExp));
printList:
   {printItem} [tkUSING Exp EMIT(opUsing) tkSColon {printUsingItem}];

/* The items which can follow USING differ in several ways		      */
/*  (1) ',' characters are mapped to ';' since the "advance to next print     */
/*	field" action of ',' doesn't make sense with USING.		      */
/*									      */
/*  (2) No extra ';' or ',' are allowed (i.e. "print using x,,y" is illegal)  */
/*	An exception to this is that a single 				      */
/*	';' and ',' are allowed following TAB(x) 			      */
/*	and SPC(x) where they are ignored. In a normal PRINT item list such   */
/*	occurrences of ';' and ',' would generate opPrintSemi and opPrintComma*/
/*	opcodes, respectively.						      */
printUsingItem:
   (EndPrint) |
   (((tkTAB fn1arg EMIT(opPrintTab)) |
     (tkSPC fn1arg EMIT(opPrintSpc)))
	       [tkSColon | tkComma]) |
   (Exp ((tkComma | tkSColon) EMIT(opPrintItemSemi)) |
        (EndPrintExp));
RwB:
   EXTERNAL MSG_ExpRwB;  /* "B" */
RwF:
   EXTERNAL MSG_ExpRwF;  /* "F" */
RwBF:
   EXTERNAL MSG_ExpRwBF;  /* "BF" */
Statement:
   EXTERNAL MSG_ExpStatement;  /* "statement" */
StatementList:
   EXTERNAL MSG_ExpStatement;  /* "statement" */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -