source: ruby/trunk/adl_parser/lib/scanner.rb@ 18

Last change on this file since 18 was 18, checked in by Tatsukawa, Akimichi, 16 years ago

parsing c_any fails

File size: 5.4 KB
Line 
1require 'logger'
2require 'rubygems'
3require 'yaparc'
4
5
6
7module OpenEHR
8 module ADL
9 module Scanner
10 module DADL
11 # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/adl/parser/adl_scanner.l
12 RESERVED = {
13 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
14 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
15 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
16 }
17
18 LOG = Logger.new('log/scanner.log','daily')
19
20 class RootScanner
21 include Yaparc::Parsable
22 def initialize
23 @parser = lambda do |input|
24 Yaparc::Alt.new(Reserved.new,
25 V_QUALIFIED_TERM_CODE_REF.new,
26 V_LOCAL_TERM_CODE_REF.new,
27 ERR_V_QUALIFIED_TERM_CODE_REF.new,
28 V_TYPE_IDENTIFIER.new,
29 V_GENERIC_TYPE_IDENTIFIER.new,
30 V_STRING.new,
31 V_LOCAL_CODE.new,
32 V_REAL.new
33 )
34 end
35 end
36 end
37
38 class Reserved
39 include Yaparc::Parsable
40
41 def initialize
42 @parser = lambda do |input|
43 reserved_parsers = OpenEHR::ADL::Scanner::DADL::RESERVED.map do |keyword|
44 Yaparc::Tokenize.new(Yaparc::Literal.new(keyword))
45 end
46 Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match|
47 LOG.info("Reserved: #{match}")
48 [OpenEHR::ADL::Scanner::DADL::RESERVED[match], OpenEHR::ADL::Scanner::DADL::RESERVED[match]]
49 end,
50 Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match|
51 LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}")
52 [:V_ATTRIBUTE_IDENTIFIER, match]
53 end)
54 end
55 end
56 end
57
58 class V_QUALIFIED_TERM_CODE_REF
59 include Yaparc::Parsable
60 def initialize
61 @parser = lambda do |input|
62 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/)) do |match|
63 LOG.info("V_QUALIFIED_TERM_CODE_REF: #{match}")
64 [:V_QUALIFIED_TERM_CODE_REF, match]
65 end
66 end
67 end
68 end
69
70 class V_LOCAL_TERM_CODE_REF
71 include Yaparc::Parsable
72 def initialize
73 @parser = lambda do |input|
74 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/)) do |match|
75 LOG.info("V_TERM_CODE_REF: #{match}")
76 [:V_LOCAL_TERM_CODE_REF, match]
77 end
78 end
79 end
80 end
81
82 class ERR_V_QUALIFIED_TERM_CODE_REF
83 include Yaparc::Parsable
84 def initialize
85 @parser = lambda do |input|
86 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/)) do |match|
87 LOG.info("ERR_V_QUALIFIED_TERM_CODE_REF: #{match}")
88 [:ERR_V_QUALIFIED_TERM_CODE_REF, match]
89 end
90 end
91 end
92 end
93
94 class V_TYPE_IDENTIFIER
95 include Yaparc::Parsable
96 def initialize
97 @parser = lambda do |input|
98 Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*/)) do |match|
99 LOG.info("V_TYPE_IDENTIFIER: #{match}")
100 [:V_TYPE_IDENTIFIER, match]
101 end
102 end
103 end
104 end
105
106 class V_GENERIC_TYPE_IDENTIFIER
107 include Yaparc::Parsable
108 def initialize
109 @parser = lambda do |input|
110 Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/)) do |match|
111 LOG.info("V_GENERIC_TYPE_IDENTIFIER: #{match}")
112 [:V_GENERIC_TYPE_IDENTIFIER, match]
113 end
114 end
115 end
116 end
117
118
119 class V_LOCAL_CODE
120 include Yaparc::Parsable
121 def initialize
122 @parser = lambda do |input|
123 Yaparc::Apply.new(Yaparc::Regex.new(/\Aa[ct][0-9.]+/)) do |match|
124 LOG.info("V_LOCAL_CODE: #{match}")
125 [:V_LOCAL_CODE, match]
126 end
127 end
128 end
129 end
130
131 class V_STRING
132 include Yaparc::Parsable
133 def initialize
134 @parser = lambda do |input|
135 Yaparc::Apply.new(Yaparc::Regex.new(/\A"([^"]*)"/m)) do |match|
136 LOG.info("V_STRING: #{match}")
137 [:V_STRING, match]
138 end
139 end
140 end
141 end
142
143 class V_REAL
144 include Yaparc::Parsable
145 def initialize
146 @parser = lambda do |input|
147 Yaparc::Apply.new(Yaparc::Regex.new(/\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+/)) do |match|
148 LOG.info("V_REAL: #{match}")
149 [:V_REAL, match]
150 end
151 end
152 end
153 end
154
155 end # of DADL
156
157 module CADL
158 # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_scanner.l
159 end
160 end
161 end
162end
Note: See TracBrowser for help on using the repository browser.