1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#![feature(plugin_registrar,rustc_private,quote)]
extern crate syntax;
extern crate rustc_plugin;
extern crate rustc_errors;
#[macro_use] extern crate log;
extern crate bit_set;
extern crate fsa;
use syntax::ast::Ident;
use syntax::codemap::Span;
use syntax::ext::base::{ExtCtxt, MacResult};
use syntax::tokenstream::TokenTree;
mod analysis;
mod codegen;
mod lexer;
mod parser;
mod regex;
mod unicode;
pub mod rt;
pub fn rustlex<'a>(cx: &'a mut ExtCtxt, sp: Span, ident:Ident, args: Vec<TokenTree>)
-> Box<MacResult+'a> {
let mut p = ::syntax::parse::new_parser_from_tts(
cx.parse_sess,
args
);
let def = parser::parse(ident, &mut p)
.unwrap_or_else(|mut e| {
e.emit();
cx.span_fatal(sp, "error while parsing lexer");
});
let lex = lexer::Lexer::new(def, cx);
lex.gen_code(cx, sp)
}
pub fn plugin_registrar(reg: &mut rustc_plugin::Registry) {
reg.register_syntax_extension(
syntax::symbol::Symbol::intern("rustlex"),
syntax::ext::base::IdentTT(Box::new(rustlex), None, false)
);
}