⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ezscrlex.l

📁 很管用的GIS控件
💻 L
字号:

%{
unit EzscrLex;
(* EzscrLex.L: lexical analyzer for script command line syntax *)

(* lex input file for script scanner *)

{$I EZ_FLAG.PAS}
interface

uses SysUtils, EzLexLib, EzScryacc;

type
    TEzScrLexer = Class(TCustomLexer)
    public
      // utility functions
      function IsKeyword(const id : string; var token : integer) : boolean;
      // Lexer main functions
      function yylex : Integer; override;
      procedure yyaction( yyruleno : integer);
    end;

//===============================================
// reserved words definition
//===============================================

  type
    Trword = record
       rword: string[17];
       token: smallint;
    end;
  const
    rwords : array [1..46] of Trword = (
    (rword:'TRUE';           token: RW_TRUE),
    (rword:'FALSE';          token: RW_FALSE),
    (rword:'PEN';            token: RW_PEN ),
    (rword:'BRUSH';          token: RW_BRUSH ),
    (rword:'FONT';           token: RW_FONT ),
    (rword:'VECTORFONT';     token: RW_VECTORFONT ),
    (rword:'SYMBOL';         token: RW_SYMBOL ),
    (rword:'NONE';           token: RW_NONE ),
    (rword:'POINT';          token: RW_POINT ),
    (rword:'PLACE';          token: RW_PLACE ),
    (rword:'PLINE';          token: RW_POLYLINE ),
    (rword:'POLYGON';        token: RW_POLYGON ),
    (rword:'LINE';           token: RW_LINE ),
    (rword:'RECTANGLE';      token: RW_RECTANGLE ),
    (rword:'ARC';            token: RW_ARC ),
    (rword:'ELLIPSE';        token: RW_ELLIPSE ),
    (rword:'TRUETYPETEXT';   token: RW_TRUETYPETEXT ),
    (rword:'FITTEDTEXT';     token: RW_FITTEDTEXT ),
    (rword:'JUSTIFTEXT';     token: RW_JUSTIFTEXT ),
    (rword:'PICTUREREF';     token: RW_PICTUREREF ),
    (rword:'BANDSBITMAP';    token: RW_BANDSBITMAP ),
    (rword:'PERSISTBITMAP';  token: RW_PERSISTBITMAP ),
    (rword:'CUSTPICT';       token: RW_CUSTPICT ),
    (rword:'SPLINE';         token: RW_SPLINE ),
    (rword:'SPLINETEXT';     token: RW_SPLINETEXT ),
    (rword:'TABLE';          token: RW_TABLE ),
    (rword:'PREVIEW';        token: RW_PREVIEW ),
    (rword:'GROUP';          token: RW_GROUP ),
    (rword:'DIMHORIZONTAL';  token: RW_DIMHORIZONTAL ),
    (rword:'DIMVERTICAL';    token: RW_DIMVERTICAL ),
    (rword:'DIMPARALLEL';    token: RW_DIMPARALLEL ),
    (rword:'INSERT';         token: RW_INSERT ),
    (rword:'NEWLAYER';       token: RW_NEWLAYER ),
    (rword:'ACTIVELAYER';    token: RW_ACTIVELAYER ),
    (rword:'DATA';           token: RW_DATA ),
    (rword:'INFO';           token: RW_INFO ),
    (rword:'CHAR';           token: RW_CHAR ),
    (rword:'FLOAT';          token: RW_FLOAT ),
    (rword:'DATETIME';       token: RW_DATETIME ),
    (rword:'INTEGER';        token: RW_INTEGER ),
    (rword:'LOGIC';          token: RW_LOGIC ),
    (rword:'MEMO';           token: RW_MEMO ),
    (rword:'BINARY';         token: RW_BINARY ),
    (rword:'COORDSYS';       token: RW_COORDSYS ),
    (rword:'TITLE';          token: RW_TITLE ),
    (rword:'COLUMN';         token: RW_COLUMN )
    );

implementation

function TEzScrLexer.IsKeyword(const id : string; var token : integer) : boolean;
(* returns corresponding token number in token *)


var
  k : integer;
begin
  Result:= false;
  for k:= Low(rwords) to High(rwords) do
     if AnsiCompareText(id, rwords[k].rword)=0 then begin
        Result:= True;
        token := rwords[k].token;
        exit;
     end;
end;


%}

DIGIT   [0-9]
LOWER   [a-z]
UPPER   [A-Z]
LETTER  ({UPPER}|{LOWER})

UINT    {DIGIT}+
SINT    [+-]{DIGIT}+
HEXA    [$]({DIGIT}|{LETTER})+
ENL     ([+-])?({UINT}"."{UINT})|({UINT}".")|("."{UINT})
ANL     {ENL}[Ee]{SINT}

%%

   var
      token: integer;
      c: char;

{LETTER}("_"|{LETTER}|{DIGIT})*
  if IsKeyword(yylval.yystring, token) then
    returni(token)
  else
    returni(_IDENTIFIER);

({UINT})|({SINT})|({ENL})|({ANL})
  returni(_NUMERIC);
{HEXA}
  returni(_HEXADECIMAL);
\'[^\']*\'
  begin
    c := get_char;
    if c = #39 then
      yymore
    else
    begin
      unget_char(c);
      returni( _STRING );
    end;
  end;
\"[^\"]*\"
  begin
    c := get_char;
    if c = #34 then
      yymore
    else
    begin
      unget_char(c);
      returni( _STRING );
    end;
  end;
"="   returni( _EQ );
","   returni( _COMA );
"("   returni( _LPAREN );
")"   returni( _RPAREN );
"{"   returni( _LBRACKET );
"}"   returni( _RBRACKET );
"@"   returni( _AT );
"<"   returni( _LT );
":"   returni( _COLON );
";"   returni( _SEMICOLON );
"/*"[^\*]*"*/"
      returni( _COMMENT );
[ ]   returni( _BLANK );
[\n]  returni( _NEWLINE );
[\t]  returni( _TAB );
.     returni( _ILLEGAL );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -