Principles of Programming Languages ¶
HW #1 3/27/2002
< 문 ��� > ¶
※ �������� 문���들��� �������� 문��(grammar)��� 맞는��� ���������는 Recursive Descent Parsing �������� ��������� ������(parser)를 ���������������.
< ��� ��� > ¶
- ���������: 4��� 10���(A��)
- 데모 �����: 4��� 10���(A��)
- ������물
- Internal/external documentations
- ��������램 ����������� 및 ��������������� �� 디������
- Internal/external documentations
< 문 �� > ¶
~cpp <start> → <statements> <statements> → <statement> | <statement> <semi_colon> <statements> <statement> → <identifier> <assignment_operator> <expression> <expression> → <term> <plus_operator> <expression> | <term> <minus_operator> <expression> | <term> <term> → <factor> <star_operator> <term> | <factor> <slash_operator> <term> | <factor> <factor> → <left_parenthesis> <expression> <right_parenthesis> | <identifier> | <constant> | <identifier><condition><identifier><question_operator><compare_value> <condition> → <less_keyword> | <greater_keyword> | <equal_keyword> <compare_value> → <identifier> <colon> <identifier> <constant> → any decimal numbers <identifier> → any names conforming C identifier <question_operator> → ? <less_keyword> → < <greater_keyword> → > <equal_keyword> → == <colon> → : <assignment_operator> → = <semi_colon> → ; <plus_operator> → + <minus_operator> → - <star_operator> → * <slash_operator> → / <left_parenthesis> → ( <right_parenthesis> → )
< ���부 ������ > ¶
- ������: INPUT.TXT�� �������������� ��������� ������
- ������: ��������� 문����� 따��� INPUT.TXT��� ����������� ���는 문������ �����������. ������(parsing)��는 ��������������� <���리 ���>��� ������ ������������, 문����� ���������면 ��Yes,�� �������� 문������ ������������ ������면 ����� 메��������� ��No��를 ������������.
- ���리 ������
- ��� ������(parsing) ������는 리��������� ��������� ������ non-terminal��� ����������������� ���리는 메������를 ��������������� ������.
- ��� ������(parsing) ������는 리��������� ��������� ������ non-terminal��� ����������������� ���리는 메������를 ��������������� ������.
~cpp ���) void expression(void) { ... printf("<expression> parsed.\n"); }
- <identifier>��� <constant>��� ���������는 ��������� lexeme��� ������ ������������.
~cpp ���) void identifier(void) { ... printf("<identifier>: %s parsed.\n",token_string); }
- ������ ������림������ ASCII ������� 32 ��������� ������ 모�� white-space�� ���������며, white-space는 ��� token��� ��������는 ����� ���������는 모��� 무���������.
- ��������������(lexical analyzer)��� �����������는 ������ 변��� next_token, 문������ 변��� token_string, ������ lexical()��� ��������������� ������. ������ lexical()��� ������ ������림��� ����������� �������� lexeme��� ������낸 뒤, ��������� token type��� next_token��� 대���������, lexeme 문��������� token_string��� ���������는 ������������.
- 문������ 문����� ������������ ������면 ������ ����� 메������를 ������������. ��� ������ �����를 ����������� lexeme��� ������ ���는 ��������� ���, ��������� ������������. ���를 들���, x = a + + b��� ������, ��+�� ������������ ��� ������ 더 ���������므�� ����� 메������를 ������������. ��� ������, ��+��������를 ��������� ��� ��������� ������������.
- ������ ������ ��� ��������는 ���부 ��������� ������ ������������, internal document��� ������������.
- 데모 ��� 디��������� ��������������� 미리 �����������(데모 ������ ������������는 ������는 ���������리���).
< ���리 ��� > ¶
- ������: target = operand1 + operand2 * 428
- ������
~cpp <identifier>: target parsed. <assignment_operator> parsed. <identifier>: operand1 parsed. <factor> parsed. <term> parsed. <plus_operator> parsed. <identifier>: operand2 parsed. <factor> parsed. <star_operator> parsed. <constant>: 428 parsed. <factor> parsed. <term> parsed. <term> parsed. <expression> parsed. <expression> parsed. <statement> parsed. <statements> parsed. <start> parsed. Yes!!
- ������: target = operand1 + + operand2
- ������
~cpp <identifier>: target parsed. <assignment_operator> parsed. <identifier>: operand1 parsed. <factor> parsed. <term> parsed. <plus_operator> parsed. ERROR : plus-operator <identifier>: operand2 parsed. <factor> parsed. <term> parsed. <expression> parsed. <expression> parsed. <statement> parsed. <statements> parsed. <start> parsed. No!!
- ������: target = op1 > op2 ? op3 : op4 * op5
- ������
~cpp <identifier>: target parsed. <assignment_operator> parsed. <identifier>: op1 parsed. <greater_keyword> parsed. <condition> parsed. <identifier>: op2 parsed. <question_operator> parsed. <identifier>: op3 parsed. <colon> parsed. <identifier>: op4 parsed <compare_value> parsed. <factor> parsed. <star_operator> parsed. <identifier>: op5 parsed. <factor> parsed. <term> parsed. <term> parsed. <expression> parsed. <statement> parsed. <statements> parsed. <start> parsed. YES!!
- ������: target = op1 > op2 ? op3
- ������
~cpp <identifier>: target parsed. <assignment_operator> parsed. <identifier>: op1 parsed. <greater_keyword> parsed. <condition> parsed. <identifier>: op2 parsed. <question_operator> parsed. <identifier>: op3 parsed. ERROR : colon <compare_value> parsed. <factor> parsed. <term> parsed. <expression> parsed. <statement> parsed. <statements> parsed. <start> parsed. NO!!