bero1985

POCA keyword match DFA machine

Aug 31st, 2011 (edited)
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.60 KB | None | 0 0
  1. type TPOCALexerKeywordTokens=array[byte] of ansistring;
  2.  
  3.      PPOCALexerKeywordTokenCharTreeNode=^TPOCALexerKeywordTokenCharTreeNode;
  4.      TPOCALexerKeywordTokenCharTreeNode=record
  5.       Children:array[TPOCAKeywordChars] of PPOCALexerKeywordTokenCharTreeNode;
  6.       HasChildren:boolean;
  7.       Token:byte;
  8.      end;
  9.      
  10. var LexerKeywordTokens:TPOCALexerKeywordTokens;
  11.     LexerKeywordTokenCharTreeRootNode:PPOCALexerKeywordTokenCharTreeNode;
  12.  
  13.  
  14.  procedure InitializeKeywords;
  15.   procedure AddKeywordToken(Token:longint;const Str:ansistring);
  16.   var Node:PPOCALexerKeywordTokenCharTreeNode;
  17.       Index:longint;
  18.       CurrentChar:ansichar;
  19.   begin
  20.    Node:=LexerKeywordTokenCharTreeRootNode;
  21.    for Index:=1 to length(Str) do begin
  22.     CurrentChar:=Str[Index];
  23.     if CurrentChar in POCAKeywordChars then begin
  24.      if Node^.HasChildren and assigned(Node^.Children[CurrentChar]) then begin
  25.       Node:=Node^.Children[CurrentChar];
  26.      end else begin
  27.       New(Node^.Children[CurrentChar]);
  28.       Node^.HasChildren:=true;
  29.       Node:=Node^.Children[CurrentChar];
  30.       FillChar(Node^,sizeof(TPOCALexerKeywordTokenCharTreeNode),#0);
  31.       Node^.HasChildren:=false;
  32.       Node^.Token:=ptNONE;
  33.      end;
  34.     end else begin
  35.      break;
  36.     end;
  37.    end;
  38.    if assigned(Node) and (Node<>LexerKeywordTokenCharTreeRootNode) then begin
  39.     Node^.Token:=Token;
  40.    end;
  41.    LexerKeywordTokens[Token]:=Str;
  42.   end;
  43.  begin
  44.   FillChar(LexerKeywordTokens,sizeof(TPOCALexerKeywordTokens),#0);
  45.   LexerKeywordTokenCharTreeRootNode:=nil;
  46.   New(LexerKeywordTokenCharTreeRootNode);
  47.   FillChar(LexerKeywordTokenCharTreeRootNode^,sizeof(TPOCALexerKeywordTokenCharTreeNode),#0);
  48.   LexerKeywordTokenCharTreeRootNode^.Token:=ptNONE;
  49.   AddKeywordToken(ptIF,'if');
  50.   AddKeywordToken(ptELSEIF,'elseif');
  51.   AddKeywordToken(ptELSE,'else');
  52.   AddKeywordToken(ptFOR,'for');
  53.   AddKeywordToken(ptFOREACH,'foreach');
  54.   AddKeywordToken(ptWHILE,'while');
  55.   AddKeywordToken(ptRETURN,'return');
  56.   AddKeywordToken(ptBREAK,'break');
  57.   AddKeywordToken(ptCONTINUE,'continue');
  58.   AddKeywordToken(ptFUNCTION,'function');
  59.   AddKeywordToken(ptNULL,'null');
  60.   AddKeywordToken(ptVAR,'var');
  61.   AddKeywordToken(ptFORINDEX,'forindex');
  62.   AddKeywordToken(ptLAND,'and');
  63.   AddKeywordToken(ptLOR,'or');
  64.   AddKeywordToken(ptTRY,'try');
  65.   AddKeywordToken(ptCATCH,'catch');
  66.   AddKeywordToken(ptFINALLY,'finally');
  67.   AddKeywordToken(ptTHROW,'throw');
  68.   AddKeywordToken(ptDO,'do');
  69.   AddKeywordToken(ptSWITCH,'switch');
  70.   AddKeywordToken(ptCASE,'case');
  71.   AddKeywordToken(ptDEFAULT,'default');
  72.   AddKeywordToken(ptFALLTHROUGH,'fallthrough');
  73.   AddKeywordToken(ptRETRY,'retry');
  74.   AddKeywordToken(ptREGISTER,'register');
  75.   AddKeywordToken(ptBLOCK,'block');
  76.   AddKeywordToken(ptTHIS,'this');
  77.   AddKeywordToken(ptSELF,'self');
  78.   AddKeywordToken(ptLOCAL,'local');
  79.   AddKeywordToken(ptDEFINED,'defined');
  80.   AddKeywordToken(ptTRUE,'true');
  81.   AddKeywordToken(ptFALSE,'false');
  82.   AddKeywordToken(ptFASTFUNCTION,'fastfunction');
  83.   AddKeywordToken(ptFORKEY,'forkey');
  84.   AddKeywordToken(ptINSTANCEOF,'instanceof');
  85.   AddKeywordToken(ptIN,'in');
  86.   AddKeywordToken(ptPROTOTYPE,'prototype');
  87.   AddKeywordToken(ptDELETE,'delete');
  88.   AddKeywordToken(ptOBJECT,'object');
  89.   AddKeywordToken(ptMODULE,'module');
  90.   AddKeywordToken(ptEXTENDS,'extends');
  91.   AddKeywordToken(ptGLOBAL,'global');
  92.   AddKeywordToken(ptBASEOBJECT,'baseobject');
  93.   AddKeywordToken(ptLET,'let');
  94.   AddKeywordToken(ptREG,'reg');
  95.   AddKeywordToken(ptCONST,'const');
  96.   AddKeywordToken(ptFUNC,'func');
  97.   AddKeywordToken(ptFASTFUNC,'fastfunc');
  98.   AddKeywordToken(ptTYPEOF,'typeof');
  99.   AddKeywordToken(ptIDOF,'idof');
  100.   AddKeywordToken(ptGHOSTTYPEOF,'ghosttypeof');
  101.   AddKeywordToken(ptBREAKPOINT,'breakpoint');
  102.  end;
  103.  
  104.   function FindKeywordToken(const Source:ansistring;SourcePosition,SourceLength:longint):byte;
  105.   var Node:PPOCALexerKeywordTokenCharTreeNode;
  106.       Index:longint;
  107.       CurrentChar:ansichar;
  108.   begin
  109.    result:=ptNONE;
  110.    Node:=LexerKeywordTokenCharTreeRootNode;
  111.    for Index:=SourcePosition to SourceLength do begin
  112.     CurrentChar:=Source[Index];
  113.     if (CurrentChar in POCAKeywordChars) and assigned(Node^.Children[CurrentChar]) then begin
  114.      Node:=Node^.Children[CurrentChar];
  115.      result:=Node^.Token;
  116.      if not Node^.HasChildren then begin
  117.       break;
  118.      end;
  119.     end else begin
  120.      break;
  121.     end;
  122.    end;
  123.    if result<>ptNONE then begin
  124.     inc(SourcePosition,length(LexerKeywordTokens[result]));
  125.     if (SourcePosition<=SourceLength) and POCAUnicodeIsIDPart(POCAUTF8CodeUnitGetCharFallback(Source,SourcePosition)) then begin
  126.      result:=ptNONE;
  127.     end;
  128.    end;
  129.   end;
Advertisement
Add Comment
Please, Sign In to add comment