%{ #include "pps.h" #include int nbrace; int commentDepth = 0; int needId = 0; %} letter [A-Za-z] digit [0-9] idchar [A-Za-z0-9_] white [ \t] %Start COMMENT STRING1 STRING2 KEYWORD COMMENT2 PROCNAME %% {letter}{idchar}* { int kw = iskw(yytext); if (needId) { funct(yytext); needId = 0; } if (kw) begin(KEYWORD); ECHO; if (kw) { begin(INITIAL); if (strcmp (yytext, "END") == 0) { --nbrace; } else if (strcmp (yytext, "PROCEDURE") == 0) { ++needId; } else if (strcmp (yytext, "MODULE") == 0) { /* * REMIND: Fix ECHO to do module.proc */ --needId; } else if ((strcmp (yytext, "BEGIN") == 0) || (strcmp (yytext, "CASE") == 0) || (strcmp (yytext, "FOR") == 0) || (strcmp (yytext, "IF") == 0) || (strcmp (yytext, "LOOP") == 0) || (strcmp (yytext, "LOCK") == 0) || (strcmp (yytext, "TYPECASE") == 0)|| (strcmp (yytext, "TRY") == 0) || (strcmp (yytext, "WHILE") == 0) || (strcmp (yytext, "WITH") == 0)) { ++nbrace; } } } \" { begin(STRING1); ECHO; } \' { begin(STRING2); ECHO; } \(\* { begin(COMMENT); ++commentDepth; ECHO; } \<\* { begin(COMMENT2); ECHO; } \\. { ECHO; } \\. { ECHO; } \" { ECHO; begin(INITIAL); } \' { ECHO; begin(INITIAL); } \(\* { ECHO; ++commentDepth; } \*\) { ECHO; --commentDepth; if (!commentDepth) { begin(INITIAL);} } \*\> { ECHO; begin(INITIAL); } [\t\n\f]+ { space(yytext); } \{ { nbrace++; REJECT; } \} { nbrace--; REJECT; } . { ECHO; } %% /* * This should better be sorted by frequency. */ char *keywords[] = { " ", "AND", "ARRAY", "BEGIN", "BITS", "BRANDED", "BY", "CASE", "CONST", "DIV", "DO", "ELSE", "ELSIF", "END", "EVAL", "EXCEPT", "EXCEPTION", "EXIT", "EXPORTS", "FINALLY", "FOR", "FROM", "IF", "IMPORT", "IN", "INTERFACE", "LOCK", "LOOP", "METHODS", "MOD", "MODULE", "NOT", "OBJECT", "OF", "OR", "PROCEDURE", "RAISE", "RAISES", "READONLY", "RECORD", "REF", "REPEAT", "RETURN", "REVEAL", "ROOT", "SET", "THEN", "TO", "TRY", "TYPE", "TYPECASE", "UNSAFE", "UNTIL", "UNTRACED", "VALUE", "VAR", "WHILE", "WITH", NULL };