OP:= (
CP := )
P:= Expression \n
FuncDescription:= D WT FuncName EQ FuncExpression NL
FN:=name() | name( FuncParameters )
FP := AT name | AT name CO FP
VD:= "S name = E " NL
v:= S name
E:=N | v | OP E CP | FC | E OPR E
FV := AT name (functionVariable)
FC:= FN op cp | name op FuncCallParams cp
FCP := E | E CO FCP
FE = E | FV
WT:= empty space like [\t \r].+ NOT NEW
Number := [0..9].+ (one or more numeric characters) | [0..9].+ '.' [0..9].+
C:= [a...zA..Z]. (one character)
name:= c[a..zA..Z0..9]+
D:= def
================================
isChar(char)
AT := @
S := #
class Token
OPR
CP
OP
V
FV
AT
S
Name
N
CO
EQ
char in[]
int inLen
int pos = 0
Token tokenStream[]
while( !done && pos < inLen)
skipWt( in, inlen, pos ) <------ move past white space in front of token (does not delete white space)
if( isChar ( in[pos] ) )
lexNameorDef(in, inlen, pos) -> tokenStream
elsif( in[pos] == '#' )
tokenStream.add( NewToken (Sharp) );
elsif( in[pos] == '@' )
add(newToken (AT) )
OP
CP
COM
EQ
EQEQ
eif( in[pos] == '+' || in[pos] == '-' ||
add( newToken (OPR, in[pos] ) )
eif( isNum( in[pos] ) )
lexNumber( in inlen pos ) -> tokenStream
eif( in[pos] == '\n' )
add( new Token (NL) )
=====================
lexNameorDef( in, inlen, pos )
//check for def
if( pos + 2 < inlen )
in[pos] == 'd' && in[ pos + 1] == 'e' && in[ pos+2 ] == 'f' && in[pos+3] == WHITESPACE
pos = pos + 3
return newToken(D)
//name
string name
while( isAlphaNum( in[pos] ) )
name.append( in[pos] )
++ pos;
return newToken(NAME, name)
--pos; ---> because must stop before next token
state stacks
top
def
expr
paren
funcCall
FuncCallParams
Add
Sub
Mul
Div
No comments:
Post a Comment