1
- #![ feature( plugin ) ]
2
- #! [ plugin ( plex) ]
1
+ #![ feature( use_extern_macros ) ]
2
+ extern crate plex;
3
3
4
4
use std:: io:: Read ;
5
5
6
6
mod lexer {
7
+ use plex:: lexer;
8
+
7
9
#[ derive( Debug , Clone ) ]
8
10
pub enum Token {
9
11
Ident ( String ) ,
@@ -41,7 +43,7 @@ mod lexer {
41
43
} else {
42
44
panic!( "integer {} is out of range" , text)
43
45
} , text)
44
- } ,
46
+ }
45
47
46
48
r#"[a-zA-Z_][a-zA-Z0-9_]*"# => ( Token :: Ident ( text. to_owned( ) ) , text) ,
47
49
@@ -86,7 +88,8 @@ mod lexer {
86
88
type Item = ( Token , Span ) ;
87
89
fn next ( & mut self ) -> Option < ( Token , Span ) > {
88
90
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;
90
93
tok
91
94
} else {
92
95
return None
@@ -132,9 +135,10 @@ mod ast {
132
135
}
133
136
134
137
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;
138
142
parser ! {
139
143
fn parse_( Token , Span ) ;
140
144
@@ -214,7 +218,7 @@ mod parser {
214
218
}
215
219
216
220
mod interp {
217
- use :: ast:: * ;
221
+ use ast:: * ;
218
222
use std:: collections:: HashMap ;
219
223
220
224
pub fn interp < ' a > ( p : & ' a Program ) {
@@ -224,7 +228,7 @@ mod interp {
224
228
}
225
229
}
226
230
fn interp_expr < ' a > ( env : & mut HashMap < & ' a str , i64 > , expr : & ' a Expr ) -> i64 {
227
- use :: ast:: Expr_ :: * ;
231
+ use ast:: Expr_ :: * ;
228
232
match expr. node {
229
233
Add ( ref a, ref b) => interp_expr ( env, a) + interp_expr ( env, b) ,
230
234
Sub ( ref a, ref b) => interp_expr ( env, a) - interp_expr ( env, b) ,
@@ -249,7 +253,8 @@ mod interp {
249
253
fn main ( ) {
250
254
let mut s = String :: new ( ) ;
251
255
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) ) ;
253
258
let program = parser:: parse ( lexer) . unwrap ( ) ;
254
259
interp:: interp ( & program) ;
255
260
}
0 commit comments