Advertisement
12Me21

sbhl3 CONST

Mar 28th, 2018
380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.70 KB | None | 0 0
  1. //list of keywords
  2. //does not include OPERATORS or CONSTANTS or fake keywords TO/STEP
  3. var KEYWORDS=[
  4. "BREAK","CALL","COMMON","CONTINUE","DATA","DEC","DEF","DIM","ELSE","ELSEIF","END","ENDIF","EXEC","FOR","GOSUB","GOTO","IF","INC",
  5. "INPUT","LINPUT","NEXT","ON","OUT","PRINT","READ","REM","REPEAT","RESTORE","RETURN","STOP","SWAP","THEN","UNTIL","USE","VAR","WEND",
  6. "WHILE"
  7. ];
  8. var T_BREAK=0,T_CALL=1,T_COMMON=2,T_CONTINUE=3,T_DATA=4,T_DEC=5,T_DEF=6,T_DIM=7,T_ELSE=8,T_ELSEIF=9,T_END=10,T_ENDIF=11,T_EXEC=12,T_FOR=13;
  9. var T_GOSUB=14,T_GOTO=15,T_IF=16,T_INC=17,T_INPUT=18,T_LINPUT=19,T_NEXT=20,T_ON=21,T_OUT=22,T_PRINT=23,T_READ=24,T_REM=25,T_REPEAT=26;
  10. var T_RESTORE=27,T_RETURN=28,T_STOP=29,T_SWAP=30,T_THEN=31,T_UNTIL=32,T_USE=33,T_VAR=34,T_WEND=35,T_WHILE=36;
  11. var T_UNARY=40,T_OPERATOR=41,T_NUMBER=42,T_WORD=43,T_ERROR=44,T_STRING=45,T_COMMENT=46,T_LABEL=47,T_LINEBREAK=47,T_TEXT=48,T_OPENPAREN=49;
  12. var T_CLOSEPAREN=50,T_OPENBRACKET=51,T_CLOSEBRACKET=52,T_COMMA=53,T_SEMICOLON=54,T_COLON=55,T_MINUS=56,T_EQUALS=57,T_EOF=58;
  13.  
  14. //parser
  15. //nextToken: function that returns the next token
  16. //callback: output function
  17. function parse(nextToken,callback){
  18. //current token
  19. var type,text,word; //NOTE: word is only update right after next()ing. don't rely on it laaaaater
  20. //stored tokens
  21. var newType,newText;
  22. var oldType,oldText;
  23. //keep track of stored tokens
  24. var readNext=1;
  25. //inside def
  26. var inDef=false;
  27.  
  28. while(1){ // <3
  29. try{
  30. //read a "line" of code
  31. next();
  32. switch(type){
  33. //keywords with no arguments
  34. case T_BREAK:case T_CONTINUE:case T_ELSE:case T_ENDIF:case T_STOP:case T_REPEAT:case T_WEND:
  35. output("keyword");
  36. //CALL
  37. break;case T_CALL:
  38. output("keyword");
  39. //CALL SPRITE and CALL BG
  40. if(peekWord("SPRITE")||peekWord("BG")){
  41. readToken("word","keyword");
  42. //regular CALL
  43. }else{
  44. readList(readExpression);
  45. if(readToken(T_OUT,"keyword"))
  46. readList(readVariable);
  47. }
  48. //COMMON
  49. break;case T_COMMON:
  50. output("keyword");
  51. assert(peekToken(T_DEF),"COMMON without DEF");
  52. //DATA
  53. break;case T_DATA:
  54. output("keyword");
  55. assert(readList(readExpression,true),"Missing list"); //should read constant expression
  56. //SWAP
  57. break;case T_SWAP:
  58. output("keyword");
  59. assert(readVariable(),"Missing variable in SWAP");
  60. assert(readToken(T_COMMA),"Missing comma in SWAP");
  61. assert(readVariable(),"Missing variable in SWAP");
  62. //READ
  63. break;case T_READ:
  64. output("keyword");
  65. assert(readList(readVariable,true),"Missing list");
  66. //DEC/INC
  67. break;case T_DEC:case T_INC:
  68. output("keyword");
  69. assert(readVariable(),"Missing INC/DEC variable");
  70. if(readToken(T_COMMA,""))
  71. assert(readExpression(),"Missing INC/DEC amount");
  72. //DEF
  73. break;case T_DEF:
  74. output("keyword");
  75. assert(!inDef,"Nested DEF");
  76. inDef=true;
  77. //read function name
  78. assert(readToken(T_WORD,"function"),"Missing DEF name");
  79. //() form
  80. if(readToken(T_OPENPAREN,"")){
  81. //read argument list
  82. readList(readArgument,true);
  83. //read )
  84. assert(readToken(T_CLOSEPAREN,""),"Missing \")\" after DEF arguments"
  85. );
  86. //subroutine/out form
  87. }else{
  88. //read argument list
  89. readList(readArgument,true);
  90. //OUT
  91. if(readToken(T_OUT,"keyword"))
  92. //read output list
  93. readList(readArgument,true);
  94. }
  95. //VAR
  96. break;case T_VAR:
  97. //assignment form
  98. if(peekToken(T_OPENPAREN)){
  99. output("keyword");
  100. readToken(T_OPENPAREN,"");
  101. assert(readExpression(),"Missing var name");
  102. assert(readToken(T_CLOSEPAREN,""),"missing )")
  103. while(readToken(T_OPENBRACKET,"")){
  104. assert(readList(readExpression,true),"Missing array index");
  105. assert(readToken(T_CLOSEBRACKET,""),"Missing \"]\"");
  106. }
  107. assert(readToken("=",""),"missing =");
  108. readExpression();
  109. //normal form
  110. }else{
  111. output("keyword");
  112. assert(readList(readDeclaration,true),"Missing variable list");
  113. }
  114. //DIM
  115. break;case T_DIM:
  116. output("keyword");
  117. assert(readList(readDeclaration,true),"Missing variable list");
  118. //IF, ELSEIF
  119. break;case T_ELSEIF:case T_IF:
  120. output("keyword");
  121. assert(readExpression(),"Missing IF condition");
  122. assert(readToken(T_THEN,"keyword")||readToken(T_GOTO,"keyword"),"IF without THEN");
  123. readToken(T_LABEL,"label");//optional
  124. //note: check if IF/GOTO supports expressions!
  125. //END
  126. break;case T_END:
  127. output("keyword");
  128. if(inDef)
  129. inDef=false;
  130. //EXEC/USE
  131. break;case T_EXEC:case T_USE:
  132. output("keyword");
  133. readExpression();
  134. //FOR
  135. break;case T_FOR:
  136. output("keyword");
  137. assert(readVariable(),"Missing FOR variable");
  138. assert(readToken(T_EQUALS,""),"Missing = in FOR");
  139. readExpression();
  140. assert(readToken(T_WORD) && word==="TO","Missing TO in FOR");
  141. output("keyword");
  142. readExpression();
  143. if(readToken(T_WORD) && word==="STEP"){
  144. output("keyword");
  145. readExpression();
  146. }else
  147. readNext=0; //heck
  148. //GOSUB GOTO RESTORE(?)
  149. break;case T_GOSUB:case T_GOTO:case T_RESTORE:
  150. output("keyword");
  151. if(!readToken(T_LABEL,"label"))
  152. assert(readExpression(),"Missing argument to keyword");
  153. //WHILE, UNTIL
  154. break;case T_UNTIL:case T_WHILE:
  155. output("keyword");
  156. assert(readExpression(),"Missing argument to keyword");
  157. //INPUT
  158. break;case T_INPUT:
  159. output("keyword");
  160. readPrintList(readExpression);
  161. //LINPUT
  162. break;case T_LINPUT:
  163. output("keyword");
  164. readPrintList(readExpression);
  165. //NEXT
  166. break;case T_NEXT:
  167. output("keyword");
  168. readExpression();
  169. //ON
  170. break;case T_ON:
  171. output("keyword");
  172. readExpression();
  173. assert(readToken(T_GOTO,"keyword")||readToken(T_GOSUB,"keyword"),"ON without GOTO/GOSUB");
  174. assert(readList(readExpression,true),"Missing label list after ON");
  175. //PRINT
  176. break;case T_PRINT:
  177. output("keyword");
  178. readPrintList(readExpression);
  179. //REM
  180. break;case T_REM:
  181. output("keyword");
  182. do{
  183. next();
  184. output("comment");
  185. }while(type!==T_LINEBREAK && type!==T_EOF);;;
  186. //RETURN
  187. break;case T_RETURN:
  188. output("keyword");
  189. if(inDef)
  190. readExpression();
  191. //OUT/THEN
  192. break;case T_OUT:case T_THEN:
  193. output("error");
  194. assert(false,"Illegal OUT/THEN");
  195. //other words
  196. break;case T_WORD:case T_OPENPAREN:
  197. //var name=text;
  198. readNext--;
  199. var oldWord=word; //this is, the variable name! :D
  200. switch(readVariable(true)){
  201. //variable assignment
  202. case true:
  203. assert(readToken(T_EQUALS,"equals"),"missing =");
  204. readExpression();
  205. //should not happen!
  206. break;case false:
  207. alert("what");
  208. //might be function or variable
  209. break;default:
  210. //is variable
  211. if(peekToken(T_EQUALS)){
  212. output("variable");
  213. readToken(T_EQUALS,"equals");
  214. readExpression();
  215. //function or option
  216. }else{
  217. //HORRIBLE STUPID FAKE KEYWORDS!!!
  218. //XON/XOFF/OPTION
  219. // I hate you! :(
  220. // not nice >:[
  221. //error highlighting might be a bit off here since it's not worth making the code 10x more complex
  222. // just to get slightly better coloring when your code is wrong.
  223. switch(oldWord){
  224. case "XON":
  225. output("keyword");
  226. //normal XON
  227. if(readToken(T_WORD)){
  228. output("keyword");
  229. assert(word==="MOTION"||word==="EXPAD"||word==="MIC"||word==="WIIU"||word=="COMPAT","invalid option");
  230. //XON 3DS
  231. }else{
  232. //note: XON 3DS is really bad
  233. //XON was dumb enough before, but now it has to support a weird syntax that
  234. //doesn't exist anywhere else (NUMBER TYPE FAKE KEYWORDS AAAAAAAA)
  235. assert(readToken(T_NUMBER,"keyword"),"invalid option");
  236. assert(text.trimLeft()==="3","invalid option");
  237. assert(readToken(T_WORD,"keyword"),"invalid option");
  238. assert(word==="DS","invalid option");
  239. }
  240. break;case "XOFF":
  241. output("keyword");
  242. assert(readToken(T_WORD,"keyword")&&(word==="MOTION"||word==="EXPAD"||word==="MIC"||word=="COMPAT"),"invalid option")
  243. break;case "OPTION":
  244. output("keyword");
  245. assert(readToken(T_WORD,"keyword"),"invalid option");
  246. assert(word==="STRICT"||word==="DEFINT"||word==="TOOL","invalid option");
  247. //return to sanity, normal function call!
  248. break;default:
  249. output("function");
  250. readList(readExpression);
  251. if(readToken(T_OUT,"keyword"))
  252. readList(readVariable); //------- (fence to stop people from falling off the indent cliff)
  253. }
  254. }
  255. }
  256. //label
  257. break;case T_LABEL:
  258. output("label");
  259. //comment
  260. break;case T_COMMENT:
  261. output("comment");
  262. //end
  263. break;case T_EOF:
  264. output("");
  265. return; //THE END
  266. //line break, colon
  267. break;case T_LINEBREAK:case T_COLON:
  268. output("");
  269. //other
  270. break;default:
  271. output("error");
  272. assert(false,"Expected statement");
  273. }
  274. }catch(error){
  275. //normal parsing error
  276. if(error.name==="ParseError"){
  277. //read until the end of the line
  278. while(1){
  279. next();
  280. if(type===T_LINEBREAK||type==T_EOF)
  281. break;
  282. output("error");
  283. }
  284. //show error message
  285. callback(error.message,"errormessage");
  286. output(""); //line break
  287. //bad error!!!
  288. }else{
  289. alert("real actual error!!! "+error);
  290. return;
  291. }
  292. }
  293. }
  294.  
  295. //check if next token is of a specific type
  296. function peekToken(wantedType){
  297. var prevType=type,prevText=text;
  298. next();
  299. readNext=-1;
  300. newType=type;
  301. newText=text;
  302. type=prevType;
  303. text=prevText;
  304. return newType===wantedType;
  305. }
  306.  
  307. //check if next token is of a specific type
  308. function peekWord(wantedWord){
  309. var prevType=type,prevText=text;
  310. next();
  311. readNext=-1;
  312. newType=type;
  313. newText=text;
  314. type=prevType;
  315. text=prevText;
  316. return newType===T_WORD && newText.trimLeft().toUpperCase()===wantedWord;
  317. }
  318.  
  319. //Try to read a specific token
  320. function readToken(wantedType,outputType){
  321. next();
  322. if(type===wantedType){
  323. readNext=1;
  324. if(outputType!==undefined)
  325. output(outputType);
  326. return true;
  327. }
  328. readNext=0;
  329. return false;
  330. }
  331.  
  332. //Read list
  333. //reader: function to read item (readExpression etc.)
  334. //noNull: throw an error if a null value is found
  335. function readList(reader,noNull){
  336. var ret=reader();
  337. if(readToken(T_COMMA,"")){
  338. assert(ret||!noNull,"Null value not allowed");
  339. ret=1;
  340. do{
  341. assert(reader()||!noNull,"Null value not allowed");
  342. }while(readToken(T_COMMA,""));;; //Lumage told me to
  343. }
  344. return ret;
  345. }
  346.  
  347. //read list of PRINT arguments
  348. function readPrintList(reader){
  349. var ret=false;
  350. if(!reader())
  351. return;
  352. while((readToken(T_COMMA,"")||readToken(T_SEMICOLON,""))&&reader()); //nothing to see here
  353. }
  354.  
  355. //read normal expression
  356. function readExpression(){
  357. next();
  358. switch(type){
  359. //VAR
  360. case T_VAR:
  361. readVar();
  362. //function or variable
  363. break;case T_WORD:
  364. if(peekToken(T_OPENPAREN)){
  365. output("function");
  366. readToken(T_OPENPAREN,"");
  367. readList(readExpression);
  368. assert(readToken(T_CLOSEPAREN,""),"Missing \")\" in function call");
  369. }else
  370. output("variable");
  371. //number
  372. break;case T_NUMBER:
  373. output("number");
  374. //string/labelstring
  375. break;case T_STRING:case T_LABEL:
  376. output("string");
  377. //operator (unary)
  378. break;case T_UNARY:case T_MINUS:
  379. output("operator");
  380. assert(readExpression(),"Missing operator argument");
  381. //open parenthesis
  382. break;case T_OPENPAREN:
  383. output("");
  384. readExpression();
  385. assert(readToken(T_CLOSEPAREN,""),"Missing \")\"");
  386. //other crap
  387. break;default:
  388. readNext=0;
  389. return false;
  390. }
  391. //read []s
  392. while(readToken(T_OPENBRACKET,"")){
  393. assert(readList(readExpression,true),"Missing array index");
  394. assert(readToken(T_CLOSEBRACKET,""),"Missing \"]\"");
  395. }
  396. //read infix operators
  397. while(readToken(T_OPERATOR,"operator")||readToken(T_MINUS,"operator"))
  398. assert(readExpression(),"Operator missing second argument");
  399. return true;
  400. }
  401.  
  402. //read function definition argument
  403. function readArgument(){
  404. if(readToken(T_WORD,"variable")){
  405. if(readToken(T_OPENBRACKET,""))
  406. assert(readToken(T_CLOSEBRACKET,""),"Missing \"]\"");
  407. return true;
  408. }
  409. return false;
  410. }
  411.  
  412. //read variable declaration
  413. function readDeclaration(){
  414. if(readToken(T_WORD,"variable")){
  415. if(readToken(T_OPENBRACKET,"")){
  416. assert(readList(readExpression,true),"Missing array size");
  417. assert(readToken(T_CLOSEBRACKET,""),"Missing \"]\"");
  418. }else if(readToken(T_EQUALS,""))
  419. readExpression();
  420. return true;
  421. }
  422. return false;
  423. }
  424.  
  425. //read function VAR()
  426. function readVar(){
  427. //"function" form of VAR
  428. if(peekToken(T_OPENPAREN)){
  429. output("keyword");
  430. readToken(T_OPENPAREN,"");
  431. assert(readExpression(),"Missing VAR argument");
  432. assert(readToken(T_CLOSEPAREN,""),"Missing \")\" in VAR()");
  433. ret=true;
  434. //bad VAR
  435. }else{
  436. output("error");
  437. assert(false,"invalid VAR");
  438. }
  439. }
  440.  
  441. //return values:
  442. // false - bad
  443. // true - definitely a variable
  444. // string - single word (could be function call or variable)
  445. // if true is passed to function, variable name will not be outputted when it might be a function call (for use in handling =)
  446. function readVariable(noPrintVarName){
  447. var ret=false;
  448. next();
  449. switch(type){
  450. case T_VAR:
  451. readVar();
  452. break;case T_WORD:
  453. if(!noPrintVarName){
  454. output("variable");
  455. ret=true;
  456. }else
  457. ret=text;
  458. break;case T_OPENPAREN:
  459. output("");
  460. assert(readVariable(),"missing variable");
  461. assert(readToken(T_CLOSEPAREN,""),"missing )");
  462. ret=true;
  463. break;default:
  464. readNext=0;
  465. return false;
  466. }
  467. if(peekToken(T_OPENBRACKET)){
  468. if(ret!==true && ret!==false)
  469. output("variable");
  470. while(readToken(T_OPENBRACKET,"")){
  471. assert(readList(readExpression,true),"Missing array index");
  472. assert(readToken(T_CLOSEBRACKET,""),"Missing \"]\"");
  473. }
  474. ret=true;
  475. }
  476. return ret;
  477. }
  478.  
  479. //throw error with message if condition is false
  480. function assert(condition,message){
  481. if(!condition){
  482. console.log(message);
  483. var error=new Error(message);
  484. error.name="ParseError";
  485. throw error;
  486. }
  487. }
  488.  
  489. function output(type){
  490. callback(text,type);
  491. }
  492.  
  493. //I forgot how this works...
  494. function next(){
  495. if(readNext===1){
  496. var items=nextToken();
  497. type=items.type;
  498. text=items.text;
  499. word=items.word; //careful!
  500. }else if(readNext===-1){
  501. type=newType;
  502. text=newText;
  503. readNext=1;
  504. //I don't think this ever happens?
  505. }else if(readNext===-2)
  506. readNext=-1;
  507. else
  508. readNext=1;
  509. }
  510. }
  511.  
  512. //convert code into tokens
  513. //in: (string) code - program to highlight
  514. //out: (function) nextToken - returns next token when called
  515. function tokenize(code){
  516. var i=-1,c,isAlpha,isDigit,textStart;
  517.  
  518. function next(){
  519. i++;
  520. c=code.charAt(i);
  521. isAlpha=(c>='A'&&c<='Z'||c>='a'&&c<='z');
  522. isDigit=(c>='0'&&c<='9');
  523. }
  524.  
  525. function jump(pos){
  526. i=pos-1;
  527. next();
  528. }
  529.  
  530. var prev=0;
  531. function pushWord(){
  532. var start=prev;
  533. prev=i;
  534. var upper=code.substring(textStart,i).toUpperCase();
  535. var type;
  536. //bitwise not
  537. if(upper==="NOT")
  538. type=T_UNARY;
  539. //word operators
  540. else if(upper==="DIV"||upper==="MOD"||upper==="AND"||upper==="OR"||upper==="XOR")
  541. type=T_OPERATOR;
  542. //true/false
  543. else if(upper==="TRUE"||upper==="FALSE")
  544. type=T_NUMBER;
  545. //other keyword
  546. else{
  547. type=KEYWORDS.indexOf(upper);
  548. if(type===-1)
  549. type=T_WORD;
  550. }
  551. return {type:type,text:code.substring(start,i),word:upper};
  552. }
  553.  
  554. function push(type){
  555. var start=prev;
  556. prev=i;
  557. return {type:type,text:code.substring(start,i)};
  558. }
  559.  
  560. next();
  561. return function(){
  562. whitespace=0;
  563. while(c===" "||c==="\t")
  564. next();
  565. if(c==='')
  566. return push(T_EOF);
  567. textStart=i;
  568. //keywords, functions, variables
  569. if(isAlpha||c==='_'){
  570. next();
  571. while(isAlpha||isDigit||c==='_')
  572. next();
  573. if(c==='#'||c==='%'||c==='$'){
  574. next();
  575. return push(T_WORD);
  576. }
  577. return pushWord();
  578. //numbers
  579. }else if(isDigit||c==='.'){
  580. while(isDigit)
  581. next();
  582. if(c==='.'){
  583. next();
  584. if(isDigit){
  585. next();
  586. while(isDigit)
  587. next();
  588. }else{
  589. if(c==='#')
  590. next();
  591. return push(T_NUMBER);
  592. }
  593. }
  594. if(c==='E'||c==='e'){
  595. var ePos=i;
  596. next();
  597. if(c==='+'||c==='-')
  598. next();
  599. if(isDigit){
  600. next();
  601. while(isDigit)
  602. next();
  603. }else{
  604. jump(ePos);
  605. return push(T_ERROR);
  606. }
  607. }
  608. if(c==='#')
  609. next();
  610. return push(T_NUMBER);
  611. }else switch(c){
  612. //strings
  613. case '"':
  614. next();
  615. while(c && c!=='"' && c!=='\n' && c!=='\r')
  616. next();
  617. if(c==='"')
  618. next();
  619. return push(T_STRING);
  620. //comments
  621. break;case '\'':
  622. next();
  623. while(c && c!=='\n' && c!=='\r')
  624. next();
  625. return push(T_COMMENT);
  626. //logical AND, hexadecimal, binary
  627. break;case '&':
  628. next();
  629. switch(c){
  630. case '&':
  631. next();
  632. return push(T_OPERATOR);
  633. break;case 'H':case 'h':
  634. var hPos=i;
  635. next();
  636. if(isDigit||c>='A'&&c<='F'||c>='a'&&c<='f'){
  637. next();
  638. while(isDigit||c>='A'&&c<='F'||c>='a'&&c<='f')
  639. next();
  640. return push(T_NUMBER);
  641. }
  642. jump(hPos);
  643. return push(T_ERROR);
  644. break;case 'B':case 'b':
  645. var bPos=i;
  646. next();
  647. if(c==='0'||c==='1'){
  648. next();
  649. while(c==='0'||c==='1')
  650. next();
  651. return push(T_NUMBER);
  652. }
  653. jump(bPos);
  654. return push(T_ERROR);
  655. break;default:
  656. return push(T_ERROR);
  657. }
  658. //labels
  659. break;case '@':
  660. next();
  661. if(isDigit||isAlpha||c==="_"){
  662. next();
  663. while(isDigit||isAlpha||c==="_")
  664. next();
  665. return push(T_LABEL);
  666. }
  667. return push(T_ERROR);
  668. //constants
  669. break;case '#':
  670. next();
  671. if(isDigit||isAlpha){
  672. next();
  673. while(isDigit||isAlpha)
  674. next();
  675. return push(T_NUMBER);
  676. }
  677. return push(T_ERROR);
  678. //logical or
  679. break;case '|':
  680. next();
  681. if(c==='|'){
  682. next();
  683. return push(T_OPERATOR);
  684. }
  685. return push(T_ERROR);
  686. //less than, less than or equal, left shift
  687. break;case '<':
  688. next();
  689. if(c==='='||c==='<')
  690. next();
  691. return push(T_OPERATOR);
  692. //greater than, greater than or equal, right shift
  693. break;case '>':
  694. next();
  695. if(c==='='||c==='>')
  696. next();
  697. return push(T_OPERATOR);
  698. //equal, equal more
  699. break;case '=':
  700. next();
  701. if(c==='='){
  702. next();
  703. return push(T_OPERATOR);
  704. }
  705. return push(T_EQUALS);
  706. //logical not, not equal
  707. break;case '!':
  708. next();
  709. if(c==='='){
  710. next();
  711. return push(T_OPERATOR);
  712. }
  713. return push(T_UNARY);
  714. break;case '-':
  715. next();
  716. return push(T_MINUS);
  717. //add, subtract, multiply, divide
  718. break;case '+':case '*':case '/':
  719. next();
  720. return push(T_OPERATOR);
  721. //other
  722. break;case '\n':case '\r':
  723. next();
  724. return push(T_LINEBREAK);
  725. //characters
  726. break;case '(':
  727. next();
  728. return push(T_OPENPAREN);
  729. break;case ')':
  730. next();
  731. return push(T_CLOSEPAREN);
  732. break;case '[':
  733. next();
  734. return push(T_OPENBRACKET);
  735. break;case ']':
  736. next();
  737. return push(T_CLOSEBRACKET);
  738. break;case ',':
  739. next();
  740. return push(T_COMMA);
  741. break;case ';':
  742. next();
  743. return push(T_SEMICOLON);
  744. break;case ':':
  745. next();
  746. return push(T_COLON);
  747. //print shortcut
  748. break;case '?':
  749. next();
  750. return push(T_PRINT);
  751. //other
  752. break;default:
  753. next();
  754. return push(T_TEXT);
  755. }
  756. }
  757. }
  758.  
  759. //"Example" usage: applying syntax highlighting to an html element.
  760. //Uses the type for the css class name.
  761. function applySyntaxHighlighting(element){
  762. var html="",prevType;
  763. //this is called for each highlightable token
  764. function callback(value,type){
  765. //only make a new span if the CSS class has changed
  766. if(type!==prevType){
  767. //close previous span
  768. if(prevType)
  769. html+="</span>";
  770. //open new span
  771. if(type)
  772. html+="<span class=\""+type+"\">";
  773. }
  774. html+=escapeHTML(value);
  775. prevType=type;
  776. }
  777. parse(tokenize(element.textContent),callback);
  778. //close last span
  779. if(prevType)
  780. html+="</span>";
  781. //set html
  782. element.innerHTML=html;
  783. }
  784.  
  785. //escape & and <
  786. function escapeHTML(text){
  787. return text.replace(/&/g,"&amp;").replace(/</g,"&lt;");
  788. }
  789. //escape &, ", and '
  790. function escapeHTMLAttribute(text){
  791. return text.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;");
  792. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement