home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / sviluppo / 2b_gedsyntax / simple.e < prev   
Text File  |  2000-01-23  |  9KB  |  278 lines

  1. /* -----------------------------------------------------------------------------
  2.  
  3.  ©1999 Dietmar Eilert. All Rights Reserved.
  4.  
  5.  AmigaE version by Tomasz Wiszkowski [error@alpha.net.pl]
  6.  
  7.  -------------------------------------------------------------------------------
  8. */
  9.  
  10. OPT PREPROCESS
  11.  
  12. #date VERSION 'amigae.syntax 1.0 (%d.%m.%Y) by Tomasz Wiszkowski (error/bla²)'
  13.  
  14. MODULE 'golded/editor', 'golded/scanlib', 'exec/execbase'
  15.  
  16.     LIBRARY 'amigae.syntax', 1, 0, VERSION EXTRA 6 IS
  17.         mountScanner,
  18.         startScanner(A0,A1,D0,D1),
  19.         closeScanner(A0),
  20.         flushScanner(A0),
  21.         setupScanner(A0),
  22.         briefScanner(A0,A1),
  23.         parseLine(A0,A1,D0),
  24.         unparseLines(A0,D0),
  25.         parseSection(A0,A1,D0)
  26.  
  27. PROC main()
  28.     DEF b:PTR TO parserBase
  29.  
  30.     IF b:=FindName(execbase.liblist, 'amigae.syntax')
  31.         b.magic:="GED6"
  32.     ENDIF
  33. ENDPROC
  34.  
  35. -> begin  "definitions"
  36. OBJECT myParserHandle
  37.     parserHandle:parserHandle;               // embedded parser handle
  38.     syntaxStack:PTR TO syntaxChunk;          // parser output
  39. ENDOBJECT
  40.  
  41. ENUM
  42.     SYNTAX_STANDARD,
  43.     SYNTAX_COMMENT,
  44.     SYNTAX_STRING,
  45.     SYNTAX_FUNCTION,
  46.     SYNTAX_KEYWORD,
  47.     SYNTAX_VARIABLE,
  48.     SYNTAX_PREPROCESSOR,
  49.     SYNTAX_VALUES,
  50.     SYNTAX_MAXIMUM
  51.  
  52. -> end
  53. -> begin "library functions"
  54. -> begin mount scanner
  55. PROC mountScanner()
  56.     DEF parserData:parserData, example:PTR TO CHAR, labels:PTR TO CHAR
  57.  
  58.     parserData:=New(SIZEOF parserData)
  59.  
  60.     example:=[
  61.         '/* ',
  62.         '   AmigaE example',
  63.         '*/ ',
  64.         'OPT PREPROCESS             ',
  65.         '#define BLAH "BLAH"+14     ',
  66.         '                           ',
  67.         'MODULE ''dos/dos''           ',
  68.         '                           ',
  69.         'PROC main()                ',
  70.         '   // knock, knock...      ',
  71.         '                           ',
  72.         '   WriteF(''Hello world !'')',
  73.         'ENDPROC                     ',
  74.         NIL
  75.     ]
  76.  
  77.     parserData.pd_Release    := SCANLIBVERSION;
  78.     parserData.pd_Version    := 1;
  79.     parserData.pd_Serial     := 0;
  80.     parserData.pd_Info       := 'AmigaE syntax parser'
  81.     parserData.pd_Example    := example;
  82.     parserData.pd_Flags      := 0;
  83.     parserData.pd_Properties := 0;
  84.  
  85. ENDPROC parserData
  86. -> end
  87. -> begin start scanner
  88. PROC startScanner(globalConfigPtr=A0:PTR TO LONG /*globalConfig*/, editConfigPtr=A1:PTR TO editConfig, syntaxStack=D0:PTR TO syntaxChunk, syntaxSetup=D1:PTR TO syntaxSetup)
  89.     DEF handle:PTR TO myParserHandle
  90.  
  91.     IF handle:=New(SIZEOF handle)
  92.         handle.parserHandle.ph_Levels   := SYNTAX_MAXIMUM;
  93.         handle.parserHandle.ph_Names    := ['Plain text', 'Comments', 'Strings', 'Functions', 'Keywords', 'Variables', 'Preprocessor', 'Values', NIL]
  94.         handle.parserHandle.ph_ColorsFG := NIL;
  95.         handle.parserHandle.ph_ColorsBG := NIL;
  96.         handle.syntaxStack              := syntaxStack;
  97.     ENDIF
  98. ENDPROC handle
  99. -> end
  100. -> begin close scanner
  101. PROC closeScanner(parserHandle=A0:PTR TO parserHandle)
  102.     IF parserHandle THEN Dispose(parserHandle)
  103. ENDPROC
  104. -> end
  105. -> begin flush scanner
  106. PROC flushScanner(parserHandle=A0:PTR TO parserHandle) IS EMPTY
  107. -> end
  108. -> begin setup scanner
  109. PROC setupScanner(globalConfigPtr=A0:PTR TO LONG /*globalConfig*/) IS EMPTY
  110. -> end
  111. -> begin brief scanner
  112. PROC briefScanner(parserHandle=A0:PTR TO parserHandle, notify=A1:PTR TO scannerNotify) IS EMPTY
  113. -> end
  114. -> begin parse line
  115. PROC parseLine(parserHandle=A0:PTR TO parserHandle, lineNode=A1:PTR TO lineNode, line=D0)
  116.  
  117.     IF IS_FOLD(lineNode) THEN RETURN
  118.  
  119.     IF lineNode.len
  120.         RETURN parseString(lineNode.text, lineNode.len, parserHandle)
  121.     ELSE
  122.         RETURN
  123.     ENDIF
  124. ENDPROC
  125. -> end
  126. -> begin unparse lines
  127. PROC unparseLines(lineNode=A0:PTR TO lineNode, lines=D0) IS EMPTY
  128. -> end
  129. -> begin parse section
  130. PROC parseSection(parserHandle=A0:PTR TO parserHandle, lineNode=A1:PTR TO lineNode, lines=D0) IS EMPTY
  131. -> end
  132. -> end
  133. -> begin  "private"
  134. PROC parseString(text, len, parserHandle:PTR TO myParserHandle)
  135.     DEF inString=0, indent=0, syntaxStack:PTR TO syntaxChunk
  136.     DEF c=0, f
  137.  
  138.     syntaxStack:=parserHandle.syntaxStack
  139.  
  140.     IF len
  141.         WHILE len AND (text[len-1]<=32) DO len--
  142.         WHILE (indent<len) AND (text[]<=32)
  143.             indent++
  144.             text[]++
  145.             len--
  146.         ENDWHILE
  147.  
  148.         WHILE len>=2
  149.             IF (text[]="$")
  150.                 syntaxStack[c].sc_Level:=SYNTAX_VALUES
  151.                 syntaxStack[c].sc_Start:=indent
  152.                 text++; indent++; len--
  153.                 WHILE ((text[]<="9") AND (text[]=>"0")) OR ((text[]=>"a") AND (text[]<="f")) OR ((text[]>="A") AND (text[]<="F")) AND (len=>0)
  154.                     text++;indent++;len--
  155.                 ENDWHILE
  156.                 indent--; len++;text--
  157.                 syntaxStack[c].sc_End:=indent
  158.                 c++;
  159.             ENDIF
  160.             IF (text[]=$22)
  161.                 syntaxStack[c].sc_Level:=SYNTAX_VALUES
  162.                 syntaxStack[c].sc_Start:=indent
  163.                 REPEAT
  164.                     text++; indent++; len--;
  165.                 UNTIL (text[]=$22) OR (len<0)
  166.                 syntaxStack[c].sc_End:=indent;
  167.                 c++;
  168.             ENDIF
  169.             IF ((text[]>"0") AND (text[]<"9"))
  170.                 syntaxStack[c].sc_Level:=SYNTAX_VALUES
  171.                 syntaxStack[c].sc_Start:=indent
  172.                 text++; indent++; len--
  173.                 WHILE ((text[]<="9") AND (text[]=>"0")) AND (len=>0)
  174.                     text++;indent++;len--
  175.                 ENDWHILE
  176.                 indent--; len++;text--
  177.                 syntaxStack[c].sc_End:=indent
  178.                 c++;
  179.             ENDIF
  180.             IF text[]="#"
  181.                 syntaxStack[c].sc_Level:=SYNTAX_PREPROCESSOR
  182.                 syntaxStack[c].sc_Start:=indent
  183.                 text++; indent++; len--
  184.                 WHILE (text[]=>"a") AND (text[]<="z")
  185.                       text++
  186.                       len--
  187.                       indent++
  188.                 ENDWHILE
  189.                 indent--
  190.                 len++
  191.                 text--
  192.                 syntaxStack[c].sc_End:=indent
  193.                 c++
  194.             ENDIF
  195.  
  196.             IF text[]="\a"
  197.                 syntaxStack[c].sc_Level     := SYNTAX_STRING
  198.                 syntaxStack[c].sc_Start     := indent
  199.                 text[]++; indent++; len--
  200.                 WHILE text[]<>"\a"
  201.                     text[]++
  202.                     indent++
  203.                     len--
  204.                     IF len=0
  205.                         syntaxStack[c].sc_Level:=FALSE
  206.                         syntaxStack[c].sc_Start:=FALSE
  207.                         syntaxStack[c].sc_End:=FALSE
  208.                         RETURN syntaxStack
  209.                     ENDIF
  210.                 ENDWHILE
  211.                 syntaxStack[c].sc_End       := indent
  212.                 c++
  213.             ENDIF
  214.  
  215.             IF ((text[]=>"a") AND (text[]<="z")) OR (text[]="_")
  216.                 syntaxStack[c].sc_Level:=SYNTAX_VARIABLE
  217.                 syntaxStack[c].sc_Start:=indent
  218.                 WHILE (((text[]=>"a") AND (text[]<="z")) OR
  219.                       ((text[]=>"A") AND (text[]<="Z")) OR
  220.                       ((text[]=>"0") AND (text[]<="9")) OR
  221.                       (text[]="_")) AND (len=>0)
  222.                       text++
  223.                       len--
  224.                       indent++
  225.                 ENDWHILE
  226.                 indent--
  227.                 len++
  228.                 text--
  229.                 syntaxStack[c].sc_End:=indent
  230.                 c++
  231.             ENDIF
  232.             
  233.             IF (text[]=>"A") AND (text[]<="Z")
  234.                 IF ((text[1]=>"A") AND (text[1]<="Z")) OR (text[1]="_")
  235.                     syntaxStack[c].sc_Level:=SYNTAX_KEYWORD
  236.                 ELSE
  237.                     syntaxStack[c].sc_Level:=SYNTAX_FUNCTION
  238.                 ENDIF
  239.                 syntaxStack[c].sc_Start:=indent
  240.                 WHILE (((text[]=>"a") AND (text[]<="z")) OR
  241.                       ((text[]=>"A") AND (text[]<="Z")) OR
  242.                       ((text[]=>"0") AND (text[]<="9")) OR
  243.                       (text[]="_")) AND (len=>0)
  244.                       text++
  245.                       len--
  246.                       indent++
  247.                 ENDWHILE
  248.                 indent--
  249.                 len++
  250.                 text--
  251.                 syntaxStack[c].sc_End:=indent
  252.                 c++
  253.             ENDIF
  254.  
  255.             IF ((text[]="/") AND (text[1]="/")) OR
  256.                ((text[]="-") AND (text[1]=">"))
  257.                 syntaxStack[c].sc_Level := SYNTAX_COMMENT;
  258.                 syntaxStack[c].sc_Start := indent;
  259.                 syntaxStack[c].sc_End   := indent + len - 1;
  260.                 c++
  261.                 syntaxStack[c].sc_Start := FALSE;
  262.                 syntaxStack[c].sc_End   := FALSE;
  263.                 syntaxStack[c].sc_Level := FALSE;
  264.                 RETURN syntaxStack
  265.             ENDIF
  266.             text++
  267.             indent++
  268.             len--
  269.         ENDWHILE
  270.     ENDIF
  271.     syntaxStack[c].sc_Level     := FALSE
  272.     syntaxStack[c].sc_Start     := FALSE
  273.     syntaxStack[c].sc_End       := FALSE
  274.  
  275. ENDPROC syntaxStack
  276. -> end
  277.     CHAR '$VER: ', VERSION
  278.