Exemplo n.º 1
0
def lastres(ctx, institution, requirement_id):
  """
      lastres         : LASTRES NUMBER (OF NUMBER)?
                        class_or_credit
                        course_list? tag? display* label?;
  """
  return_dict = {'tag': 'lastres', 'class_or_credit': class_or_credit(ctx.class_or_credit())}

  numbers = ctx.NUMBER()
  return_dict['min_number'] = numbers.pop().getText().strip()
  if len(numbers) > 0:
    return_dict['of_number'] = numbers.pop().getText().strip()

  assert len(numbers) == 0

  if ctx.course_list():
    return_dict['courses'] = build_course_list(ctx.course_list(), institution, requirement_id)

  if ctx.display():
    display_text = ''
    for item in ctx.display():
      display_text += item.string().getText().strip(' "') + ' '
    return_dict['display'] = display_text.strip()

  if ctx.label():
    return_dict['label'] = ctx.label().string().getText().strip(' "')

  return return_dict
Exemplo n.º 2
0
def maxclass(ctx, institution, requirement_id):
  """
      maxclass        : MAXCLASS NUMBER course_list? tag?;
  """
  return_dict = {'tag': 'max_class',
                 'max_classes_allowed': ctx.NUMBER().getText().strip()}
  return_dict['courses'] = build_course_list(ctx.course_list(), institution, requirement_id)
  return return_dict
Exemplo n.º 3
0
def maxcredit(ctx, institution, requirement_id):
  """
      maxcredit       : MAXCREDIT NUMBER course_list? tag?;
  """
  return_dict = {'tag': 'max_credit',
                 'max_credits_allowed': ctx.NUMBER().getText().strip()}
  return_dict['courses'] = build_course_list(ctx.course_list(), institution, requirement_id)

  return return_dict
Exemplo n.º 4
0
def maxterm(ctx, institution, requirement_id):
  """
      maxterm         : MAXTERM NUMBER class_or_credit course_list tag?;
  """
  return_dict = {'tag': 'max_term',
                 'max_number': ctx.NUMBER().getText(),
                 'class_or_credit': class_or_credit(ctx.class_or_credit())}
  return_dict['courses'] = build_course_list(ctx.course_list(), institution, requirement_id)

  return return_dict
Exemplo n.º 5
0
def class_credit_body(ctx, institution, requirement_id):
  """
      class_credit_body   : (num_classes | num_credits)
                            (logical_op (num_classes | num_credits))? course_list_body?
                            (IS? pseudo
                             | display
                             | proxy_advice
                             | remark
                             | rule_tag
                             | share
                             | tag
                            )*
                            label?;

      num_classes         : NUMBER CLASS allow_clause?;
      num_credits         : NUMBER CREDIT allow_clause?;
      allow_clause        : LP allow NUMBER RP;

      course_list_body           : course_list (course_list_body_qualifier tag?
                                               | proxy_advice
                                               | label
                                               )*;
      course_list_body_qualifier : maxpassfail
                                 | maxperdisc
                                 | maxspread
                                 | maxtransfer
                                 | minarea
                                 | minclass
                                 | mincredit
                                 | mingpa
                                 | mingrade
                                 | minperdisc
                                 | minspread
                                 | rule_tag
                                 | samedisc
                                 | share

      "Allowable rule qualifiers: DontShare, Exclusive, Hide, HideRule, HighPriority, LowPriority,
      LowestPriority, MaxPassFail, MaxPerDisc, MaxSpread, MaxTerm, MaxTransfer, MinAreas, MinGrade,
      MinPerDisc, MinSpread, MinTerm, NotGPA, ProxyAdvice, RuleTag, SameDisc, ShareWith, With."
  """
  # Labels can appear in different contexts
  course_list_label = course_list_body_label = class_credit_label = None

  return_dict = {'tag': 'class_credit'}
  return_dict.update(num_class_or_num_credit(ctx))
  if ctx.course_list_body():
    return_dict['courses'] = build_course_list(ctx.course_list_body().course_list(),
                                               institution, requirement_id)
    if 'label' in return_dict['courses'].keys():
      course_list_label = return_dict['courses']['label']

    if context := ctx.course_list_body().course_list_body_qualifier():
      return_dict['qualifiers'] = get_qualifiers(context, institution, requirement_id)
Exemplo n.º 6
0
    def enterCourse_list(self, ctx: ReqBlockParser.Course_listContext):
        """ course_list     : course_item (and_list | or_list)? course_qualifier* label?;
        course_item     : discipline? catalog_number course_qualifier*;
        and_list        : (list_and course_item )+;
        or_list         : (list_or course_item)+;
    """
        context_path_str = context_path(ctx)
        if LOG_CONTEXT_PATH:
            print(context_path_str, file=sys.stderr)
        if 'except' in context_path_str.lower(
        ) or 'includ' in context_path_str.lower():
            return

        course_list = build_course_list(self.institution, ctx)
        self.sections[self.scribe_section].append(course_list)
Exemplo n.º 7
0
def minclass(ctx, institution, requirement_id):
  """
      minclass        : MINCLASS NUMBER course_list tag? display* label?;
  """
  return_dict = {'tag': 'min_class',
                 'min_number': ctx.NUMBER().getText(),
                 'courses': build_course_list(ctx.course_list(), institution, requirement_id)}

  if ctx.display():
    return_dict['display'] = ' '.join([item.string().getText().strip(' "')
                                      for item in ctx.display()]).strip()

  if ctx.label():
    return_dict['label'] = ctx.label().string().getText().strip(' "')

  return return_dict
Exemplo n.º 8
0
def mincredit(ctx, institution, requirement_id):
  """
      mincredit       : MINCREDIT NUMBER course_list tag? display* label?;
  """
  return_dict = {'tag': 'min_credit',
                 'min_number': ctx.NUMBER().getText()}
  return_dict['courses'] = build_course_list(ctx.course_list(), institution, requirement_id)

  if ctx.display():
    display_text = ''
    for item in ctx.display():
      display_text += item.string().getText().strip(' "') + ' '
    return_dict['display'] = display_text.strip()

  if ctx.label():
    return_dict['label'] = ctx.label().string().getText().strip(' "')

  return return_dict
Exemplo n.º 9
0
def under(ctx, institution, requirement_id):
  """
      under           : UNDER NUMBER class_or_credit course_list display* label;
  """
  return_dict = {'tag': 'under',
                 'number': ctx.NUMBER().getText(),
                 'class_or_credit': class_or_credit(ctx.class_or_credit())}
  return_dict['courses'] = build_course_list(ctx.course_list(), institution, requirement_id)

  if ctx.display():
    display_text = ''
    for item in ctx.display():
      display_text += item.string().getText().strip(' "') + ' '
    return_dict['display'] = display_text.strip()

  if ctx.label():
    return_dict['label'] = ctx.label().string().getText().strip(' "')

  return return_dict
Exemplo n.º 10
0
def mingpa(ctx, institution, requirement_id):
  """
      mingpa          : MINGPA NUMBER (course_list | expression)? tag? display* label?;
  """
  return_dict = {'tag': 'min_gpa', 'min_number': ctx.NUMBER().getText()}

  if ctx.course_list():
    return_dict['courses'] = build_course_list(ctx.course_list(), institution, requirement_id)

  if ctx.expression():
    return_dict['expression'] = ctx.expression().getText()

  if ctx.display():
    display_text = ''
    for item in ctx.display():
      display_text += item.string().getText().strip(' "') + ' '
    return_dict['display'] = display_text.strip()

  if ctx.label():
    return_dict['label'] = ctx.label().string().getText().strip(' "')

  return return_dict
Exemplo n.º 11
0
def subset(ctx, institution, requirement_id):
  """
      /* Body only
       */
      subset            : BEGINSUB
                        ( conditional_body
                          | block
                          | blocktype
                          | class_credit_body
                          | copy_rules
                          | course_list
                          | group
                          | noncourse
                          | rule_complete
                        )+
                        ENDSUB subset_qualifier* (remark | label)*;

      subset_qualifier  : maxpassfail
                        | maxperdisc
                        | maxspread
                        | maxtransfer
                        | mingpa
                        | mingrade
                        | minperdisc
                        | minspread
                        | rule_tag
                        | share
                        ;
  """
  return_dict = {'tag': 'subset'}

  if len(ctx.conditional_body()) > 0:
    return_dict['conditional'] = [conditional_body(context, institution, requirement_id)
                                  for context in ctx.conditional_body()]

  if len(ctx.block()) > 0:
    return_dict['block'] = [block(context, institution, requirement_id) for context in ctx.block()]

  if len(ctx.blocktype()) > 0:
    return_dict['blocktype'] = [blocktype(context, institution, requirement_id)
                                for context in ctx.blocktype()]

  if len(ctx.class_credit_body()) > 0:
    # Return a list of class_credit dicts
    return_dict['class_credit'] = [class_credit_body(context, institution, requirement_id)
                                   for context
                                   in ctx.class_credit_body()]

  if len(ctx.copy_rules()) > 0:
    assert len(ctx.copy_rules()) == 1
    return_dict['copy_rules'] = copy_rules(ctx.copy_rules()[0], institution, requirement_id)

  if len(ctx.course_list()) > 0:
    return_dict['courses'] = [build_course_list(context, institution, requirement_id)
                              for context in ctx.course_list()]

  if len(ctx.group()) > 0:
    return_dict['group'] = [group(context, institution, requirement_id) for context in ctx.group()]

  if len(ctx.noncourse()) > 0:
    return_dict['noncourse'] = [noncourse(context, institution, requirement_id)
                                for context in ctx.noncourse()]

  if len(ctx.rule_complete()) > 0:
    assert len(ctx.rule_complete()) == 1
    return_dict['rule_complete'] = rule_complete(ctx.rule_complete()[0],
                                                 institution, requirement_id)

  try:
    label_ctx = ctx.label()
    if len(label_ctx) > 1:
      print(f'Multiple ({len(label_ctx)}) labels at {context_path(ctx)}', file=sys.stderr)
    label_ctx = label_ctx.pop()
    return_dict['label'] = label_ctx.string().getText().strip(' "')
  except (KeyError, IndexError):
    # No label: note it
    return_dict['label'] = 'No Label for this subset!'

  try:
    if len(ctx.remark()) > 1:
      print(f'Multiple ({len(ctx.remark())}) remarks at {context_path(ctx)}', file=sys.stderr)
    context = ctx.remark().pop()
    remark_str = ' '.join([s.getText().strip(' "') for s in context.string()])
    return_dict['remark'] = remark_str
  except (KeyError, IndexError):
    pass

  return return_dict