%%
%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> "let" => (Tokens.LET (yypos, yypos + size yytext));
<INITIAL> "in" => (Tokens.IN (yypos, yypos + size yytext));
<INITIAL> "end" => (Tokens.END (yypos, yypos + size yytext));
+<INITIAL> "with" => (Tokens.WITH (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> "Root" => (Tokens.ROOT (yypos, yypos + size yytext));