2023-10-03 11:14:36 +08:00
|
|
|
/*
|
|
|
|
Language: BASIC
|
|
|
|
Author: Raphaël Assénat <raph@raphnet.net>
|
|
|
|
Description: Based on the BASIC reference from the Tandy 1000 guide
|
|
|
|
Website: https://en.wikipedia.org/wiki/Tandy_1000
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** @type LanguageFn */
|
|
|
|
function basic(hljs) {
|
|
|
|
const KEYWORDS = [
|
|
|
|
"ABS",
|
|
|
|
"ASC",
|
|
|
|
"AND",
|
|
|
|
"ATN",
|
|
|
|
"AUTO|0",
|
|
|
|
"BEEP",
|
|
|
|
"BLOAD|10",
|
|
|
|
"BSAVE|10",
|
|
|
|
"CALL",
|
|
|
|
"CALLS",
|
|
|
|
"CDBL",
|
|
|
|
"CHAIN",
|
|
|
|
"CHDIR",
|
|
|
|
"CHR$|10",
|
|
|
|
"CINT",
|
|
|
|
"CIRCLE",
|
|
|
|
"CLEAR",
|
|
|
|
"CLOSE",
|
|
|
|
"CLS",
|
|
|
|
"COLOR",
|
|
|
|
"COM",
|
|
|
|
"COMMON",
|
|
|
|
"CONT",
|
|
|
|
"COS",
|
|
|
|
"CSNG",
|
|
|
|
"CSRLIN",
|
|
|
|
"CVD",
|
|
|
|
"CVI",
|
|
|
|
"CVS",
|
|
|
|
"DATA",
|
|
|
|
"DATE$",
|
|
|
|
"DEFDBL",
|
|
|
|
"DEFINT",
|
|
|
|
"DEFSNG",
|
|
|
|
"DEFSTR",
|
|
|
|
"DEF|0",
|
|
|
|
"SEG",
|
|
|
|
"USR",
|
|
|
|
"DELETE",
|
|
|
|
"DIM",
|
|
|
|
"DRAW",
|
|
|
|
"EDIT",
|
|
|
|
"END",
|
|
|
|
"ENVIRON",
|
|
|
|
"ENVIRON$",
|
|
|
|
"EOF",
|
|
|
|
"EQV",
|
|
|
|
"ERASE",
|
|
|
|
"ERDEV",
|
|
|
|
"ERDEV$",
|
|
|
|
"ERL",
|
|
|
|
"ERR",
|
|
|
|
"ERROR",
|
|
|
|
"EXP",
|
|
|
|
"FIELD",
|
|
|
|
"FILES",
|
|
|
|
"FIX",
|
|
|
|
"FOR|0",
|
|
|
|
"FRE",
|
|
|
|
"GET",
|
|
|
|
"GOSUB|10",
|
|
|
|
"GOTO",
|
|
|
|
"HEX$",
|
|
|
|
"IF",
|
|
|
|
"THEN",
|
|
|
|
"ELSE|0",
|
|
|
|
"INKEY$",
|
|
|
|
"INP",
|
|
|
|
"INPUT",
|
|
|
|
"INPUT#",
|
|
|
|
"INPUT$",
|
|
|
|
"INSTR",
|
|
|
|
"IMP",
|
|
|
|
"INT",
|
|
|
|
"IOCTL",
|
|
|
|
"IOCTL$",
|
|
|
|
"KEY",
|
|
|
|
"ON",
|
|
|
|
"OFF",
|
|
|
|
"LIST",
|
|
|
|
"KILL",
|
|
|
|
"LEFT$",
|
|
|
|
"LEN",
|
|
|
|
"LET",
|
|
|
|
"LINE",
|
|
|
|
"LLIST",
|
|
|
|
"LOAD",
|
|
|
|
"LOC",
|
|
|
|
"LOCATE",
|
|
|
|
"LOF",
|
|
|
|
"LOG",
|
|
|
|
"LPRINT",
|
|
|
|
"USING",
|
|
|
|
"LSET",
|
|
|
|
"MERGE",
|
|
|
|
"MID$",
|
|
|
|
"MKDIR",
|
|
|
|
"MKD$",
|
|
|
|
"MKI$",
|
|
|
|
"MKS$",
|
|
|
|
"MOD",
|
|
|
|
"NAME",
|
|
|
|
"NEW",
|
|
|
|
"NEXT",
|
|
|
|
"NOISE",
|
|
|
|
"NOT",
|
|
|
|
"OCT$",
|
|
|
|
"ON",
|
|
|
|
"OR",
|
|
|
|
"PEN",
|
|
|
|
"PLAY",
|
|
|
|
"STRIG",
|
|
|
|
"OPEN",
|
|
|
|
"OPTION",
|
|
|
|
"BASE",
|
|
|
|
"OUT",
|
|
|
|
"PAINT",
|
|
|
|
"PALETTE",
|
|
|
|
"PCOPY",
|
|
|
|
"PEEK",
|
|
|
|
"PMAP",
|
|
|
|
"POINT",
|
|
|
|
"POKE",
|
|
|
|
"POS",
|
|
|
|
"PRINT",
|
|
|
|
"PRINT]",
|
|
|
|
"PSET",
|
|
|
|
"PRESET",
|
|
|
|
"PUT",
|
|
|
|
"RANDOMIZE",
|
|
|
|
"READ",
|
|
|
|
"REM",
|
|
|
|
"RENUM",
|
|
|
|
"RESET|0",
|
|
|
|
"RESTORE",
|
|
|
|
"RESUME",
|
|
|
|
"RETURN|0",
|
|
|
|
"RIGHT$",
|
|
|
|
"RMDIR",
|
|
|
|
"RND",
|
|
|
|
"RSET",
|
|
|
|
"RUN",
|
|
|
|
"SAVE",
|
|
|
|
"SCREEN",
|
|
|
|
"SGN",
|
|
|
|
"SHELL",
|
|
|
|
"SIN",
|
|
|
|
"SOUND",
|
|
|
|
"SPACE$",
|
|
|
|
"SPC",
|
|
|
|
"SQR",
|
|
|
|
"STEP",
|
|
|
|
"STICK",
|
|
|
|
"STOP",
|
|
|
|
"STR$",
|
|
|
|
"STRING$",
|
|
|
|
"SWAP",
|
|
|
|
"SYSTEM",
|
|
|
|
"TAB",
|
|
|
|
"TAN",
|
|
|
|
"TIME$",
|
|
|
|
"TIMER",
|
|
|
|
"TROFF",
|
|
|
|
"TRON",
|
|
|
|
"TO",
|
|
|
|
"USR",
|
|
|
|
"VAL",
|
|
|
|
"VARPTR",
|
|
|
|
"VARPTR$",
|
|
|
|
"VIEW",
|
|
|
|
"WAIT",
|
|
|
|
"WHILE",
|
|
|
|
"WEND",
|
|
|
|
"WIDTH",
|
|
|
|
"WINDOW",
|
|
|
|
"WRITE",
|
|
|
|
"XOR"
|
|
|
|
];
|
|
|
|
|
|
|
|
return {
|
|
|
|
name: 'BASIC',
|
|
|
|
case_insensitive: true,
|
|
|
|
illegal: '^\.',
|
|
|
|
// Support explicitly typed variables that end with $%! or #.
|
|
|
|
keywords: {
|
|
|
|
$pattern: '[a-zA-Z][a-zA-Z0-9_$%!#]*',
|
|
|
|
keyword: KEYWORDS
|
|
|
|
},
|
|
|
|
contains: [
|
|
|
|
hljs.QUOTE_STRING_MODE,
|
|
|
|
hljs.COMMENT('REM', '$', { relevance: 10 }),
|
|
|
|
hljs.COMMENT('\'', '$', { relevance: 0 }),
|
|
|
|
{
|
|
|
|
// Match line numbers
|
|
|
|
className: 'symbol',
|
|
|
|
begin: '^[0-9]+ ',
|
|
|
|
relevance: 10
|
|
|
|
},
|
|
|
|
{
|
|
|
|
// Match typed numeric constants (1000, 12.34!, 1.2e5, 1.5#, 1.2D2)
|
|
|
|
className: 'number',
|
|
|
|
begin: '\\b\\d+(\\.\\d+)?([edED]\\d+)?[#\!]?',
|
|
|
|
relevance: 0
|
|
|
|
},
|
|
|
|
{
|
|
|
|
// Match hexadecimal numbers (&Hxxxx)
|
|
|
|
className: 'number',
|
|
|
|
begin: '(&[hH][0-9a-fA-F]{1,4})'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
// Match octal numbers (&Oxxxxxx)
|
|
|
|
className: 'number',
|
|
|
|
begin: '(&[oO][0-7]{1,6})'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export { basic as default };
|