Skip to content

Commit b889183

Browse files
committed
Convert to using proc macro
1 parent fcddb33 commit b889183

File tree

6 files changed

+848
-917
lines changed

6 files changed

+848
-917
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
/target
1+
target

Cargo.toml

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
name = "plex"
4-
version = "0.0.3"
4+
version = "0.1.0"
55
authors = ["Geoffry Song <goffrie@gmail.com>"]
66

77
description = "A syntax extension for writing lexers and parsers."
@@ -14,10 +14,13 @@ keywords = ["tokenizer", "scanner", "lexer", "parser", "generator"]
1414
[lib]
1515

1616
name = "plex"
17-
plugin = true
18-
crate-type = ["dylib"]
17+
crate-type = ["proc-macro"]
1918

2019
[dependencies]
2120

2221
lalr = "0.0.2"
2322
redfa = "0.0.2"
23+
literalext = { version = "0.1.0", default-features = false, features = ["proc-macro"] }
24+
syn = { version = "0.12", features = ["extra-traits", "full"] }
25+
proc-macro2 = { version = "0.2.1", features = ["nightly"] }
26+
quote = "0.4"

examples/demo.rs

+15-10
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
#![feature(plugin)]
2-
#![plugin(plex)]
1+
#![feature(use_extern_macros)]
2+
extern crate plex;
33

44
use std::io::Read;
55

66
mod lexer {
7+
use plex::lexer;
8+
79
#[derive(Debug, Clone)]
810
pub enum Token {
911
Ident(String),
@@ -41,7 +43,7 @@ mod lexer {
4143
} else {
4244
panic!("integer {} is out of range", text)
4345
}, text)
44-
},
46+
}
4547

4648
r#"[a-zA-Z_][a-zA-Z0-9_]*"# => (Token::Ident(text.to_owned()), text),
4749

@@ -86,7 +88,8 @@ mod lexer {
8688
type Item = (Token, Span);
8789
fn next(&mut self) -> Option<(Token, Span)> {
8890
loop {
89-
let tok = if let Some(tok) = next_token(&mut self.remaining) {
91+
let tok = if let Some((tok, new_remaining)) = next_token(self.remaining) {
92+
self.remaining = new_remaining;
9093
tok
9194
} else {
9295
return None
@@ -132,9 +135,10 @@ mod ast {
132135
}
133136

134137
mod parser {
135-
use ::ast::*;
136-
use ::lexer::Token::*;
137-
use ::lexer::*;
138+
use ast::*;
139+
use lexer::Token::*;
140+
use lexer::*;
141+
use plex::parser;
138142
parser! {
139143
fn parse_(Token, Span);
140144

@@ -214,7 +218,7 @@ mod parser {
214218
}
215219

216220
mod interp {
217-
use ::ast::*;
221+
use ast::*;
218222
use std::collections::HashMap;
219223

220224
pub fn interp<'a>(p: &'a Program) {
@@ -224,7 +228,7 @@ mod interp {
224228
}
225229
}
226230
fn interp_expr<'a>(env: &mut HashMap<&'a str, i64>, expr: &'a Expr) -> i64 {
227-
use ::ast::Expr_::*;
231+
use ast::Expr_::*;
228232
match expr.node {
229233
Add(ref a, ref b) => interp_expr(env, a) + interp_expr(env, b),
230234
Sub(ref a, ref b) => interp_expr(env, a) - interp_expr(env, b),
@@ -249,7 +253,8 @@ mod interp {
249253
fn main() {
250254
let mut s = String::new();
251255
std::io::stdin().read_to_string(&mut s).unwrap();
252-
let lexer = lexer::Lexer::new(&s);
256+
let lexer = lexer::Lexer::new(&s)
257+
.inspect(|tok| eprintln!("tok: {:?}", tok));
253258
let program = parser::parse(lexer).unwrap();
254259
interp::interp(&program);
255260
}

0 commit comments

Comments
 (0)