@@ -168,6 +168,28 @@ where
168168 }
169169 }
170170
171+ fn parse_term_or_tuple ( & mut self ) -> Result < ( chc:: Term < T :: Output > , chc:: Sort ) > {
172+ let mut terms_and_sorts = Vec :: new ( ) ;
173+ loop {
174+ terms_and_sorts. push ( self . parse_term ( ) ?) ;
175+ if let Some ( Token {
176+ kind : TokenKind :: Comma ,
177+ ..
178+ } ) = self . look_ahead_token ( 0 )
179+ {
180+ self . consume ( ) ;
181+ } else {
182+ break ;
183+ }
184+ }
185+ if terms_and_sorts. len ( ) == 1 {
186+ Ok ( terms_and_sorts. pop ( ) . unwrap ( ) )
187+ } else {
188+ let ( terms, sorts) = terms_and_sorts. into_iter ( ) . unzip ( ) ;
189+ Ok ( ( chc:: Term :: tuple ( terms) , chc:: Sort :: tuple ( sorts) ) )
190+ }
191+ }
192+
171193 fn parse_atom_term ( & mut self ) -> Result < ( chc:: Term < T :: Output > , chc:: Sort ) > {
172194 let tt = self . next_token_tree ( "term" ) ?. clone ( ) ;
173195
@@ -178,103 +200,141 @@ where
178200 resolver : self . boxed_resolver ( ) ,
179201 cursor : s. trees ( ) ,
180202 } ;
181- let term = parser. parse_term ( ) ?;
203+ let ( term, sort ) = parser. parse_term_or_tuple ( ) ?;
182204 parser. end_of_input ( ) ?;
183- return Ok ( term) ;
205+ return Ok ( ( term, sort ) ) ;
184206 }
185- _ => unimplemented ! ( ) ,
207+ _ => return Err ( ParseAttrError :: unexpected_token_tree ( "token" , tt ) ) ,
186208 } ;
187209
188- if let Some ( ( ident, _) ) = t. ident ( ) {
210+ let ( term , sort ) = if let Some ( ( ident, _) ) = t. ident ( ) {
189211 let ( v, sort) = self . resolve ( ident) ?;
190- return Ok ( ( chc:: Term :: var ( v) , sort) ) ;
212+ ( chc:: Term :: var ( v) , sort)
213+ } else {
214+ match t. kind {
215+ TokenKind :: Literal ( lit) => match lit. kind {
216+ LitKind :: Integer => (
217+ chc:: Term :: int ( lit. symbol . as_str ( ) . parse ( ) . unwrap ( ) ) ,
218+ chc:: Sort :: int ( ) ,
219+ ) ,
220+ _ => unimplemented ! ( ) ,
221+ } ,
222+ _ => {
223+ return Err ( ParseAttrError :: unexpected_token (
224+ "identifier, or literal" ,
225+ t. clone ( ) ,
226+ ) ) ;
227+ }
228+ }
229+ } ;
230+
231+ Ok ( ( term, sort) )
232+ }
233+
234+ fn parse_postfix_term ( & mut self ) -> Result < ( chc:: Term < T :: Output > , chc:: Sort ) > {
235+ let ( term, sort) = self . parse_atom_term ( ) ?;
236+
237+ let mut fields = Vec :: new ( ) ;
238+ while let Some ( Token {
239+ kind : TokenKind :: Dot ,
240+ ..
241+ } ) = self . look_ahead_token ( 0 )
242+ {
243+ self . consume ( ) ;
244+ match self . next_token ( "field" ) ? {
245+ Token {
246+ kind : TokenKind :: Literal ( lit) ,
247+ ..
248+ } if matches ! ( lit. kind, LitKind :: Integer ) => {
249+ let idx = lit. symbol . as_str ( ) . parse ( ) . unwrap ( ) ;
250+ fields. push ( idx) ;
251+ }
252+ t => return Err ( ParseAttrError :: unexpected_token ( "field" , t. clone ( ) ) ) ,
253+ }
191254 }
192- let ( term, sort) = match t. kind {
193- TokenKind :: Literal ( lit) => match lit. kind {
194- LitKind :: Integer => (
195- chc:: Term :: int ( lit. symbol . as_str ( ) . parse ( ) . unwrap ( ) ) ,
196- chc:: Sort :: int ( ) ,
197- ) ,
198- _ => unimplemented ! ( ) ,
199- } ,
200- TokenKind :: BinOp ( BinOpToken :: Minus ) => {
201- let ( operand, sort) = self . parse_atom_term ( ) ?;
255+
256+ let term = fields. iter ( ) . fold ( term, |acc, idx| acc. tuple_proj ( * idx) ) ;
257+ let sort = fields. iter ( ) . fold ( sort, |acc, idx| acc. tuple_elem ( * idx) ) ;
258+ Ok ( ( term, sort) )
259+ }
260+
261+ fn parse_prefix_term ( & mut self ) -> Result < ( chc:: Term < T :: Output > , chc:: Sort ) > {
262+ let ( term, sort) = match self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
263+ Some ( TokenKind :: BinOp ( BinOpToken :: Minus ) ) => {
264+ self . consume ( ) ;
265+ let ( operand, sort) = self . parse_postfix_term ( ) ?;
202266 ( operand. neg ( ) , sort)
203267 }
204- TokenKind :: BinOp ( BinOpToken :: Star ) => {
205- let ( operand, sort) = self . parse_atom_term ( ) ?;
268+ Some ( TokenKind :: BinOp ( BinOpToken :: Star ) ) => {
269+ self . consume ( ) ;
270+ let ( operand, sort) = self . parse_postfix_term ( ) ?;
206271 match sort {
207272 chc:: Sort :: Box ( inner) => ( chc:: Term :: box_current ( operand) , * inner) ,
208273 chc:: Sort :: Mut ( inner) => ( chc:: Term :: mut_current ( operand) , * inner) ,
209274 _ => return Err ( ParseAttrError :: unsorted_op ( "*" , sort) ) ,
210275 }
211276 }
212- TokenKind :: BinOp ( BinOpToken :: Caret ) => {
213- let ( operand, sort) = self . parse_atom_term ( ) ?;
277+ Some ( TokenKind :: BinOp ( BinOpToken :: Caret ) ) => {
278+ self . consume ( ) ;
279+ let ( operand, sort) = self . parse_postfix_term ( ) ?;
214280 if let chc:: Sort :: Mut ( inner) = sort {
215281 ( chc:: Term :: mut_final ( operand) , * inner)
216282 } else {
217283 return Err ( ParseAttrError :: unsorted_op ( "^" , sort) ) ;
218284 }
219285 }
220- _ => {
221- return Err ( ParseAttrError :: unexpected_token_tree (
222- "-, *, ^, (, identifier, or literal" ,
223- tt,
224- ) )
225- }
286+ _ => self . parse_postfix_term ( ) ?,
226287 } ;
227-
228288 Ok ( ( term, sort) )
229289 }
230290
231291 fn parse_term ( & mut self ) -> Result < ( chc:: Term < T :: Output > , chc:: Sort ) > {
232- let ( lhs, lhs_sort) = self . parse_atom_term ( ) ?;
292+ let ( lhs, lhs_sort) = self . parse_prefix_term ( ) ?;
233293
234294 let ( term, sort) = match self . look_ahead_token ( 0 ) . map ( |t| & t. kind ) {
235295 Some ( TokenKind :: BinOp ( BinOpToken :: Plus ) ) => {
236296 self . consume ( ) ;
237- let ( rhs, _) = self . parse_atom_term ( ) ?;
297+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
238298 ( lhs. add ( rhs) , chc:: Sort :: int ( ) )
239299 }
240300 Some ( TokenKind :: BinOp ( BinOpToken :: Minus ) ) => {
241301 self . consume ( ) ;
242- let ( rhs, _) = self . parse_atom_term ( ) ?;
302+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
243303 ( lhs. sub ( rhs) , chc:: Sort :: int ( ) )
244304 }
245305 Some ( TokenKind :: BinOp ( BinOpToken :: Star ) ) => {
246306 self . consume ( ) ;
247- let ( rhs, _) = self . parse_atom_term ( ) ?;
307+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
248308 ( lhs. mul ( rhs) , chc:: Sort :: int ( ) )
249309 }
250310 Some ( TokenKind :: EqEq ) => {
251311 self . consume ( ) ;
252- let ( rhs, _) = self . parse_atom_term ( ) ?;
312+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
253313 ( lhs. eq ( rhs) , chc:: Sort :: bool ( ) )
254314 }
255315 Some ( TokenKind :: Ne ) => {
256316 self . consume ( ) ;
257- let ( rhs, _) = self . parse_atom_term ( ) ?;
317+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
258318 ( lhs. ne ( rhs) , chc:: Sort :: bool ( ) )
259319 }
260320 Some ( TokenKind :: Ge ) => {
261321 self . consume ( ) ;
262- let ( rhs, _) = self . parse_atom_term ( ) ?;
322+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
263323 ( lhs. ge ( rhs) , chc:: Sort :: bool ( ) )
264324 }
265325 Some ( TokenKind :: Le ) => {
266326 self . consume ( ) ;
267- let ( rhs, _) = self . parse_atom_term ( ) ?;
327+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
268328 ( lhs. le ( rhs) , chc:: Sort :: bool ( ) )
269329 }
270330 Some ( TokenKind :: Gt ) => {
271331 self . consume ( ) ;
272- let ( rhs, _) = self . parse_atom_term ( ) ?;
332+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
273333 ( lhs. gt ( rhs) , chc:: Sort :: bool ( ) )
274334 }
275335 Some ( TokenKind :: Lt ) => {
276336 self . consume ( ) ;
277- let ( rhs, _) = self . parse_atom_term ( ) ?;
337+ let ( rhs, _) = self . parse_prefix_term ( ) ?;
278338 ( lhs. lt ( rhs) , chc:: Sort :: bool ( ) )
279339 }
280340 _ => return Ok ( ( lhs, lhs_sort) ) ,
@@ -295,7 +355,7 @@ where
295355 }
296356 }
297357
298- let ( lhs, _) = self . parse_atom_term ( ) ?;
358+ let ( lhs, _) = self . parse_prefix_term ( ) ?;
299359 let pred = match self . next_token ( "<=, >=, <, >, == or !=" ) ? {
300360 Token {
301361 kind : TokenKind :: EqEq ,
@@ -321,7 +381,12 @@ where
321381 kind : TokenKind :: Lt ,
322382 ..
323383 } => chc:: KnownPred :: LESS_THAN ,
324- t => return Err ( ParseAttrError :: unexpected_token ( "==" , t. clone ( ) ) ) ,
384+ t => {
385+ return Err ( ParseAttrError :: unexpected_token (
386+ "<=, >=, <, >, == or !=" ,
387+ t. clone ( ) ,
388+ ) )
389+ }
325390 } ;
326391 let ( rhs, _) = self . parse_term ( ) ?;
327392 Ok ( chc:: Atom :: new ( pred. into ( ) , vec ! [ lhs, rhs] ) )
@@ -340,16 +405,16 @@ where
340405 let atom = self . parse_atom ( ) ?;
341406 Ok ( chc:: Formula :: Atom ( atom) . not ( ) )
342407 }
343- Some ( TokenTree :: Delimited ( _, _, Delimiter :: Parenthesis , s) ) => {
344- self . consume ( ) ;
345- let mut parser = Parser {
346- resolver : self . boxed_resolver ( ) ,
347- cursor : s. trees ( ) ,
348- } ;
349- let formula = parser. parse_formula ( ) ?;
350- parser. end_of_input ( ) ?;
351- Ok ( formula)
352- }
408+ // Some(TokenTree::Delimited(_, _, Delimiter::Parenthesis, s)) => {
409+ // self.consume();
410+ // let mut parser = Parser {
411+ // resolver: self.boxed_resolver(),
412+ // cursor: s.trees(),
413+ // };
414+ // let formula = parser.parse_formula()?;
415+ // parser.end_of_input()?;
416+ // Ok(formula)
417+ // }
353418 _ => {
354419 let atom = self . parse_atom ( ) ?;
355420 Ok ( chc:: Formula :: Atom ( atom) )
0 commit comments