UNPKG

3.49 kBJavaScriptView Raw
1/*
2Language: BASIC
3Author: Raphaël Assénat <raph@raphnet.net>
4Description: Based on the BASIC reference from the Tandy 1000 guide
5Website: https://en.wikipedia.org/wiki/Tandy_1000
6*/
7
8/** @type LanguageFn */
9function basic(hljs) {
10 const KEYWORDS = [
11 "ABS",
12 "ASC",
13 "AND",
14 "ATN",
15 "AUTO|0",
16 "BEEP",
17 "BLOAD|10",
18 "BSAVE|10",
19 "CALL",
20 "CALLS",
21 "CDBL",
22 "CHAIN",
23 "CHDIR",
24 "CHR$|10",
25 "CINT",
26 "CIRCLE",
27 "CLEAR",
28 "CLOSE",
29 "CLS",
30 "COLOR",
31 "COM",
32 "COMMON",
33 "CONT",
34 "COS",
35 "CSNG",
36 "CSRLIN",
37 "CVD",
38 "CVI",
39 "CVS",
40 "DATA",
41 "DATE$",
42 "DEFDBL",
43 "DEFINT",
44 "DEFSNG",
45 "DEFSTR",
46 "DEF|0",
47 "SEG",
48 "USR",
49 "DELETE",
50 "DIM",
51 "DRAW",
52 "EDIT",
53 "END",
54 "ENVIRON",
55 "ENVIRON$",
56 "EOF",
57 "EQV",
58 "ERASE",
59 "ERDEV",
60 "ERDEV$",
61 "ERL",
62 "ERR",
63 "ERROR",
64 "EXP",
65 "FIELD",
66 "FILES",
67 "FIX",
68 "FOR|0",
69 "FRE",
70 "GET",
71 "GOSUB|10",
72 "GOTO",
73 "HEX$",
74 "IF",
75 "THEN",
76 "ELSE|0",
77 "INKEY$",
78 "INP",
79 "INPUT",
80 "INPUT#",
81 "INPUT$",
82 "INSTR",
83 "IMP",
84 "INT",
85 "IOCTL",
86 "IOCTL$",
87 "KEY",
88 "ON",
89 "OFF",
90 "LIST",
91 "KILL",
92 "LEFT$",
93 "LEN",
94 "LET",
95 "LINE",
96 "LLIST",
97 "LOAD",
98 "LOC",
99 "LOCATE",
100 "LOF",
101 "LOG",
102 "LPRINT",
103 "USING",
104 "LSET",
105 "MERGE",
106 "MID$",
107 "MKDIR",
108 "MKD$",
109 "MKI$",
110 "MKS$",
111 "MOD",
112 "NAME",
113 "NEW",
114 "NEXT",
115 "NOISE",
116 "NOT",
117 "OCT$",
118 "ON",
119 "OR",
120 "PEN",
121 "PLAY",
122 "STRIG",
123 "OPEN",
124 "OPTION",
125 "BASE",
126 "OUT",
127 "PAINT",
128 "PALETTE",
129 "PCOPY",
130 "PEEK",
131 "PMAP",
132 "POINT",
133 "POKE",
134 "POS",
135 "PRINT",
136 "PRINT]",
137 "PSET",
138 "PRESET",
139 "PUT",
140 "RANDOMIZE",
141 "READ",
142 "REM",
143 "RENUM",
144 "RESET|0",
145 "RESTORE",
146 "RESUME",
147 "RETURN|0",
148 "RIGHT$",
149 "RMDIR",
150 "RND",
151 "RSET",
152 "RUN",
153 "SAVE",
154 "SCREEN",
155 "SGN",
156 "SHELL",
157 "SIN",
158 "SOUND",
159 "SPACE$",
160 "SPC",
161 "SQR",
162 "STEP",
163 "STICK",
164 "STOP",
165 "STR$",
166 "STRING$",
167 "SWAP",
168 "SYSTEM",
169 "TAB",
170 "TAN",
171 "TIME$",
172 "TIMER",
173 "TROFF",
174 "TRON",
175 "TO",
176 "USR",
177 "VAL",
178 "VARPTR",
179 "VARPTR$",
180 "VIEW",
181 "WAIT",
182 "WHILE",
183 "WEND",
184 "WIDTH",
185 "WINDOW",
186 "WRITE",
187 "XOR"
188 ];
189
190 return {
191 name: 'BASIC',
192 case_insensitive: true,
193 illegal: '^\.',
194 // Support explicitly typed variables that end with $%! or #.
195 keywords: {
196 $pattern: '[a-zA-Z][a-zA-Z0-9_$%!#]*',
197 keyword: KEYWORDS
198 },
199 contains: [
200 hljs.QUOTE_STRING_MODE,
201 hljs.COMMENT('REM', '$', {
202 relevance: 10
203 }),
204 hljs.COMMENT('\'', '$', {
205 relevance: 0
206 }),
207 {
208 // Match line numbers
209 className: 'symbol',
210 begin: '^[0-9]+ ',
211 relevance: 10
212 },
213 {
214 // Match typed numeric constants (1000, 12.34!, 1.2e5, 1.5#, 1.2D2)
215 className: 'number',
216 begin: '\\b\\d+(\\.\\d+)?([edED]\\d+)?[#\!]?',
217 relevance: 0
218 },
219 {
220 // Match hexadecimal numbers (&Hxxxx)
221 className: 'number',
222 begin: '(&[hH][0-9a-fA-F]{1,4})'
223 },
224 {
225 // Match octal numbers (&Oxxxxxx)
226 className: 'number',
227 begin: '(&[oO][0-7]{1,6})'
228 }
229 ]
230 };
231}
232
233export { basic as default };