[17] | 1 | require 'logger'
|
---|
| 2 | require 'rubygems'
|
---|
| 3 | require 'yaparc'
|
---|
| 4 |
|
---|
| 5 |
|
---|
| 6 |
|
---|
| 7 | module OpenEHR
|
---|
| 8 | module ADL
|
---|
| 9 | module Scanner
|
---|
[19] | 10 | module Common
|
---|
[18] | 11 | LOG = Logger.new('log/scanner.log','daily')
|
---|
[17] | 12 |
|
---|
| 13 | class V_QUALIFIED_TERM_CODE_REF
|
---|
| 14 | include Yaparc::Parsable
|
---|
| 15 | def initialize
|
---|
| 16 | @parser = lambda do |input|
|
---|
| 17 | Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/)) do |match|
|
---|
| 18 | LOG.info("V_QUALIFIED_TERM_CODE_REF: #{match}")
|
---|
| 19 | [:V_QUALIFIED_TERM_CODE_REF, match]
|
---|
| 20 | end
|
---|
| 21 | end
|
---|
| 22 | end
|
---|
| 23 | end
|
---|
[19] | 24 |
|
---|
[17] | 25 | class V_LOCAL_TERM_CODE_REF
|
---|
| 26 | include Yaparc::Parsable
|
---|
| 27 | def initialize
|
---|
| 28 | @parser = lambda do |input|
|
---|
| 29 | Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/)) do |match|
|
---|
| 30 | LOG.info("V_TERM_CODE_REF: #{match}")
|
---|
| 31 | [:V_LOCAL_TERM_CODE_REF, match]
|
---|
| 32 | end
|
---|
| 33 | end
|
---|
| 34 | end
|
---|
| 35 | end
|
---|
[18] | 36 |
|
---|
| 37 | class ERR_V_QUALIFIED_TERM_CODE_REF
|
---|
| 38 | include Yaparc::Parsable
|
---|
| 39 | def initialize
|
---|
| 40 | @parser = lambda do |input|
|
---|
| 41 | Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/)) do |match|
|
---|
| 42 | LOG.info("ERR_V_QUALIFIED_TERM_CODE_REF: #{match}")
|
---|
| 43 | [:ERR_V_QUALIFIED_TERM_CODE_REF, match]
|
---|
| 44 | end
|
---|
| 45 | end
|
---|
| 46 | end
|
---|
| 47 | end
|
---|
| 48 |
|
---|
| 49 | class V_TYPE_IDENTIFIER
|
---|
| 50 | include Yaparc::Parsable
|
---|
| 51 | def initialize
|
---|
| 52 | @parser = lambda do |input|
|
---|
| 53 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*/)) do |match|
|
---|
| 54 | LOG.info("V_TYPE_IDENTIFIER: #{match}")
|
---|
| 55 | [:V_TYPE_IDENTIFIER, match]
|
---|
| 56 | end
|
---|
| 57 | end
|
---|
| 58 | end
|
---|
| 59 | end
|
---|
| 60 |
|
---|
| 61 | class V_GENERIC_TYPE_IDENTIFIER
|
---|
| 62 | include Yaparc::Parsable
|
---|
| 63 | def initialize
|
---|
| 64 | @parser = lambda do |input|
|
---|
| 65 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/)) do |match|
|
---|
| 66 | LOG.info("V_GENERIC_TYPE_IDENTIFIER: #{match}")
|
---|
| 67 | [:V_GENERIC_TYPE_IDENTIFIER, match]
|
---|
| 68 | end
|
---|
| 69 | end
|
---|
| 70 | end
|
---|
| 71 | end
|
---|
| 72 |
|
---|
| 73 |
|
---|
| 74 | class V_LOCAL_CODE
|
---|
| 75 | include Yaparc::Parsable
|
---|
| 76 | def initialize
|
---|
| 77 | @parser = lambda do |input|
|
---|
| 78 | Yaparc::Apply.new(Yaparc::Regex.new(/\Aa[ct][0-9.]+/)) do |match|
|
---|
| 79 | LOG.info("V_LOCAL_CODE: #{match}")
|
---|
| 80 | [:V_LOCAL_CODE, match]
|
---|
| 81 | end
|
---|
| 82 | end
|
---|
| 83 | end
|
---|
| 84 | end
|
---|
| 85 |
|
---|
| 86 | class V_STRING
|
---|
| 87 | include Yaparc::Parsable
|
---|
| 88 | def initialize
|
---|
| 89 | @parser = lambda do |input|
|
---|
| 90 | Yaparc::Apply.new(Yaparc::Regex.new(/\A"([^"]*)"/m)) do |match|
|
---|
| 91 | LOG.info("V_STRING: #{match}")
|
---|
| 92 | [:V_STRING, match]
|
---|
| 93 | end
|
---|
| 94 | end
|
---|
| 95 | end
|
---|
| 96 | end
|
---|
| 97 |
|
---|
| 98 | class V_REAL
|
---|
| 99 | include Yaparc::Parsable
|
---|
| 100 | def initialize
|
---|
| 101 | @parser = lambda do |input|
|
---|
| 102 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+/)) do |match|
|
---|
| 103 | LOG.info("V_REAL: #{match}")
|
---|
| 104 | [:V_REAL, match]
|
---|
| 105 | end
|
---|
| 106 | end
|
---|
| 107 | end
|
---|
| 108 | end
|
---|
| 109 |
|
---|
[19] | 110 | #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
|
---|
| 111 | class V_ISO8601_DURATION
|
---|
| 112 | include Yaparc::Parsable
|
---|
| 113 | def initialize
|
---|
| 114 | @parser = lambda do |input|
|
---|
| 115 | Yaparc::Apply.new(
|
---|
[20] | 116 | Yaparc::Alt.new(Yaparc::Regex.new(/\AP([0-9]+|[yY])?([0-9]+|[mM])?([0-9]+|[wW])?([0-9]+|[dD])?T([0-9]+|[hH])?([0-9]+|[mM])?([0-9]+|[sS])?/),
|
---|
[26] | 117 | Yaparc::Regex.new(/\AP([0-9]+|[yY])?([0-9]+|[mM])?([0-9]+|[wW])?([0-9]+|[dD])?/))) do |match|
|
---|
[19] | 118 | LOG.info("V_ISO8601_DURATION: #{match}")
|
---|
| 119 | [:V_ISO8601_DURATION, match]
|
---|
| 120 | end
|
---|
| 121 | end
|
---|
| 122 | end
|
---|
| 123 | end
|
---|
| 124 |
|
---|
| 125 | end # of Common
|
---|
| 126 |
|
---|
| 127 | module DADL
|
---|
| 128 | # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/adl/parser/adl_scanner.l
|
---|
| 129 | RESERVED = {
|
---|
| 130 | 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
|
---|
| 131 | 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
|
---|
| 132 | 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
|
---|
| 133 | }
|
---|
| 134 |
|
---|
| 135 | class RootScanner
|
---|
| 136 | include Yaparc::Parsable
|
---|
| 137 | def initialize
|
---|
| 138 | @parser = lambda do |input|
|
---|
| 139 | Yaparc::Alt.new(Reserved.new,
|
---|
| 140 | OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new,
|
---|
| 141 | OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new,
|
---|
| 142 | OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new,
|
---|
| 143 | OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new,
|
---|
| 144 | OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new,
|
---|
| 145 | OpenEHR::ADL::Scanner::Common::V_STRING.new,
|
---|
| 146 | OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new,
|
---|
| 147 | OpenEHR::ADL::Scanner::Common::V_REAL.new,
|
---|
| 148 | OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new
|
---|
| 149 | )
|
---|
| 150 | end
|
---|
| 151 | end
|
---|
| 152 | end
|
---|
| 153 |
|
---|
| 154 | class Reserved
|
---|
| 155 | include Yaparc::Parsable
|
---|
| 156 |
|
---|
| 157 | def initialize
|
---|
| 158 | @parser = lambda do |input|
|
---|
| 159 | reserved_parsers = OpenEHR::ADL::Scanner::DADL::RESERVED.map do |keyword|
|
---|
[25] | 160 | Yaparc::Tokenize.new(
|
---|
[33] | 161 | Yaparc::Literal.new(keyword[0])
|
---|
[25] | 162 | )
|
---|
[19] | 163 | end
|
---|
| 164 | Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match|
|
---|
| 165 | OpenEHR::ADL::Scanner::Common::LOG.info("Reserved: #{match}")
|
---|
| 166 | [OpenEHR::ADL::Scanner::DADL::RESERVED[match], OpenEHR::ADL::Scanner::DADL::RESERVED[match]]
|
---|
| 167 | end,
|
---|
| 168 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match|
|
---|
| 169 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}")
|
---|
| 170 | [:V_ATTRIBUTE_IDENTIFIER, match]
|
---|
| 171 | end)
|
---|
| 172 | end
|
---|
| 173 | end
|
---|
| 174 | end
|
---|
| 175 |
|
---|
| 176 |
|
---|
| 177 |
|
---|
[17] | 178 | end # of DADL
|
---|
[18] | 179 |
|
---|
[17] | 180 | module CADL
|
---|
| 181 | # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_scanner.l
|
---|
[19] | 182 | RESERVED = {
|
---|
| 183 | 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd]
|
---|
| 184 | 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd]
|
---|
| 185 | 'then' => :SYM_THEN, # [Tt][Hh][Ee][Nn]
|
---|
| 186 | 'else' => :SYM_ELSE, # [Ee][Ll][Ss][Ee]
|
---|
| 187 | 'and' => :SYM_AND, # [Aa][Nn][Dd]
|
---|
| 188 | 'or' => :SYM_OR, # [Oo][Rr]
|
---|
| 189 | 'xor' => :SYM_XOR, # [Xx][Oo][Rr]
|
---|
| 190 | 'not' => :SYM_NOT, # [Nn][Oo][Tt]
|
---|
| 191 | 'implies' => :SYM_IMPLIES, # [Ii][Mm][Pp][Ll][Ii][Ee][Ss]
|
---|
| 192 | 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
|
---|
| 193 | 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
|
---|
| 194 | 'forall' => :SYM_FORALL, # [Ff][Oo][Rr][_][Aa][Ll][Ll]
|
---|
| 195 | 'exists' => :SYM_EXISTS, # [Ee][Xx][Ii][Ss][Tt][Ss]
|
---|
| 196 | 'existence' => :SYM_EXISTENCE, # [Ee][Xx][Iu][Ss][Tt][Ee][Nn][Cc][Ee]
|
---|
| 197 | 'occurrences' => :SYM_OCCURRENCES, # [Oo][Cc][Cc][Uu][Rr][Rr][Ee][Nn][Cc][Ee][Ss]
|
---|
| 198 | 'cardinality' => :SYM_CARDINALITY, # [Cc][Aa][Rr][Dd][Ii][Nn][Aa][Ll][Ii][Tt][Yy]
|
---|
| 199 | 'unique' => :SYM_UNIQUE, # [Uu][Nn][Ii][Qq][Uu][Ee]
|
---|
| 200 | 'matches' => :SYM_MATCHES, # [Mm][Aa][Tt][Cc][Hh][Ee][Ss]
|
---|
| 201 | 'is_in' => :SYM_MATCHES, # [Ii][Ss][_][Ii][Nn]
|
---|
| 202 | 'invariant' => :SYM_INVARIANT, # [Ii][Nn][Vv][Aa][Rr][Ii][Aa][Nn][Tt]
|
---|
| 203 | 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
|
---|
| 204 | 'use_node' => :SYM_USE_NODE, # [Uu][Ss][Ee][_][Nn][Oo][Dd][Ee]
|
---|
| 205 | 'use_archetype' => :SYM_ALLOW_ARCHETYPE, # [Uu][Ss][Ee][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
|
---|
| 206 | 'allow_archetype' => :SYM_ALLOW_ARCHETYPE, # [Aa][Ll][Ll][Oo][Ww][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
|
---|
| 207 | 'include' => :SYM_INCLUDE, # [Ii][Nn][Cc][Ll][Uu][Dd][Ee]
|
---|
| 208 | 'exclude' => :SYM_EXCLUDE # [Ee][Xx][Cc][Ll][Uu][Dd][Ee]
|
---|
| 209 | }
|
---|
| 210 |
|
---|
| 211 | #V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X][T\t][hH?X][hH?X]:[mM?X][mM?X]:[sS?X][sS?X]/
|
---|
| 212 | class V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN
|
---|
| 213 | include Yaparc::Parsable
|
---|
| 214 | def initialize
|
---|
| 215 | @parser = lambda do |input|
|
---|
| 216 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X][T\t][hH?X][hH?X]:[mM?X][mM?X]:[sS?X][sS?X]/)) do |match|
|
---|
| 217 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN: #{match}")
|
---|
| 218 | [:V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, match]
|
---|
| 219 | end
|
---|
| 220 | end
|
---|
| 221 | end
|
---|
| 222 | end
|
---|
| 223 |
|
---|
| 224 | #V_ISO8601_DATE_CONSTRAINT_PATTERN /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/
|
---|
| 225 | class V_ISO8601_DATE_CONSTRAINT_PATTERN
|
---|
| 226 | include Yaparc::Parsable
|
---|
| 227 | def initialize
|
---|
| 228 | @parser = lambda do |input|
|
---|
| 229 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/)) do |match|
|
---|
| 230 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DATE_CONSTRAINT_PATTERN: #{match}")
|
---|
| 231 | [:V_ISO8601_DATE_CONSTRAINT_PATTERN, match]
|
---|
| 232 | end
|
---|
| 233 | end
|
---|
| 234 | end
|
---|
| 235 | end
|
---|
| 236 |
|
---|
| 237 | #V_ISO8601_TIME_CONSTRAINT_PATTERN /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/
|
---|
| 238 | class V_ISO8601_TIME_CONSTRAINT_PATTERN
|
---|
| 239 | include Yaparc::Parsable
|
---|
| 240 | def initialize
|
---|
| 241 | @parser = lambda do |input|
|
---|
| 242 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/)) do |match|
|
---|
| 243 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_TIME_CONSTRAINT_PATTERN: #{match}")
|
---|
| 244 | [:V_ISO8601_TIME_CONSTRAINT_PATTERN, match]
|
---|
| 245 | end
|
---|
| 246 | end
|
---|
| 247 | end
|
---|
| 248 | end
|
---|
| 249 |
|
---|
[26] | 250 | #V_ISO8601_DURATION_CONSTRAINT_PATTERN
|
---|
| 251 | class V_ISO8601_DURATION_CONSTRAINT_PATTERN
|
---|
| 252 | include Yaparc::Parsable
|
---|
| 253 | def initialize
|
---|
| 254 | @parser = lambda do |input|
|
---|
| 255 | Yaparc::Apply.new(Yaparc::Alt.new(Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?T[hH]?[mM]?[sS]?/),
|
---|
| 256 | Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?/))) do |match|
|
---|
| 257 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DURATION_CONSTRAINT_PATTERN: #{match}")
|
---|
| 258 | [:V_ISO8601_DURATION_CONSTRAINT_PATTERN, match]
|
---|
| 259 | end
|
---|
| 260 | end
|
---|
| 261 | end
|
---|
| 262 | end
|
---|
| 263 |
|
---|
[19] | 264 | #V_C_DOMAIN_TYPE /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</
|
---|
| 265 | class V_C_DOMAIN_TYPE
|
---|
| 266 | include Yaparc::Parsable
|
---|
| 267 | def initialize
|
---|
| 268 | @parser = lambda do |input|
|
---|
| 269 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*[ \n]*\</)) do |match|
|
---|
| 270 | OpenEHR::ADL::Scanner::Common::LOG.info("V_C_DOMAIN_TYPE: #{match}")
|
---|
| 271 | [:START_V_C_DOMAIN_TYPE_BLOCK, match]
|
---|
| 272 | end
|
---|
| 273 | end
|
---|
| 274 | end
|
---|
| 275 | end
|
---|
| 276 |
|
---|
| 277 | class RootScanner
|
---|
| 278 | include Yaparc::Parsable
|
---|
| 279 | def initialize
|
---|
| 280 | @parser = lambda do |input|
|
---|
| 281 | Yaparc::Alt.new(V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN.new,
|
---|
| 282 | V_ISO8601_DATE_CONSTRAINT_PATTERN.new,
|
---|
| 283 | V_ISO8601_TIME_CONSTRAINT_PATTERN.new,
|
---|
| 284 | OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new,
|
---|
| 285 | V_C_DOMAIN_TYPE.new,
|
---|
[26] | 286 | V_ISO8601_DURATION_CONSTRAINT_PATTERN.new,
|
---|
[19] | 287 | Reserved.new,
|
---|
| 288 | OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new,
|
---|
| 289 | OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new,
|
---|
| 290 | OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new,
|
---|
| 291 | OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new,
|
---|
| 292 | OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new,
|
---|
| 293 | OpenEHR::ADL::Scanner::Common::V_STRING.new,
|
---|
| 294 | OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new,
|
---|
| 295 | OpenEHR::ADL::Scanner::Common::V_REAL.new,
|
---|
| 296 | OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new
|
---|
| 297 | )
|
---|
| 298 | end
|
---|
| 299 | end
|
---|
| 300 | end
|
---|
| 301 |
|
---|
| 302 | class Reserved
|
---|
| 303 | include Yaparc::Parsable
|
---|
| 304 |
|
---|
| 305 | def initialize
|
---|
| 306 | @parser = lambda do |input|
|
---|
| 307 | orderd_reserved = RESERVED.keys.sort{|x,y| y.length <=> x.length }
|
---|
| 308 | reserved_parsers = orderd_reserved.map do |keyword|
|
---|
[33] | 309 | Yaparc::Literal.new(keyword)
|
---|
[19] | 310 | end
|
---|
| 311 | Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match|
|
---|
| 312 | OpenEHR::ADL::Scanner::Common::LOG.info("Reserved: #{match}")
|
---|
| 313 | [OpenEHR::ADL::Scanner::CADL::RESERVED[match], OpenEHR::ADL::Scanner::CADL::RESERVED[match]]
|
---|
| 314 | end,
|
---|
| 315 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match|
|
---|
| 316 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}")
|
---|
| 317 | [:V_ATTRIBUTE_IDENTIFIER, match]
|
---|
| 318 | end)
|
---|
| 319 | end
|
---|
| 320 | end
|
---|
| 321 | end
|
---|
| 322 |
|
---|
[17] | 323 | end
|
---|
| 324 | end
|
---|
| 325 | end
|
---|
| 326 | end
|
---|