News of javascript Validator

I don't suppose you'd be interested in a javascript validator I wrote in
BBC BASIC V? It started as a bracket matcher, then I bolted a few extras on.
I'll get around to converting it into javascript or Perl eventually,
but here's the current source:


REM>"Bracketsb"
:
ONERROR REPORT:PRINT" at ";ERL:END
:
N$=CHR$10+CHR$13
A$="function Start(){//Preloader bits."+N$
A$+="for(w=0;w<=16;w++){    // REVERSE TO => / >="+N$
A$+="yy=String.fromCharCode(w+97);"+N$
A$+="L[w]=new Image();eval(""L[""+w+""]"
A$+=".src='r/l""+yy+"".jpg'"")}"+N$
A$+="}window.onload=Start;"+N$
A$+="/* Comments // again. */"+N$
A$+="function on(w){X[w].src=N[w].src}"+N$

REMA$="{x=""a'{}[]()"";x='a""';x[y]=(5/5);}"+N$
REMA$+="{x[(9)]=5;x[9]=(5)} x=[{y})"+N$
:
REMA$="""L[""+w+""].src='r/l"""
:
Dstr=FALSE:REM Double-Quoted string.
Sstr=FALSE:REM Single-Quoted string.
Rexp=FALSE:REM Regular Expression.
Lcom=FALSE:REM Line comment.
Bcom=FALSE:REM Bracketed comment.
Tree=NOTTRUE:REM Print debugging help.
Show=TRUE:REM Show source.
:
Li=1:REM Current line.
LS=-1:REM Start of current line; for error-printing use.
IFTree ORShow PRINT"Source:"'A$
:
DIM B$(200):B=0
L=LENA$
P$="":PNL=FALSE
FORC=1TO L
Op=FALSE:REM Opening "'/.
X$=MID$(A$,C,1)
RX$=X$
REM Mode decisions:
IFX$=CHR$13 ORX$=CHR$10 NL=TRUE ELSENL=FALSE
IFNL Lcom=FALSE:IFNOTPNL Li+=1:LS=C
IFP$+X$="//" Lcom=TRUE:IFBcom PRINT"Warning: Line Comment inside Bracketed 
Comment";:PROCLine_report
IFP$+X$="/*" B+=1:B$(B)="*":PROCNB:Bcom=TRUE:PROCPTest:IFLcom PRINT"Warning: 
Bracketed Comment inside Line Comment";:PROCLine_report

REM Mode influences:
Comm=(Lcom OR Bcom)
IFComm X$=""

REM Naughty function Check:
IFB>0 ANDX$="f" PROCfunction

REM Bracket Logs/Detects:
NS=NOT(Dstr OR Sstr):REMPRINT;Dstr,;Sstr,;NS
IFNS AND X$="{" B+=1:B$(B)="}":PROCPTest:PROCNested("{")
IFNS AND X$="[" B+=1:B$(B)="]":PROCPTest
IFNS AND X$="(" B+=1:B$(B)=")":PROCPTest
IFX$=CHR$34 AND NS B+=1:B$(B)=X$:Dstr=TRUE:Op=TRUE:PROCPTest
IFX$="'" AND NS B+=1:B$(B)=X$:Sstr=TRUE:Op=TRUE:PROCPTest
REMIFX$="/" B+=1:B$(B)=X$:Op=TRUE
:
REM Further Mode influences(?):

:
REM Bracket Detects:
IFNS AND(X$="}"ORX$="]"ORX$=")") THEN
B$=B$(B):B-=1 :PROCNTest
IFB$<>X$ PROCMismatch("Bracket",B$,X$):END
ENDIF

IFX$=CHR$34ANDNOTSstr ANDNOTOp THEN
B$=B$(B):B-=1 :PROCNTest
Dstr=FALSE
IFB$<>X$ PROCMismatch("Delimiter",B$,X$):END
ENDIF

IFX$="'"ANDNOTDstr ANDNOTOp THEN
B$=B$(B):B-=1 :PROCNTest
Sstr=FALSE
IFB$<>X$ PROCMismatch("Delimiter",B$,X$):END
ENDIF

IFP$+RX$="*/" THEN
B$=B$(B):B-=1 :PROCNTest
IFB$<>"*" PROCMismatch("Comment",B$,"*/"):END
ENDIF

REMIFRexp AND X$="/" ANDNOTOp THEN
REMB$=B$(B):B-=1
REMIFB$<>X$ PROCMismatch("Delimiter",B$,X$):END
REMENDIF


P$=RX$:PNL=NL
NEXT

IFB>0 PROCPremature
PRINT"No serious errors in code."
END
:
DEFPROCMismatch(W$,a$,b$)
IFB<0 PRINT"Suprious closing "b$" bracket found, "; ELSEPRINTW$" mismatch: 
"a$" expected but "b$" found";
PROCLine_report:END
ENDPROC
:
DEFPROCLine_report
PRINT", at line ";Li;":"
D=LS+1:E=C-D-1
REPEATD+=1
X=ASCMID$(A$,D,1)
N=(X=10ORX=13)
IFNOTN VDUX
UNTILN OR D>=L
PRINT'SPC(E);"^"
ENDPROC
:
DEFPROCPTest
Y$=X$:IFY$="*" Y$="/*"
IFTree PRINTSPC(B*2)"+"Y$
ENDPROC
:
DEFPROCNTest
Y$=X$:IFY$="" Y$=B$(B+1)
IFY$="*" Y$="*/"
IFTree PRINTSPC((B+1)*2)"-"Y$
ENDPROC
:
DEFPROCfunction
D=C
D+=1:IFMID$(A$,D,1)<>"u" ENDPROC
D+=1:IFMID$(A$,D,1)<>"n" ENDPROC
D+=1:IFMID$(A$,D,1)<>"c" ENDPROC
D+=1:IFMID$(A$,D,1)<>"t" ENDPROC
D+=1:IFMID$(A$,D,1)<>"i" ENDPROC
D+=1:IFMID$(A$,D,1)<>"o" ENDPROC
D+=1:IFMID$(A$,D,1)<>"n" ENDPROC
PRINT"function Declared inside brackets."
PROCHistory
END
ENDPROC
:
DEFPROCHistory
PRINT"Bracket History: "
FORD=1TO B:A$=B$(D)
B$=FNReverse(A$)
PRINTB$;:NEXT:PRINT
ENDPROC
:
DEFFNReverse(Y$)
R$=Y$
IFY$="}" R$="{"
IFY$="]" R$="["
IFY$=")" R$="("
IFY$="*" R$=" /* "
=R$
:
DEFPROCNested(F$)
IFB=1 ENDPROC
BB$=B$(B-1)
IFBB$<>"}" PRINT"Illegal nesting: "F$" inside 
"FNReverse(BB$);:PROCLine_report:REMEND:REM Treat as 'Warning.
ENDPROC
:
DEFPROCPremature
PRINT"Script ended prematurely: Brackets not ";
IFB>1 PRINT"all ";
PRINT"closed."
PROCHistory
END
ENDPROC
:
DEFPROCNB
IFBcom PRINT"Warning: Nested Comments";:PROCLine_report
ENDPROC
:


EXAMPLE ONE

Source:
function Start(){//Preloader bits.
for(w=0;w<=16;w++){    // REVERSE TO => / >=
yy=String.fromCharCode(w+97);
L[w]=new Image();eval("L["+w+"].src='r/l"+yy+".jpg'")}
}window.onload=Start;
/* Comments // again. */
function on(w){X[w].src=N[w].src}


Warning: Line Comment inside Bracketed Comment, at line 6:
/* Comments // again. */
             ^
No serious errors in code.


EXAMPLE TWO

Source:
function one(){
x="a'{}[]()";x='a"';x[y]=(5/5)
}
function two(){x[(9)]=5;x[9]=(5)} x=[{y})


Illegal nesting: { inside [, at line 4:
function two(){x[(9)]=5;x[9]=(5)} x=[{y})
                                     ^
Bracket mismatch: ] expected but ) found, at line 4:
function two(){x[(9)]=5;x[9]=(5)} x=[{y})
                                        ^

EXAMPLE TWO WITH DEBUGGING HELP ON

  +(
  -)
  +{
    +"
    -"
    +'
    -'
    +[
    -]
    +(
    -)
  -}
  +(
  -)
  +{
    +[
      +(
      -)
    -]
    +[
    -]
    +(
    -)
  -}
  +[
    +{
Illegal nesting: { inside [, at line 4:
function two(){x[(9)]=5;x[9]=(5)} x=[{y})
                                     ^
    -}
  -)
Bracket mismatch: ] expected but ) found, at line 4:
function two(){x[(9)]=5;x[9]=(5)} x=[{y})
                                        ^

Please note that although I have written several fairly complex short
javascripts, I would not yet call myself fluent, so I would welcome
suggestions of common errors to look for.

-Robin H. (Mr.)

_________________________________________________________________
Express yourself with cool emoticons - download MSN Messenger today! 
http://www.msn.co.uk/messenger

Received on Friday, 30 January 2004 16:25:40 UTC