1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2012 Jean Privat <jean@pryen.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Parsing of literal values in the abstract syntax tree.
23 import serialization_phase
25 redef class ToolContext
26 var literal_phase
: Phase = new LiteralPhase(self, [serialization_phase
])
29 private class LiteralPhase
32 redef fun process_nmodule
(nmodule
) do nmodule
.do_literal
(toolcontext
)
36 # Visit the module to compute the real value of the literal-related node of the AST.
37 # Warnings and errors are displayed on the toolcontext.
38 fun do_literal
(toolcontext
: ToolContext)
40 var v
= new LiteralVisitor(toolcontext
)
45 private class LiteralVisitor
48 var toolcontext
: ToolContext
50 init(toolcontext
: ToolContext)
52 self.toolcontext
= toolcontext
57 n
.accept_literal
(self)
63 private fun accept_literal
(v
: LiteralVisitor) do end
67 # The value of the literal int once computed.
68 var value
: nullable Int
69 redef fun accept_literal
(v
)
71 self.value
= self.n_number
.text
.to_i
75 redef class AFloatExpr
76 # The value of the literal float once computed.
77 var value
: nullable Float
78 redef fun accept_literal
(v
)
80 self.value
= self.n_float
.text
.to_f
85 # The value of the literal char once computed.
86 var value
: nullable Char
87 redef fun accept_literal
(v
)
89 var txt
= self.n_char
.text
.unescape_nit
90 if txt
.length
!= 3 then
91 v
.toolcontext
.error
(self.hot_location
, "Invalid character literal {txt}")
98 redef class AStringFormExpr
99 # The value of the literal string once computed.
100 var value
: nullable String
101 redef fun accept_literal
(v
)
103 var txt
= self.n_string
.text
105 if txt
[0] == txt
[1] and txt
.length
>= 6 then skip
= 3
106 self.value
= txt
.substring
(skip
, txt
.length-
(2*skip
)).unescape_nit