📄 qbasbnf.prs
字号:
TOKENS:
/* prslex.c assumes next 5 tokens are contiguous */
tkEtInteger("%"), /* short integer type char */
tkEtLong("&"), /* long integer type char */
tkEtSingle("!"), /* single precision type char */
tkLbs ("#"), /* double precision type char */
tkEtString("$"), /* string type char */
tkDQuote("\042"),
tkIdiv ("\\", operator),
tkNewLine ("\n"),
tkHTab ("\t"),
tkPwr ("^", operator),
tkUScore ("_"),
tkSQuote ("'"),
tkLParen ("(", operator),
tkRParen (")", operator),
tkMult ("*", operator),
tkAdd ("+", operator),
tkComma (","),
tkMinus ("-", operator),
tkDiv ("/", operator),
tkColon (":"),
tkSColon (";"),
tkLT ("<", operator),
tkEQ ("=", operator),
tkGT (">", operator),
tkQMark ("?"),
/* BASIC's lexical analyzer requires that reserved words are organized */
/* in alphabetical order */
tkABS ("ABS"),
tkACCESS ("ACCESS"),
tkALIAS ("ALIAS"),
tkAND ("AND", operator),
tkANY ("ANY"),
tkAPPEND ("APPEND"),
tkAS ("AS"),
tkASC ("ASC"),
tkATN ("ATN"),
tkBASE ("BASE"),
tkBEEP ("BEEP"),
tkBINARY ("BINARY"),
tkBLOAD ("BLOAD"),
tkBSAVE ("BSAVE"),
tkBYVAL ("BYVAL"),
tkCALL ("CALL"),
tkCALLS ("CALLS"),
tkCASE ("CASE"),
tkCDBL ("CDBL"),
tkCDECL ("CDECL"),
tkCHAIN ("CHAIN"),
tkCHDIR ("CHDIR"),
tkCHR_ ("CHR$"),
tkCINT ("CINT"),
tkCIRCLE ("CIRCLE"),
tkCLEAR ("CLEAR"),
tkCLNG ("CLNG"),
tkCLOSE ("CLOSE"),
tkCLS ("CLS"),
tkCOLOR ("COLOR"),
tkCOM ("COM"),
tkCOMMAND_ ("COMMAND$"),
tkCOMMON ("COMMON", no_direct),
tkCONST ("CONST", no_direct),
tkCOS ("COS"),
tkCSNG ("CSNG"),
tkCSRLIN ("CSRLIN"),
tkCVD ("CVD"),
tkCVDMBF ("CVDMBF"),
tkCVI ("CVI"),
tkCVL ("CVL"),
tkCVS ("CVS"),
tkCVSMBF ("CVSMBF"),
tkDATA ("DATA", no_direct),
tkDATE_ ("DATE$"),
tkDECLARE ("DECLARE", no_direct),
tkDEF ("DEF"),
tkDEFDBL ("DEFDBL", no_direct),
tkDEFINT ("DEFINT", no_direct),
tkDEFLNG ("DEFLNG", no_direct),
tkDEFSNG ("DEFSNG", no_direct),
tkDEFSTR ("DEFSTR", no_direct),
tkDIM ("DIM", no_direct),
tkDO ("DO"),
tkDOUBLE ("DOUBLE"),
tkDRAW ("DRAW"),
tkELSE ("ELSE"),
tkELSEIF ("ELSEIF", no_direct),
tkEND ("END"),
tkENDIF ("ENDIF"),
tkENVIRON ("ENVIRON"),
tkENVIRON_ ("ENVIRON$"),
tkEOF ("EOF"),
tkEQV ("EQV", operator),
tkERASE ("ERASE"),
tkERDEV ("ERDEV"),
tkERDEV_ ("ERDEV$"),
tkERL ("ERL"),
tkERR ("ERR"),
tkERROR ("ERROR"),
tkEXIT ("EXIT"),
tkEXP ("EXP"),
tkFIELD ("FIELD"),
tkFILEATTR ("FILEATTR"),
tkFILES ("FILES"),
tkFIX ("FIX"),
tkFOR ("FOR"),
tkFRE ("FRE"),
tkFREEFILE ("FREEFILE"),
tkFUNCTION ("FUNCTION", no_direct),
tkGET ("GET"),
tkGOSUB ("GOSUB"),
tkGOTO ("GOTO"),
tkHEX_ ("HEX$"),
tkIF ("IF"),
tkIMP ("IMP", operator),
tkINKEY_ ("INKEY$"),
tkINP ("INP"),
tkINPUT ("INPUT"),
tkINPUT_ ("INPUT$"),
tkINSTR ("INSTR"),
tkINT ("INT"),
tkINTEGER ("INTEGER"),
tkIOCTL ("IOCTL"),
tkIOCTL_ ("IOCTL$"),
tkIS ("IS"),
tkKEY ("KEY"),
tkKILL ("KILL"),
tkLBOUND ("LBOUND"),
tkLCASE_ ("LCASE$"),
tkLEFT_ ("LEFT$"),
tkLEN ("LEN"),
tkLET ("LET"),
tkLINE ("LINE"),
tkLIST ("LIST"),
tkLOC ("LOC"),
tkLOCAL ("LOCAL"),
tkLOCATE ("LOCATE"),
tkLOCK ("LOCK"),
tkLOF("LOF"),
tkLOG ("LOG"),
tkLONG ("LONG"),
tkLOOP ("LOOP"),
tkLPOS ("LPOS"),
tkLPRINT ("LPRINT"),
tkLSET ("LSET"),
tkLTRIM_ ("LTRIM$"),
tkMID_ ("MID$"),
tkMKD_ ("MKD$"),
tkMKDIR ("MKDIR"),
tkMKDMBF_ ("MKDMBF$"),
tkMKI_ ("MKI$"),
tkMKL_ ("MKL$"),
tkMKS_ ("MKS$"),
tkMKSMBF_ ("MKSMBF$"),
tkMOD ("MOD", operator),
tkNAME ("NAME"),
tkNEXT ("NEXT"),
tkNOT ("NOT", operator),
tkOCT_ ("OCT$"),
tkOFF ("OFF"),
tkON ("ON"),
tkOPEN ("OPEN"),
tkOPTION ("OPTION", no_direct),
tkOR ("OR", operator),
tkOUT ("OUT"),
tkOUTPUT ("OUTPUT"),
tkPAINT ("PAINT"),
tkPALETTE ("PALETTE"),
tkPCOPY ("PCOPY"),
tkPEEK ("PEEK"),
tkPEN ("PEN"),
tkPLAY ("PLAY"),
tkPMAP ("PMAP"),
tkPOINT ("POINT"),
tkPOKE ("POKE"),
tkPOS ("POS"),
tkPRESET ("PRESET"),
tkPRINT ("PRINT"),
tkPSET ("PSET"),
tkPUT ("PUT"),
tkRANDOM ("RANDOM"),
tkRANDOMIZE ("RANDOMIZE"),
tkREAD ("READ"),
tkREDIM ("REDIM", no_direct),
tkREM ("REM"),
tkRESET ("RESET"),
tkRESTORE ("RESTORE"),
tkRESUME ("RESUME"),
tkRETURN ("RETURN"),
tkRIGHT_ ("RIGHT$"),
tkRMDIR ("RMDIR"),
tkRND ("RND"),
tkRSET ("RSET"),
tkRTRIM_ ("RTRIM$"),
tkRUN ("RUN"),
tkSADD ("SADD"),
tkSCREEN ("SCREEN"),
tkSEEK ("SEEK"),
tkSEG ("SEG"),
tkSELECT ("SELECT"),
tkSETMEM ("SETMEM"),
tkSGN ("SGN"),
tkSHARED ("SHARED", no_direct),
tkSHELL ("SHELL"),
tkSIGNAL ("SIGNAL"),
tkSIN ("SIN"),
tkSINGLE ("SINGLE"),
tkSLEEP ("SLEEP"),
tkSOUND ("SOUND"),
tkSPACE_ ("SPACE$"),
tkSPC ("SPC"),
tkSQR ("SQR"),
tkSTATIC ("STATIC", no_direct),
tkSTEP ("STEP"),
tkSTICK ("STICK"),
tkSTOP ("STOP"),
tkSTR_ ("STR$"),
tkSTRIG ("STRIG"),
tkSTRING_ ("STRING$"),
tkSTRING ("STRING"),
tkSUB ("SUB", no_direct),
tkSWAP ("SWAP"),
tkSYSTEM ("SYSTEM"),
tkTAB ("TAB"),
tkTAN ("TAN"),
tkTHEN ("THEN"),
tkTIME_ ("TIME$"),
tkTIMER ("TIMER"),
tkTO ("TO"),
tkTROFF ("TROFF"),
tkTRON ("TRON"),
tkTYPE ("TYPE", no_direct),
tkUBOUND ("UBOUND"),
tkUCASE_ ("UCASE$"),
tkUEVENT ("UEVENT"),
tkUNLOCK ("UNLOCK"),
tkUNTIL ("UNTIL"),
tkUSING ("USING"),
tkVAL ("VAL"),
tkVARPTR ("VARPTR"),
tkVARPTR_ ("VARPTR$"),
tkVARSEG ("VARSEG"),
tkVIEW ("VIEW"),
tkWAIT ("WAIT"),
tkWEND ("WEND"),
tkWHILE ("WHILE"),
tkWIDTH ("WIDTH"),
tkWINDOW ("WINDOW"),
tkWRITE ("WRITE"),
tkXOR ("XOR", operator);
Statements:
tkBEEP EMIT(opStBeep);
tkBLOAD Exp optCommaExp;
<Cg1or2Args(opStBload1)>
tkBSAVE expCommaExp commaExp EMIT(opStBsave);
tkCALL (MARK(1) IdSubRef
[tkLParen IdCallArg {tkComma IdCallArg} tkRParen]);
<CgCall(opStCall)>
tkCALLS MARK(1) IdSubRef
[tkLParen Exp {tkComma Exp} tkRParen];
<CgCall(opStCalls)>
tkCASE (tkELSE EMIT(opStCaseElse)) | (caseItem {tkComma caseItem});
tkCHAIN Exp EMIT(opStChain);
tkCHDIR Exp EMIT(opStChdir);
/* DELETE commaOptExpNull */
tkCIRCLE coordStep commaExp
[tkComma [Exp MARK(1)]
[CommaNoEos (Exp | EMIT(opNull)) EMIT(opCircleStart)
[CommaNoEos [Exp EMIT(opCircleEnd)]
[commaExp EMIT(opCircleAspect)]]]];
<CgCircle(opStCircle)>
/* tkCIRCLE coordStep commaExp [tkComma [Exp MARK(1)] */
/* [commaOptExpNull EMIT(opCircleStart) */
/* [commaOptExpNull EMIT(opCircleEnd) */
/* [commaExp EMIT(opCircleAspect)]]]]; */
/* <CgCircle(opStCircle)> */
tkCLEAR NArgsMax3;
<CgStmtCnt(opStClear)>
tkCLOSE [optFilenum {tkComma optFilenum}];
<CgStmtCnt(opStClose)>
tkCLS (Exp | EMIT(opUndef)) EMIT(opStCls);
tkCOLOR NArgsMax3;
<CgStmtCnt(opStColor)>
tkCOM fn1arg EMIT(opEvCom) evSwitch;
tkCOMMON (tkSHARED EMIT(opShared) EMIT(opStCommon) EMITFFFF
((tkDiv IdNamCom tkDiv) | EMITFFFF) ACTIONidShared) |
(EMIT(opStCommon) EMITFFFF
((tkDiv IdNamCom tkDiv) | EMITFFFF))
ACTIONidCommon IdAryI {tkComma IdAryI};
tkCONST EMIT(opStConst) ConstAssign {tkComma ConstAssign};
/* tkDATA is handled specially by parser */
tkDATE_ tkEQ Exp EMIT(opStDate_);
tkDECLARE
((tkFUNCTION IdFuncDecl) | (tkSUB IdSubDecl))
/* removed CDECL and ALIAS support */
MARK(3) parms;
<CgDeclare(opStDeclare)>
tkDEF IdFn MARK(3) parms [tkEQ MARK(5) Exp];
<CgDeclare(opStDefFn)>
tkDEF tkSEG [tkEQ Exp];
<Cg0or1Args(opStDefSeg0)>
tkDEFINT DeflistI2;
tkDEFLNG DeflistI4;
tkDEFSNG DeflistR4;
tkDEFDBL DeflistR8;
tkDEFSTR DeflistSD;
tkDIM [tkSHARED ACTIONidShared EMIT(opShared)] EMIT(opStDim) EMITFFFF
IdAryDim {tkComma IdAryDim};
tkDO (tkWHILE Exp EMIT(opStDoWhile) EMITFFFF) |
(tkUNTIL Exp EMIT(opStDoUntil) EMITFFFF) |
(EMIT(opStDo));
tkDRAW Exp EMIT(opStDraw);
tkELSEIF Exp tkTHEN EMIT(opStElseIf) EMITFFFF [StatementList];
tkELSE EMIT(opStElse) EMITFFFF [StatementList];
tkEND (tkDEF EMIT(opStEndDef) EMIT(2) EMITFFFF) |
(tkFUNCTION EMIT(opStEndProc)) |
(tkIF EMIT(opStEndIfBlock) ErrIfNot1st) |
(tkSELECT EMIT(opStEndSelect)) |
(tkSUB EMIT(opStEndProc)) |
(tkTYPE EMIT(opStEndType) EMITFFFF) |
(EMIT(opStEnd));
tkENDIF EMIT(opStEndIfBlock) ErrIfNot1st;
tkENVIRON Exp EMIT(opStEnviron);
tkERASE IdArray {tkComma IdArray};
<CgStmtCnt(opStErase)>
tkERROR Exp EMIT(opStError);
tkEXIT (((tkDEF | tkFUNCTION | tkSUB) EMIT(opStExitProc)) |
(tkDO EMIT(opStExitDo)) |
(tkFOR EMIT(opStExitFor)) EMITFFFF);
tkFIELD optFilenum EMIT(opFieldInit)
commaExp tkAS IdAryElem EMIT(opFieldItem)
{commaExp tkAS IdAryElem EMIT(opFieldItem)};
tkFILES [Exp];
<Cg0or1Args(opStFiles0)>
tkFOR IdFor tkEQ Exp tkTO Exp
((tkSTEP Exp EMIT(opStForStep)) | EMIT(opStFor))
EMITFFFF EMITFFFF; /* oBp and oText operands */
/* IdFor gives error if the index var was not a scalar */
tkFUNCTION ErrIfNot1st IdFuncDef MARK(3) parms [tkSTATIC MARK(4)];
<CgDeclare(opStFunction)>
/* GET [#]chan [, [rec] [, id]] */
tkGET optFilenum
(((tkComma
((Exp (tkComma IdAryElemRef EMIT(opStGetRec3) EMITFFFF) | EMIT(opStGet2)) |
(tkComma IdAryElemRef EMIT(opStGetRec2) EMITFFFF)))) |
EMIT(opStGet1));
tkGET coordStep tkMinus coord2Step tkComma IdAryGetPut EMIT(opStGraphicsGet);
tkGOSUB EMIT(opStGosub) LabLn;
tkGOTO EMIT(opStGoto) LabLn;
tkIF Exp IfStmt;
tkINPUT
[(lbsInpExpComma MARK(16)) |
(tkSColon MARK(2) [LitString MARK(4) (tkSColon | (tkComma MARK(1)))]) |
(LitString MARK(4) (tkSColon | (tkComma MARK(1))))]
MARK(8) IdAryElemRef EMIT(opStInput) {tkComma IdAryElemRef EMIT(opStInput)}
EMIT(opInputEos);
<CgInput(opInputPrompt)>
tkIOCTL optFilenum commaExp EMIT(opStIoctl);
tkKEY ((tkOFF EMIT(opStKey) EMIT(0)) |
(tkON EMIT(opStKey) EMIT(1)) |
(tkLIST EMIT(opStKey) EMIT(2)) |
(fn1arg EMIT(opEvKey) evSwitch) |
(expCommaExp EMIT(opStKeyMap)));
tkKILL Exp EMIT(opStKill);
tkLET EMIT(opStLet) Assignment;
tkLINE [coordStep] tkMinus coord2Step
[tkComma [Exp MARK(1)]
[tkComma [(RwBF MARK(3)) | (RwB (RwF MARK(3)) | MARK(2))]
[commaExp MARK(4)]]];
<CgLineStmt(opStLine)>
tkLINE tkINPUT
[(lbsInpExpComma MARK(16)) |
(tkSColon MARK(2) [LitString MARK(4) (tkSColon | (tkComma MARK(1)))]) |
(LitString MARK(4) (tkSColon | (tkComma MARK(1))))]
IdAryElemRef;
<CgInput(opStLineInput)>
tkLOCATE NArgsMax5;
<CgStmtCnt(opStLocate)>
tkLOCK optFilenum
[tkComma (Exp MARK(1) [tkTO MARK(2) Exp]) | (tkTO MARK(3) Exp)];
<CgLock(opStLock)>
tkLOOP ((tkWHILE Exp EMIT(opStLoopWhile)) |
(tkUNTIL Exp EMIT(opStLoopUntil)) |
(EMIT(opStLoop)))
EMITFFFF;
tkLPRINT EMIT(opStLprint) printList;
tkLSET MARK(1) IdAryElemRef MARK(2) tkEQ Exp;
<CgMoveOpsToEnd(opStLset)>
tkMID_ tkLParen MARK(1) IdAryElemRef MARK(2) exp12 tkRParen tkEQ Exp;
<Cg3or4Args(opStMid_2)>
tkMKDIR Exp EMIT(opStMkdir);
tkNAME Exp tkAS Exp EMIT(opStName);
tkNEXT (IdFor EMIT(opStNextId) EMITFFFF EMITFFFF
{tkComma IdFor
EMIT(opStNextId) EMITFFFF EMITFFFF}) |
(EMIT(opStNext) EMITFFFF EMITFFFF);
tkON (event (tkGOSUB ((Lit0 EMIT(opEvGosub) EMITFFFF) |
(EMIT(opEvGosub) LabLn)))) |
(tkERROR tkGOTO ((Lit0 EMIT(opStOnError) EMITFFFF) |
(EMIT(opStOnError) LabLn))) |
(Exp (tkGOTO MARK(1)) | (tkGOSUB MARK(2)) LabLn {tkComma LabLn});
<CgOn()>
tkOPEN Exp
([(tkFOR ((tkAPPEND MARK(1)) |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -