basic.js 3.4 KB

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