1- use core:: cfg:: { TokenSet , Syntax } ;
2- use core:: lex:: LexIterator ;
1+ use pgen_core:: cfg:: { TokenSet , Syntax } ;
2+ use pgen_core:: lex:: Token ;
3+ use pgen_core:: parse:: { SExp , SExpBuilder } ;
34
4- use super :: builder:: { LRAction , LR1Configure } ;
5+ use crate :: error:: ParseError ;
6+ use crate :: builder:: { LRAction , LR1Configure } ;
57
68pub ( super ) struct LR1Driver < ' a , ' b , T , S > ( & ' b LR1Configure < ' a , T , S > )
79where
@@ -19,41 +21,45 @@ where
1921
2022 pub fn run < ' c > (
2123 & self ,
22- lexer : & mut impl LexIterator < ' a , ' c , T > ,
23- ) -> anyhow:: Result < ( ) > {
24+ lexer : & mut impl Iterator < Item = Token < ' a , ' c , T > > ,
25+ ) -> anyhow:: Result < SExp < ' a , ' c , T , S > > {
2426 let mut stack = vec ! [ 0 ] ;
27+ let mut builder = SExpBuilder :: new ( ) ;
2528 loop {
2629 let input = lexer. next ( ) ;
2730 loop {
2831 let top = stack[ stack. len ( ) - 1 ] ;
2932 let action = match input {
3033 Some ( token) => (
3134 self . 0 . action_table [ top] . get ( & token. kind ) . unwrap ( ) ,
32- Some ( token. as_str ( ) ) ,
35+ Some ( token) ,
3336 ) ,
3437 None => (
3538 & self . 0 . eof_action_table [ top] ,
3639 None
3740 ) ,
3841 } ;
39- match action. 0 {
40- LRAction :: Shift ( new_state) => {
42+ match action {
43+ ( LRAction :: Shift ( new_state) , Some ( token ) ) => {
4144 stack. push ( * new_state) ;
45+ builder. push ( token) ;
4246 break ;
4347 }
44- LRAction :: Reduce ( _ , goto, elems_cnt) => {
48+ ( LRAction :: Reduce ( tag , goto, elems_cnt) , _ ) => {
4549 stack. truncate ( stack. len ( ) - elems_cnt) ;
4650 stack. push ( self . 0 . goto_table [ stack[ stack. len ( ) - 1 ] ] [ * goto] ) ;
51+ builder. wrap ( * tag, * elems_cnt) ;
4752 }
48- LRAction :: None => {
49- let pos = lexer. pos ( ) ;
50- let pos = match action. 1 {
51- Some ( raw) => ( pos. 0 , pos. 1 - ( raw. len ( ) as u32 ) ) ,
52- None => pos,
53- } ;
54- return Err ( anyhow:: anyhow!( "Error at {:?}" , pos) . into ( ) ) ;
53+ ( LRAction :: Accept , _) => {
54+ return builder. build ( ) ;
5555 }
56- LRAction :: Accept => return Ok ( ( ) ) ,
56+ ( LRAction :: None , Some ( token) ) => {
57+ return Err ( ParseError :: new_unexpected_token ( token) . into ( ) ) ;
58+ }
59+ ( LRAction :: None , None ) => {
60+ return Err ( ParseError :: UnexpectedEOF . into ( ) ) ;
61+ }
62+ _ => unreachable ! ( ) ,
5763 }
5864 }
5965 }
0 commit comments