《编译原理》实验二
句法分析器
考虑下面的C语言子集的文法,其中<>括起来的为非终结符,粗体为终结符。
<statement_list>
<statement_list>
| <statement_list>
<expression_statement>
| <selection_statement>
| <iteration_statement>
<expression_statement> ;
| ;
<assignment_expression>
| , <assignment_expression>
<assignment_expression> <equality_expression>
| ID = <assignment_expression>
<equality_expression> <relational_expression>
| <equality_expression> == <relational_expression>
| <equality_expression> != <relational_expression>
<relational_expression> <additive_expression>
| <relational_expression> < <additive_expression>
| <relational_expression> > <additive_expression>
| <relational_expression> <= <additive_expression>
| <relational_expression> >= <additive_expression>
<additive_expression> <multiplicative_expression>
| <additive_expression> + <multiplicative_expression>
| <additive_expression> - <multiplicative_expression>
<multiplicative_expression> <primary_expression>
| <multiplicative_expression> * <primary_expression>
| <multiplicative_expression> / <primary_expression>
<primary_expression> ID | NUM | STRING | ( )
<selection_statement> IF ( )
<iteration_statement> WHILE ( )
| DO WHILE ( ) ;
要求:对给定的C语言程序进行句法分析,输出得到的分析树。
例如,下面的源程序代码
sum = 0.0;
x = 1.0;
while (x <= 100) sum = sum + x;
句法分析结果为
|-- <statement_list>
|-- <statement_list>
| |-- <statement_list>
| | |--
| | |-- <expression_statement>
| | |--
| | | |-- <assignment_expression>
| | | |-- ID
| | | |-- =
| | | |-- <assignment_expression>
| | | |-- <equality_expression>
| | | |-- <relational_expression>
| | | |-- <additive_expression>
| | | |-- <multiplicative_expression>
| | | |-- <primary_expression>
| | | |-- NUM
| | |-- ;
| |--
| |-- <expression_statement>
| |--
| | |-- <assignment_expression>
| | |-- ID
| | |-- =
| | |-- <assignment_expression>
| | |-- <equality_expression>
| | |-- <relational_expression>
| | |-- <additive_expression>
| | |-- <multiplicative_expression>
| | |-- <primary_expression>
| | |-- NUM
| |-- ;
|--
|-- <iteration_statement>
|-- WHILE
|-- (
|--
| |-- <assignment_expression>
| |-- <equality_expression>
| |-- <relational_expression>
| |-- <relational_expression>
| | |-- <additive_expression>
| | |-- <multiplicative_expression>
| | |-- <primary_expression>
| | |-- ID
| |-- <=
| |-- <additive_expression>
| |-- <multiplicative_expression>
| |-- <primary_expression>
| |-- NUM
|-- )
|--
|-- <expression_statement>
|--
| |-- <assignment_expression>
| |-- ID
| |-- =
| |-- <assignment_expression>
| |-- <equality_expression>
| |-- <relational_expression>
| |-- <additive_expression>
| |-- <additive_expression>
| | |-- <multiplicative_expression>
| | |-- <primary_expression>
| | |-- ID
| |-- +
| |-- <multiplicative_expression>
| |-- <primary_expression>
| |-- ID
|-- ;