* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*)
+ *)
(* Lexer for Domtool configuration files *)
%%
%header (functor DomtoolLexFn(structure Tokens : Domtool_TOKENS));
%full
-%s COMMENT STRING;
+%s COMMENT STRING DOC;
id = [a-z_][A-Za-z0-9_]*;
cid = [A-Z][A-Za-z0-9_]*;
str := #"\n" :: !str; continue());
<STRING> . => (str := String.sub (yytext, 0) :: !str; continue());
+<INITIAL> "{{" => (YYBEGIN DOC; strStart := yypos; str := []; continue());
+<DOC> "}}" => (YYBEGIN INITIAL;
+ Tokens.DOC (String.implode (List.rev (!str)), !strStart, yypos + 1));
+<DOC> "\n" => (lineNum := !lineNum + 1;
+ linePos := yypos :: ! linePos;
+ str := #"\n" :: !str; continue());
+<DOC> . => (str := String.sub (yytext, 0) :: !str; continue());
+
<INITIAL> "(" => (Tokens.LPAREN (yypos, yypos + size yytext));
<INITIAL> ")" => (Tokens.RPAREN (yypos, yypos + size yytext));
<INITIAL> "=" => (Tokens.EQ (yypos, yypos + size yytext));
<INITIAL> "," => (Tokens.COMMA (yypos, yypos + size yytext));
+<INITIAL> "\\\\" => (Tokens.BSLASHBSLASH (yypos, yypos + size yytext));
<INITIAL> "\\" => (Tokens.BSLASH (yypos, yypos + size yytext));
<INITIAL> ":" => (Tokens.COLON (yypos, yypos + size yytext));
<INITIAL> ";" => (Tokens.SEMI (yypos, yypos + size yytext));
<INITIAL> "let" => (Tokens.LET (yypos, yypos + size yytext));
<INITIAL> "in" => (Tokens.IN (yypos, yypos + size yytext));
+<INITIAL> "begin" => (Tokens.BEGIN (yypos, yypos + size yytext));
<INITIAL> "end" => (Tokens.END (yypos, yypos + size yytext));
+<INITIAL> "with" => (Tokens.WITH (yypos, yypos + size yytext));
+<INITIAL> "where" => (Tokens.WHERE (yypos, yypos + size yytext));
+
+<INITIAL> "extern" => (Tokens.EXTERN (yypos, yypos + size yytext));
+<INITIAL> "type" => (Tokens.TYPE (yypos, yypos + size yytext));
+<INITIAL> "val" => (Tokens.VAL (yypos, yypos + size yytext));
+<INITIAL> "context" => (Tokens.CONTEXT (yypos, yypos + size yytext));
<INITIAL> "Root" => (Tokens.ROOT (yypos, yypos + size yytext));