@@ -9,8 +9,8 @@ use crate::{
9
9
parser:: { IntoChildNodes , Node , Rule , RuleMatcher } ,
10
10
value:: {
11
11
BooleanLiteral , DateFragment , DateLiteral , DateTimeLiteral , DateTimeTZLiteral , DurationDate , DurationLiteral ,
12
- DurationTime , IntegerLiteral , Literal , NumericLiteral , Sign , SignedDecimalLiteral , SignedIntegerLiteral ,
13
- StringLiteral , TimeFragment , TimeZone , ValueLiteral ,
12
+ DurationTime , IntegerLiteral , Literal , NumericLiteral , Sign , SignedDecimalLiteral , SignedDoubleLiteral ,
13
+ SignedIntegerLiteral , StringLiteral , TimeFragment , TimeZone , ValueLiteral ,
14
14
} ,
15
15
} ;
16
16
@@ -23,6 +23,7 @@ pub(super) fn visit_value_literal(node: Node<'_>) -> Literal {
23
23
Rule :: boolean_literal => ValueLiteral :: Boolean ( BooleanLiteral { value : child. as_str ( ) . to_owned ( ) } ) ,
24
24
Rule :: signed_integer => ValueLiteral :: Integer ( visit_signed_integer ( child) ) ,
25
25
Rule :: signed_decimal => ValueLiteral :: Decimal ( visit_signed_decimal ( child) ) ,
26
+ Rule :: signed_double => ValueLiteral :: Double ( visit_signed_double ( child) ) ,
26
27
27
28
Rule :: datetime_tz_literal => ValueLiteral :: DateTimeTz ( visit_datetime_tz_literal ( child) ) ,
28
29
Rule :: datetime_literal => ValueLiteral :: DateTime ( visit_datetime_literal ( child) ) ,
@@ -79,15 +80,29 @@ fn visit_signed_decimal(node: Node<'_>) -> SignedDecimalLiteral {
79
80
debug_assert_eq ! ( node. as_rule( ) , Rule :: signed_decimal) ;
80
81
let mut children = node. into_children ( ) ;
81
82
let first_node = children. consume_any ( ) ;
82
- let ( sign, decimal) = match first_node. as_rule ( ) {
83
+ let ( sign, decimal_with_suffix) = match first_node. as_rule ( ) {
84
+ Rule :: sign => ( Some ( visit_sign ( first_node) ) , children. consume_expected ( Rule :: decimal_literal) . as_str ( ) ) ,
85
+ Rule :: decimal_literal => ( None , first_node. as_str ( ) ) ,
86
+ _ => unreachable ! ( "{}" , TypeQLError :: IllegalGrammar { input: first_node. to_string( ) } ) ,
87
+ } ;
88
+ debug_assert_eq ! ( children. try_consume_any( ) , None ) ;
89
+ let decimal = decimal_with_suffix. trim_end_matches ( "dec" ) . to_owned ( ) ;
90
+ SignedDecimalLiteral { sign, decimal }
91
+ }
92
+
93
+ fn visit_signed_double ( node : Node < ' _ > ) -> SignedDoubleLiteral {
94
+ debug_assert_eq ! ( node. as_rule( ) , Rule :: signed_double) ;
95
+ let mut children = node. into_children ( ) ;
96
+ let first_node = children. consume_any ( ) ;
97
+ let ( sign, double) = match first_node. as_rule ( ) {
83
98
Rule :: sign => {
84
- ( Some ( visit_sign ( first_node) ) , children. consume_expected ( Rule :: decimal_literal ) . as_str ( ) . to_owned ( ) )
99
+ ( Some ( visit_sign ( first_node) ) , children. consume_expected ( Rule :: double_literal ) . as_str ( ) . to_owned ( ) )
85
100
}
86
- Rule :: decimal_literal => ( None , first_node. as_str ( ) . to_owned ( ) ) ,
101
+ Rule :: double_literal => ( None , first_node. as_str ( ) . to_owned ( ) ) ,
87
102
_ => unreachable ! ( "{}" , TypeQLError :: IllegalGrammar { input: first_node. to_string( ) } ) ,
88
103
} ;
89
104
debug_assert_eq ! ( children. try_consume_any( ) , None ) ;
90
- SignedDecimalLiteral { sign, decimal }
105
+ SignedDoubleLiteral { sign, double }
91
106
}
92
107
93
108
fn visit_datetime_tz_literal ( node : Node < ' _ > ) -> DateTimeTZLiteral {
0 commit comments