BASIC GRAMMAR: 
(Basically, strings mean themselves, [] means optional, and things that
look like Perl regexps are Perl regexps.)

 Comment:
    REM\s.*

 Keyword:
    DATA DIM DEF END FOR GOSUB GOTO IF INPUT LET NEXT ON PRINT READ RETURN
    THEN ELSE TO STEP
    (Others not yet implemented...)

 Arithmetic Expression:
    Mult. Exp.  Arith. Op.  Mult. Exp.
    String Exp. + String Exp.

 Arithmetic Operator: + -

 Multiplicative Expression:
    Unary Exp.  Mult. Op.  Unary Exp.

 Multiplicative Operator: * /

 Unary Expression:
    - Unary Exp.
    (Arith. Exp.)
    Lvalue
    Function
    Constant

Lvalue:
    VarName [ Arglist ]

VarName:
    Numeric Identifier
    String Identifier

Numeric Identifier: [A-Z]\w*
String Identifier: [A-Z]\w*\$

Arglist: ( Arith. Exp. [, Arith. Exp. ...] )

Function: FuncName Arglist

FuncName: FN[A-Z]\w+

Constant:
    String Constant
    Numeric Constant

 Numeric Constant: (\d*)?\.?\d+
 String Constant: ".*?"

 String Expression:
    String Constant
    Arithmetic Expression (made of String Exp.s)

 Conditional Expression:
    NOT Cond. Exp.					(Not implemented)
    (Cond. Exp.)					(Not implemented)
    Cond. Exp.  Cond. Op.  Cond. Exp.			(Not implemented)
    Arith. Exp.  Rel. Op.  Arith. Exp.
    String Exp.  Rel. Op.  String Exp.

 Relational Operator: <  <=  >  >=  =  <>    (Note: = can also be in assignment)

 Conditional Operator: AND OR

 Print Separator
     , ;

----------------------------------------------------------------------

Line:
    Number Statements

Statements:
    Statement [: Statement ...]

Statement:
    DATA Constant [, Constant ...]

    DIM Array(Arglist) [, Array(Arglist...]

    DEF Fname(Variable [, Variable ...] ) = Arith. Exp.

    END 

    FOR Lvalue = Arith. Exp. TO Arith. Exp. [STEP Arith. Exp.]

    GOTO Arith. Exp.

    IF Cond. Exp. THEN Statements [ELSE Statements]

    INPUT [String Constant ;] Lvalue [, Lvalue ...]

    [LET] Lvalue = Arith. Exp.

    NEXT Lvalue

    ON Arith. Exp. GOTO/GOSUB Arith. Exp. [, Arith. Exp. ...]

    PRINT [Arith. Exp. [Print Separator] [ Arith. Exp. [Print Separator] ...] ]

    READ Lvalue [, Lvalue ...]

    Comment
