���ꏈ���n

���ꏈ���n(compiler �Җ�n)�̍\��

  1. �����
  2. �\�����
  3. �Ӗ����
  4. �R�[�h����
�Җ�n�̏������̊Ԃł͒��Ԍ���ɂ�鏈�����ʂ̎󂯓n���� �\�̎Q�Ƃ��s����B

�����(lexical analysis)

���W(identifier) �萔��(literal constant) ��v�� (keyword) �Ȃǂ� �������f��(lexical token)�Ƃ��ĔF������B

�f��𕶎�����\������K�� ... ���K���@(regular grammar)
���K�\�� (regular expression)�̗�

���W
[A-Za-z_][0-9A-Za-z_]*
���萔
[1-9][0-9]*
���K����͗L���I�[�g�}�g���ɂ���ĔF���ł���B �K�؂Ȏ��ʂ̂��߂̏�����₤�B

�\�����(1)LL(1)��͖@�Ȃ�

syntax analysis, parsing (�}�t��) �\����͂̌��ʂ� �n���؂�\���؂ŕ\�����B
��Fif X < Y then MAX := Y else MAX := X

���@�ɂ��ƂÂ����o�ɂ�鐶�����ł��邩�ǂ����̉��
��͕��@

  • ���~�^��͖@
    �n���؂̍�����t�Ɍ������Ė؂��\�����Ă���
  • �㏸�^��͖@
    �t���獪�Ɍ������B���o�̋t�̉ߒ����Ҍ�(reduction)
  • �ċA���~�^��͖@

    �J�n�L������n�߂čō����o�����݂�B
    ���o�ł̗�u���v�͍ʼnE���o�B �ō����o�ł�
    �� => �� => ��*�� => �W��*�� => ���W*�� => ���W*�� => ���W*�W�� => ���W*(��) => ���W*(��+��) => ���W*(��+��) => ���W*(�W��+��) => ���W*(���W+��) => ���W*(���W+�W��) => ���W*(���W+���W)
    �̂悤�ɂȂ�B
    ���ċA�I�Ȑ����K��������ꍇ�ɂ͉�͂��ł��Ȃ��Ȃ�B ���̏ꍇ�A�\���K�������������čċA�I��͖@���g����悤�� �Ȃ����K�v������B

    �u���v�̍\���K����ύX���A�ċA�I�ȉ�͖@��K�p�����v���O������������B

    procedure E();
      begin T();
        while token = '+' do
          begin gettoken(); T() end
      end;
    procedure T();
      begin F();
        while token = '*' do
          begin gettoken(); F() end
      end;
    procedure F();
      begin
        if token = '(' then
          begin gettoken(); E();
            if token <> ')' then error();
          end
        else if token = 'i' then gettoken()
        else error();
      end;
    
    ��̗�ł�
     E -> T, E -> T + T,
     T -> F, T -> F * F,
     F -> ( E ), F -> i
    
    �̂悤�ɁA�\���K�������������Ă���B

    L .. ������f��𒲂ׂ�
    L .. �ō����o
    (1) .. 1�‚̐�ǂ�


    �\���^��͖@

    �ċA�I��@��p�����ɁA�I�[�g�}�g�����g���ē��o����������B
    deriveX->Y1Y2...Yk ���o
    error���

    LR��͖@

    �㏸�^��͖@ ... �f���ǂݍ��݂Ȃ���\���K���� ���������ĊҌ����J��Ԃ��B(shift-reduce parsing)
    shift�ǂݍ���
    reduceX->Y1Y2...Yk �Ҍ�
    accept��
    error���
    �X�^�b�N��ɂ͋L�� X �Ə�� s �����݂ɒu���A�X�^�b�N�� �ŏ�i�ɂ����� s �Ɠ��͑f�� a �����͕\ A ���Q�Ƃ��� ���Ƃɂ���ē�������肷��B��ԑJ�ڂ͕ʂ̉�͕\ G �� �^����B�A���S���Y���͈ȉ��̂Ƃ���B
    repeat
      s:=�X�^�b�N�ŏ�i�̏��;
      a:=�‚��ɒ��ׂ悤�Ƃ��Ă���f��;
      if A[s,a]=shift then
        begin t:=G[s,a];
          �X�^�b�N��a��t�Ƃ�t���ŏ�i��
          ����悤�ɉ������݁A���͑f���
          ����a����菜��
        end
      else if A[s,a]=reduce X->Y1Y2...Yk then
        begin �X�^�b�N����k�‚̏�Ԃ�k�‚�
              �L�������o��;
          u:=�X�^�b�N�ŏ�i�̏��;
          t:=G[u,X];
          �X�^�b�N��X��t�Ƃ�t���ŏ�i��
          ����悤�ɉ�������
        end
      else if A[s,a]=accept then ��͏I��
      else ���
    forever;
    

    �u���v�̍\���K���Ƃ��ẮA

    1. E -> E+T
    2. E -> T
    3. T -> T*F
    4. T -> F
    5. F -> (E)
    6. F -> i

    ��͕\
    AG
    ���+*()i$+*()i$ETF
    0ss45123
    1sa6
    22s227
    34444
    4ss45823
    56666
    6ss4593
    7ss4510
    8ss611
    91s117
    103333
    115555

    ��͗�
    �X�^�b�N�f��̗�����
    --------------------------------
    $0i*(i+i)$shift
    $0i5*(i+i)$reduce 6
    $0F3*(i+i)$reduce 4
    $0T2*(i+i)$shift
    $0T2*7(i+i)$shift
    $0T2*7(4i+i)$shift
    $0T2*7(4i5+i)$reduce 6
    $0T2*7(4F3+i)$reduce 4
    $0T2*7(4T2+i)$reduce 2
    $0T2*7(4E8+i)$shift
    $0T2*7(4E8+6i)$shift
    $0T2*7(4E8+6i5)$reduce 6
    $0T2*7(4E8+6F3)$reduce 4
    $0T2*7(4E8+6T9)$reduce 1
    $0T2*7(4E8)$shift
    $0T2*7(4E8)11$reduce 5
    $0T2*7F10$reduce 3
    $0T2$reduce 2
    $0E1$accept

    ��̍\���K���� yacc �ŏ������Ayacc -v �R�}���h��p����� y.output �Ƃ����t�@�C�����ł���B


    �Ӗ���� (semantic analysis)

    ���W(identifier)�̗L���͈́A�f�[�^�̓K�����̉�́B ��ʓI�ɂ͍\����͂̒��ɖ��ߍ��܂��B
    �錾�̏���
    �u���b�N�\�������Œ���ł́A���炽�� �u���b�N�ɓ��邽�тɖ��W���Ǘ�����\���쐬����A�u���b�N ����o�鎞�ɏ��ł���B
    ���E���̏���
    �f�[�^�^�̓K�����A��щz����̓K�����B
    �L���ꏊ�̊��蓖��
    �v���O���������s����鎞�̐ÓI�ȕϐ��̈�
    (���I�ȕϐ��̈�̊��蓖�Ă͎��s���x���n�ɂ���čs����)

    �R�[�h����

    �ړI����(�@�B��)�v���O�����̐����B
    ���Fyacc ��p���� "3�̔{���ł���Q�i���𔻒肷��v���O����"������
    �𓚗� yacc pof3.y �� y.tab.c ���쐬����A cc y.tab.c -ly �� a.out ���ł���B