Cmd /* Interactive commands */ : eol /* Blank line */ | KBreak LineId eol /* Set break point */ | KCont eol /* Single step one line */ | KCont KNumber eol /* Single step N times */ | DelCmd /* Delete range of lines */ | DumpTreeCmd /* For internal debugging only */ | KEdit eol /* Edit program */ | KHelp eol /* Print general help info */ | ListCmd /* List program */ | LoadCmd /* Load program lines */ | KQuit eol /* Exit */ | RenCmd /* Renumber lines */ | KRun eol /* Run program */ | KRun KLoop KNumber eol /* Run program N times */ | SaveCmd /* Save program */ | KScratch eol /* Clear program workspace */ | KStep eol /* Start in single step mode */ | Stmt eol /* Execute statement */ | OptLineNum OptLineLab Cmt1 /* Add or replace line in program */ | OptLineNum OptLineLab Stmt Cmt2 | ExtraHelp /* Extra help commands */ ; eol /* End-of-line */ : '\n' /* EOL char */ | '!' /* Comment */ ; Cmt1 /* Comment not following Stmt */ : KBang /* '!' char */ | KRem /* Remark */ | '\n' /* EOL char */ ; Cmt2 /* Comment following Stmt */ : KBang /* '!' char */ | '\n' /* EOL char */ ; OptLineLab /* Optional line label */ : /* Blank */ | KLabelId /* Name with suffix ':' */ ; LoadCmd /* Load program or subprogram */ : KLoad OptFileName eol /* Load or reload program */ | KLoadSub FileName eol /* Load subprogram from file */ ; SaveCmd /* Save or resave program */ : KSave OptFileName eol ; OptFileName /* Optional file name */ : /* Blank (requests default) */ | FileName /* File name */ ; FileName /* File name */ : KString /* Quoted string */ ; DelCmd /* Delete program lines */ : KDel Range eol /* KNOWS ABOUT DELETE STRATEGY!!! */ ; Range /* Line number range */ : LineNum /* One line number */ | LineNum KAddop LineNum /* Range of line numbers sep by '-' */ | '%' /* All lines */ ; RenCmd /* Renumber lines */ : KRenum eol /* Renumber all lines */ | KRenum LineNum eol /* Renumber starting at LineNum */ | KRenum KIn Range eol /* Renumber lines in Range */ | KRenum LineNum KIn Range eol /* Renumber lines in Range */ ; OptLineNum /* Optional line number */ : KNoNumber /* Blank gets auto line number */ | LineNum /* Line number */ ; LineNum /* Line number */ : KNumber /* An integer */ ; LineId /* Line identifier */ : KNumber /* Number */ | KId /* Label */ ; LineList /* List of line identifiers */ : LineId | LineList ',' LineId ; ListCmd /* List program lines */ : KList Range eol /* List program lines in range */ | KList eol /* List all program lines */ ; DumpTreeCmd /* Dump interpreter internals */ : KDumpTree Range eol | KDumpTree eol ; Stmt /* Program statement */ : KAssign '@' KId KTo Expr KString | KAssign '@' KId KTo Expr | DataStmt | DimStmt | KEnd | KError KReturn | KError Expr | ForStmt | Function | KGosub LineId | KGoto LineId | IfStmt | InputStmt | LetStmt | KLogfile KIs Expr | KElse | KEndif | MatStmt | KNext KId | KNext KIntId | KOff KError | KOn Expr KGoto LineList | KOn Expr KGosub LineList | KOn KError KGosub LineId | KOn KError KGoto LineId | KOption KString /* Debug options, n = +, -, or number */ /* Bn = print comments */ /* Pn = always output prompt */ /* Fn = line handling */ /* Sn = stack handling */ /* Dn = dim handling */ /* Tn = trace line numbers */ /* Ln = lexical decoder */ | KPause | PrintStmt | KRandomize | KRandomize Expr | KRestore | KReturn | KStop | KStop Expr | KWait Expr | AbortCtrlStmt | ChooserStmt | GetDmiPosAcqStmt | GetPatValStmt | SetPatPosStmt | error ; DimStmt : KDim DimList ; DimList : DimAnyItem | DimList ',' DimAnyItem ; DimAnyItem : DimItem /* Numbers or default strings */ | DimItem '[' KNumber ']' /* Strings only */ ; DimItem : DimVar '(' Expr ')' | DimVar '(' Expr ',' Expr ')' | DimVar ; DimVar : KId | KStringId | KIntId ; LetStmt : KLet Variable '=' Expr | Variable '=' Expr ; MatStmt : KMat KId '=' KId | KMat KId '=' KId KAddop KId | KMat KId '=' KId KMulop KId | KMat KId '=' '(' Expr ')' | KMat KId '=' '(' Expr ')' KAddop KId | KMat KId '=' '(' Expr ')' KMulop KId | KMat KId '=' KFunction | KMat KId '=' KFunction '(' KId ')' | KMat KId '=' KAddop KId | KMat KId '=' KIdn | KMat KId '=' KZer | KMat KId '=' KInv '(' KId ')' | KMat KId '=' KTrn '(' KId ')' ; IfStmt : KIf Expr KThen ObjStmt KElse ObjStmt | KIf Expr KThen ObjStmt | KIf Expr KThen | KIf Expr KGoto LineId ; ObjStmt : LineId | Stmt ; ForStmt : KFor KId '=' Expr KTo Expr KStep Expr | KFor KId '=' Expr KTo Expr | KFor KIntId '=' Expr KTo Expr KStep Expr | KFor KIntId '=' Expr KTo Expr ; PrintStmt : PrintOut PExprList | PrintOut PExprList Expr | KMat PrintOut MExprList | KMat PrintOut MExprList SimpleVar | KPrinter KIs Expr ; PrintOut : KPrint | KOutput '@' KId ';' ; PExprList : /* empty */ | PExprList PExpr ; PExpr : ',' | ';' | Expr ',' | Expr ';' ; MExprList : /* empty */ | MExprList MExpr ; MExpr : ',' | ';' | SimpleVar ',' | SimpleVar ';' ; InputStmt : KInput VarList | KInput KString ',' VarList /* prompt string */ | KInput KString /* prompt string */ | KRead VarList | KEnter '@' KId ';' VarList | KEnterLine '@' KId ';' VarList | KMat KInput SimpleVarList | KMat KEnter '@' KId ';' SimpleVarList | KMat KRead SimpleVarList ; VarList : Variable | VarList ',' Variable ; SimpleVarList : SimpleVar | SimpleVarList ',' SimpleVar ; DataStmt : KData DExprList ; DExprList : DConstant | KNumber KMulop DConstant | DExprList ',' DConstant | DExprList ',' KNumber KMulop DConstant ; DConstant : Constant | KAddop KNumber ; Constant : KNumber | KMaxReal | KHexInt | KString ; Variable : SimpleVar | SimpleVar '(' Expr ')' | SimpleVar '(' Expr ',' Expr ')' | SimpleVar '(' Expr ',' Expr ',' Expr ')' ; SimpleVar : KId | KStringId | KIntId ; Expr /* Expressions */ : Constant | Variable | Variable '[' Expr ']' /* Substring to end */ | Variable '[' Expr ',' Expr ']' /* Substring to position */ | Variable '[' Expr ';' Expr ']' /* Substring N chars */ | Expr KAddop Expr /* Add operators (+, -) */ | Expr KMulop Expr /* Multiply operators (*, /, &) */ | Expr KExpop Expr /* Exponentiation operator (^) */ | Expr '=' Expr /* Equal operator (assign, relop) */ | Expr KRelop Expr /* Relation ops (<, <=, >, >=, <>) */ | Expr KLogop Expr /* Logical operators (and, or) */ | KAddop Expr %prec UMINUS /* negation */ | KNot Expr /* Logical not */ | '(' Expr ')' /* Grouping with parentheses */ | KDet '(' KId ')' /* Determinant of matrix */ | KDot '(' KId ',' KId ')' /* Dot product of matrix */ | KSum '(' KId ')' /* Sum of matrix */ | KErrl '(' LineId ')' /* Return 1 if error was in line */ | Function /* Function call */ ; Function : KFunction /* Function call with without arguments, without parens */ | KFunction '(' ')' /* Function call without arguments but with parens */ | KFunction '(' Expr ')' /* Function call with 1 argument */ | KFunction '(' Expr ',' Expr ')' /* 2 arguments */ | KFunction '(' Expr ',' Expr ',' Expr ')' /* 3 args */ | KFunction '(' Expr ',' Expr ',' Expr ',' Expr ')' /* 4 args */ | KFunction '(' Expr ',' Expr ',' Expr ',' Expr ',' | KFunction '(' Expr ',' Expr ',' Expr ',' Expr ',' | KFunction '(' Expr ',' Expr ',' Expr ',' Expr ',' | KFunction '(' Expr ',' Expr ',' Expr ',' Expr ',' | KFunction '(' Expr ',' Expr ',' Expr ',' Expr ',' ; ExtraHelp : KHelp KString eol /* Search help text for string */ | KHelp KMore eol /* Show full command list */ | KHelp KGosub eol /* Show all "!!" comment lines */ | KHelp KGosub KString eol /* Search "!!" comment lines for string */ ; AbortCtrlStmt : KEnable KAbort '@' KId | KDisable KAbort '@' KId ; ChooserStmt : KChooser Expr Expr KStringId KIntId ; GetDmiPosAcqStmt : KGetDmiPosAcq '(' SimpleVar ',' Expr ')' ; GetPatValStmt : KGetPatVal '(' Expr ',' SimpleVar ',' Expr ')' | KGetSubPatVal '(' Expr ',' SimpleVar ',' Expr ')' ; SetPatPosStmt : KSetPatPos '(' SimpleVar ',' SimpleVar ',' Expr ',' Expr ')' ;