~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> → )
~cpp
예) void expression(void) {
...
printf("<expression> parsed.\n");
}
~cpp
예) void identifier(void) {
...
printf("<identifier>: %s parsed.\n",token_string);
}
~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!!
~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!!
~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!!
~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!!