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