Lekser Zawartość pliku lexer.mll: { open Parser } let space = [' ' '\n' '\t'] let digit = ['0'-'9'] let alpha = ['a'-'z' 'A'-'Z'] rule token = parse space + { token lexbuf } | 'p' { PRINT } | "if" { IF } | "else" { ELSE } | "while" { WHILE } | "proc" { PROC } | "call" { CALL } | "get" { GET } | alpha (digit|alpha) * { ID (Lexing.lexeme lexbuf) } | digit + { INT (int_of_string (Lexing.lexeme lexbuf)) } | '+' { PLUS } | '-' { MINUS } | '*' { TIMES } | '(' { LPAREN } | ')' { RPAREN } | '{' { LBRACE } | '}' { RBRACE } | ';' { SEMI } | "==" { EQEQ } | '=' { EQ } | ">" { GT } | ">=" { GE } | "<" { LT } | "<=" { LE } | "+=" { PLUS_EQ } | "-=" { MINUS_EQ } | "*=" { TIMES_EQ } | eof { EOF }
Jak widać ogólna struktura prostego pliku .mll to: { kod w ocamlu, przepisywany bezpośrednio na wyjście } let x = kilka_deklaracji let y = ułatwiających let z = pisanie_reguł rule token = parse reguła { wyrażenie_zwracające_symbol } | inna_reguła { inne_wyrażenie_zwracające_symbol } | itd { itd } | eof { można_dzięki_temu_przekazać_eof_do_parsera }