I am using the Parser which can be downloaded from http://www.charcoaldesign.co.uk/source/realbasic.
I am not sure if this is a deliberate limitation or if there is a bug or if there is something wrong with my code but I seem to have been adding tokens to the parser fine until I found out that the amount of tokens I can create has a fairly small limit. All of the tokens are added if I try to add a limited amount of tokens. Of coarse there is a limit to everything but I this seems like a weird limitation to me. The limit is around 47 tokens. Here is the code which I used to attempt to add tokens:
eof = false
position = 1
Tokenizer1 = new Tokenizer
Parser1 = new Parser
//add tokenizer1's event handlers
AddHandler Tokenizer1.EOF, AddressOf EOF
AddHandler Tokenizer1.TokenMatched, AddressOf TokenMatched
AddHandler Tokenizer1.UnexpectedToken, AddressOf UnexpectedToken
//add parser1's event handlers
AddHandler Parser1.FetchToken, AddressOf FetchToken
AddHandler Parser1.Finished, AddressOf Finished
AddHandler Parser1.Reduce, AddressOf Reduce
//setup tokens
Tokenizer1.AddTokenType "end_line","\\r",""
//not compiled
Tokenizer1.AddTokenType "whitespace","[ \
\\r]",""
Tokenizer1.AddTokenType "comment","//([^\
\\r]*)","\\1"
//end
Tokenizer1.AddTokenType "end","end if",""
Tokenizer1.AddTokenType "end","wend",""
Tokenizer1.AddTokenType "end","end while",""
Tokenizer1.AddTokenType "end","next",""
Tokenizer1.AddTokenType "end","end for",""
Tokenizer1.AddTokenType "end","end select",""
Tokenizer1.AddTokenType "end","end",""
//unwanted (this comment is only relevant to me - just saying that I will be removing this in the future)
Tokenizer1.AddTokenType "dim","dim",""
Tokenizer1.AddTokenType "as","as",""
Tokenizer1.AddTokenType "print","print",""
//select case
//works fine if I comment any three tokens out but I DON'T want to have to limit myself
'Tokenizer1.AddTokenType "case else","case else",""
'Tokenizer1.AddTokenType "case","case",""
'Tokenizer1.AddTokenType "select","select case",""
Tokenizer1.AddTokenType "case","case",""
//break
Tokenizer1.AddTokenType "break","exit",""
Tokenizer1.AddTokenType "continue","continue",""
Tokenizer1.AddTokenType "return","return",""
//if
Tokenizer1.AddTokenType "else if","elseif",""
Tokenizer1.AddTokenType "else if","else if",""
Tokenizer1.AddTokenType "if","if",""
Tokenizer1.AddTokenType "then","then",""
Tokenizer1.AddTokenType "else","else",""
//for
Tokenizer1.AddTokenType "for","for",""
Tokenizer1.AddTokenType "step","step",""
Tokenizer1.AddTokenType "to","to",""
Tokenizer1.AddTokenType "downto","downto",""
//while
Tokenizer1.AddTokenType "while","while",""
//boolean
Tokenizer1.AddTokenType "true","true",""
Tokenizer1.AddTokenType "false","false",""
//maths operators
Tokenizer1.AddTokenType "+","[+]",""
Tokenizer1.AddTokenType "-","[-]",""
Tokenizer1.AddTokenType "*","[*]",""
Tokenizer1.AddTokenType "/","[/]",""
//comparision operators
Tokenizer1.AddTokenType "<=","<=",""
Tokenizer1.AddTokenType ">=",">=",""
Tokenizer1.AddTokenType "<>","<>",""
Tokenizer1.AddTokenType ">","[>]",""
Tokenizer1.AddTokenType "<","[<]",""
Tokenizer1.AddTokenType "==","==",""
Tokenizer1.AddTokenType "=","[=]",""
//
Tokenizer1.AddTokenType "(","[(]",""
Tokenizer1.AddTokenType ")","[)]",""
Tokenizer1.AddTokenType "integer_literal","[0-9]+"
Tokenizer1.AddTokenType "real_literal","[0-9]*[.][0-9]+|[0-9]+[.][0-9]*"
Tokenizer1.AddTokenType "string_literal","[""]([^""]*)[""]","\\1"
Tokenizer1.AddTokenType "type","string|integer|boolean"
Tokenizer1.AddTokenType "identifier","[a-z_][a-z0-9_]*"
//set up operands
Parser1.AddStructureType "operand","identifier",1000
Parser1.AddStructureType "operand","string_literal",1000
Parser1.AddStructureType "operand","real_literal",1000
Parser1.AddStructureType "operand","integer_literal",1000
Parser1.AddStructureType "operand","expression",1003
Parser1.AddStructureType "operand","( operand )",1001
//set up prefix expressions
Parser1.AddStructureType "expression","- operand",1002
//set up infix expressions
Parser1.AddStructureType "expression","operand + operand",2
Parser1.AddStructureType "expression","operand - operand",2
Parser1.AddStructureType "expression","operand * operand",3
Parser1.AddStructureType "expression","operand / operand",3
Parser1.AddStructureType "expression","operand <= operand",5
Parser1.AddStructureType "expression","operand >= operand",5
Parser1.AddStructureType "expression","operand <> operand",6
Parser1.AddStructureType "expression","operand == operand",6,false
Parser1.AddStructureType "expression","operand < operand",4
Parser1.AddStructureType "expression","operand > operand",4
Parser1.AddStructureType "assignment","operand = operand",1,false
//declarations
Parser1.AddStructureType "declaration","dim operand as type",-1
Parser1.AddStructureType "declaration","dim operand as type = operand",-1
//statements
Parser1.AddStructureType "statement","print operand",-1
Parser1.AddStructureType "statement","if operand then program end",-1
Parser1.AddStructureType "statement","if operand then program else program end",-1
//loops
Parser1.AddStructureType "loop","for assignment to operand program next",-1
Parser1.AddStructureType "loop","for assignment downto operand program next",-1
//program
Parser1.AddStructureType "program","declaration",-1
Parser1.AddStructureType "program","statement",-1
Parser1.AddStructureType "program","loop",-1
Parser1.AddStructureType "program","program program",0
Parser1.Parse
There is more code in this method but I tried to reduce down to only what is relevant to the problem (as far as I can tell).
Thanks