Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type TPOCALexerKeywordTokens=array[byte] of ansistring;
- PPOCALexerKeywordTokenCharTreeNode=^TPOCALexerKeywordTokenCharTreeNode;
- TPOCALexerKeywordTokenCharTreeNode=record
- Children:array[TPOCAKeywordChars] of PPOCALexerKeywordTokenCharTreeNode;
- HasChildren:boolean;
- Token:byte;
- end;
- var LexerKeywordTokens:TPOCALexerKeywordTokens;
- LexerKeywordTokenCharTreeRootNode:PPOCALexerKeywordTokenCharTreeNode;
- procedure InitializeKeywords;
- procedure AddKeywordToken(Token:longint;const Str:ansistring);
- var Node:PPOCALexerKeywordTokenCharTreeNode;
- Index:longint;
- CurrentChar:ansichar;
- begin
- Node:=LexerKeywordTokenCharTreeRootNode;
- for Index:=1 to length(Str) do begin
- CurrentChar:=Str[Index];
- if CurrentChar in POCAKeywordChars then begin
- if Node^.HasChildren and assigned(Node^.Children[CurrentChar]) then begin
- Node:=Node^.Children[CurrentChar];
- end else begin
- New(Node^.Children[CurrentChar]);
- Node^.HasChildren:=true;
- Node:=Node^.Children[CurrentChar];
- FillChar(Node^,sizeof(TPOCALexerKeywordTokenCharTreeNode),#0);
- Node^.HasChildren:=false;
- Node^.Token:=ptNONE;
- end;
- end else begin
- break;
- end;
- end;
- if assigned(Node) and (Node<>LexerKeywordTokenCharTreeRootNode) then begin
- Node^.Token:=Token;
- end;
- LexerKeywordTokens[Token]:=Str;
- end;
- begin
- FillChar(LexerKeywordTokens,sizeof(TPOCALexerKeywordTokens),#0);
- LexerKeywordTokenCharTreeRootNode:=nil;
- New(LexerKeywordTokenCharTreeRootNode);
- FillChar(LexerKeywordTokenCharTreeRootNode^,sizeof(TPOCALexerKeywordTokenCharTreeNode),#0);
- LexerKeywordTokenCharTreeRootNode^.Token:=ptNONE;
- AddKeywordToken(ptIF,'if');
- AddKeywordToken(ptELSEIF,'elseif');
- AddKeywordToken(ptELSE,'else');
- AddKeywordToken(ptFOR,'for');
- AddKeywordToken(ptFOREACH,'foreach');
- AddKeywordToken(ptWHILE,'while');
- AddKeywordToken(ptRETURN,'return');
- AddKeywordToken(ptBREAK,'break');
- AddKeywordToken(ptCONTINUE,'continue');
- AddKeywordToken(ptFUNCTION,'function');
- AddKeywordToken(ptNULL,'null');
- AddKeywordToken(ptVAR,'var');
- AddKeywordToken(ptFORINDEX,'forindex');
- AddKeywordToken(ptLAND,'and');
- AddKeywordToken(ptLOR,'or');
- AddKeywordToken(ptTRY,'try');
- AddKeywordToken(ptCATCH,'catch');
- AddKeywordToken(ptFINALLY,'finally');
- AddKeywordToken(ptTHROW,'throw');
- AddKeywordToken(ptDO,'do');
- AddKeywordToken(ptSWITCH,'switch');
- AddKeywordToken(ptCASE,'case');
- AddKeywordToken(ptDEFAULT,'default');
- AddKeywordToken(ptFALLTHROUGH,'fallthrough');
- AddKeywordToken(ptRETRY,'retry');
- AddKeywordToken(ptREGISTER,'register');
- AddKeywordToken(ptBLOCK,'block');
- AddKeywordToken(ptTHIS,'this');
- AddKeywordToken(ptSELF,'self');
- AddKeywordToken(ptLOCAL,'local');
- AddKeywordToken(ptDEFINED,'defined');
- AddKeywordToken(ptTRUE,'true');
- AddKeywordToken(ptFALSE,'false');
- AddKeywordToken(ptFASTFUNCTION,'fastfunction');
- AddKeywordToken(ptFORKEY,'forkey');
- AddKeywordToken(ptINSTANCEOF,'instanceof');
- AddKeywordToken(ptIN,'in');
- AddKeywordToken(ptPROTOTYPE,'prototype');
- AddKeywordToken(ptDELETE,'delete');
- AddKeywordToken(ptOBJECT,'object');
- AddKeywordToken(ptMODULE,'module');
- AddKeywordToken(ptEXTENDS,'extends');
- AddKeywordToken(ptGLOBAL,'global');
- AddKeywordToken(ptBASEOBJECT,'baseobject');
- AddKeywordToken(ptLET,'let');
- AddKeywordToken(ptREG,'reg');
- AddKeywordToken(ptCONST,'const');
- AddKeywordToken(ptFUNC,'func');
- AddKeywordToken(ptFASTFUNC,'fastfunc');
- AddKeywordToken(ptTYPEOF,'typeof');
- AddKeywordToken(ptIDOF,'idof');
- AddKeywordToken(ptGHOSTTYPEOF,'ghosttypeof');
- AddKeywordToken(ptBREAKPOINT,'breakpoint');
- end;
- function FindKeywordToken(const Source:ansistring;SourcePosition,SourceLength:longint):byte;
- var Node:PPOCALexerKeywordTokenCharTreeNode;
- Index:longint;
- CurrentChar:ansichar;
- begin
- result:=ptNONE;
- Node:=LexerKeywordTokenCharTreeRootNode;
- for Index:=SourcePosition to SourceLength do begin
- CurrentChar:=Source[Index];
- if (CurrentChar in POCAKeywordChars) and assigned(Node^.Children[CurrentChar]) then begin
- Node:=Node^.Children[CurrentChar];
- result:=Node^.Token;
- if not Node^.HasChildren then begin
- break;
- end;
- end else begin
- break;
- end;
- end;
- if result<>ptNONE then begin
- inc(SourcePosition,length(LexerKeywordTokens[result]));
- if (SourcePosition<=SourceLength) and POCAUnicodeIsIDPart(POCAUTF8CodeUnitGetCharFallback(Source,SourcePosition)) then begin
- result:=ptNONE;
- end;
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment