home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / e / amigae / src / tools / lex / simplelex.e < prev    next >
Text File  |  1992-09-02  |  2KB  |  66 lines

  1. -> very simple lex module
  2.  
  3. OPT MODULE
  4.  
  5. MODULE 'tools/ctype'
  6.  
  7. DEF begin, cur, end, free, line, comment            -> private
  8.  
  9. EXPORT PROC lex_init(start,size,freeform=FALSE,onelinecomment=-2)
  10.   end:=(begin:=cur:=start)+size; free:=freeform; line:=1
  11.   comment:=onelinecomment
  12. ENDPROC
  13.  
  14. EXPORT ENUM LEX_EOF=256, LEX_EOL, LEX_INTEGER, LEX_IDENT,
  15.             LEX_STRINGA, LEX_STRINGQ
  16.  
  17. EXPORT PROC lex()
  18.   DEF a,b,c
  19.   LOOP
  20.     SELECT 256 OF c:=cur[]++
  21.       CASE "\n"
  22.         IF cur>end THEN RETURN (cur:=end) BUT LEX_EOF
  23.         line++
  24.         IF free=FALSE THEN RETURN LEX_EOL
  25.       CASE " ", "\t"
  26.         /* whitespace, do nothing */
  27.       CASE "0" TO "9", "$", "%", "-"
  28.         a,b:=Val(cur-1)
  29.         IF b=0 THEN RETURN c
  30.         cur:=cur+b-1
  31.         RETURN LEX_INTEGER, a
  32.       CASE "a" TO "z", "A" TO "Z", "_"
  33.         a:=cur; c:=cur[]
  34.         WHILE isalnum(c) OR (c="_") DO cur++ BUT c:=cur[]
  35.         RETURN LEX_IDENT,a
  36.       CASE "\q", "\a"
  37.         a:=cur
  38.         WHILE (a[]<>c) AND (a[]<>"\n") DO a++
  39.         IF a[]="\n" THEN RETURN c
  40.         b:=cur
  41.         cur:=a+1
  42.         RETURN IF c="\a" THEN LEX_STRINGQ ELSE LEX_STRINGA, b
  43.       DEFAULT
  44.         IF c=comment
  45.           WHILE cur[]++<>"\n"
  46.           ENDWHILE
  47.           line++
  48.         ELSE
  49.           RETURN c
  50.         ENDIF
  51.     ENDSELECT
  52.   ENDLOOP
  53. ENDPROC
  54.  
  55. EXPORT PROC lex_curline() IS line
  56. EXPORT PROC lex_current() IS cur
  57.  
  58. EXPORT PROC lex_getline(s)
  59.   DEF b,e
  60.   b:=e:=cur
  61.   WHILE b[]--<>"\n" DO NOP
  62.   b++
  63.   WHILE e[]<>"\n" DO e++
  64.   StrCopy(s,b,e-b)
  65. ENDPROC cur-b
  66.