module Canql

grammar Anomaly
  rule anomalies
    and_keyword? existance_modifier:anomalies_no_keyword? status_type:anomaly_status? natal_period:anomalies_natal_period? screening_status_type:anomaly_screening_status? code_data:(space first:anomalies_icd_code rest:more_anomalies_icd_codes* word_break)? anomalies_keyword <Nodes::Anomaly::WithCondition>
  end

  rule anomalies_no_keyword
    space ('no' / 'some') word_break
  end

  rule anomalies_natal_period
    (prenatal_keyword / postnatal_keyword)
  end

  rule anomaly_status
    (suspected_keyword / confirmed_keyword / probable_keyword / diagnosed_keyword)
  end

  rule anomaly_screening_status
    space ('unscreened' / 'fa detected' / 'fapos' / 'combined detected' / 'ctpos' /
     'quad detected' / 'qtpos' / 'fa undetected' / 'faneg' / 'combined undetected' /
     'ctneg' / 'quad undetected' / 'qtneg' / 'nonwindow' / 'nws' / 'incomplete screen' /
     'ics' / 'ineligible unbooked' / 'inb' / 'early detected' / 'ied' /
     'screen declined' / 'sd' / 'ineligible early loss' / 'iefl' / 'ineligible top' /
     'itop' / 'missed screen' / 'ms' / 'excluded' / 'exc' / 'detected' /
     'undetected' / 'ineligible' / 'pending data') word_break
  end

  rule anomalies_keyword
    space 'anomalies' word_break
  end

  rule more_anomalies_icd_codes
    ','? space? ('or' space)? anomalies_icd_code <Nodes::Anomaly::AdditionalCodeNode>
  end

  rule anomalies_icd_code
    (fasp_rating  / icd_code_name / code_group)
  end

  rule icd_code_name
    [a-z] [0-9] 1..3 <Nodes::Anomaly::SingleIcdCodeNode>
  end

  rule code_group
    ('fasp plus' / 'plus' / 'fasp' / 'structural' / 'trisomy') <Nodes::Anomaly::SingleCodeGroupNode>
  end

  rule fasp_rating
    ('fasp red and amber' / 'fasp amber and red' / 'fasp red' / 'fasp amber' / 'fasp green') <Nodes::Anomaly::SingleFaspRatingNode>
  end
end

end