Hi :
I'm using bison for a sub-set grammar of C language . But I
encounter a difficult . flowing is the core part of my grammar
file;
/*
grammar for subset of C language
*/
%left OR_OP
%left AND_OP
%left '+'
%left '-'
%left '*'
%left '/'
%%
%start file
;
file
:
|declaration file
|function_define file
;
function_define : declaration_specifier pointer IDENTIFIER '('
parameter_declaration_list ')' compound_statement
| declaration_specifier IDENTIFIER '('
parameter_declaration_list
')' compound_statement
| declaration_specifier pointer IDENTIFIER '(' ')'
compound_statement
| declaration_specifier IDENTIFIER '(' ')' compound_statement
;
compound_statement
: '{' '}'
| '{' statement_list '}'
| '{' declaration_list '}'
| '{' declaration_list statement_list'}'
;
statement_list
:statement statement_list
;
statement
:compound_statement
|iteration_statement
|expression_statement
|select_statement
|jump_statement
;
iteration_statement
: FOR '(' expression_statement expression_statement expr ')'
statement
;
select_statement
: IF '(' expr ')' statement
| IF '(' expr ')' statement ELSE statement
;
jump_statement :BREAK ';'
|CONTINUE ';'
|RETURN ';'
|RETURN expr ';'
;
expression_statement
:';'
| expr ';'
;
expr
:assignment_expr
|unary_expr
|binary_expr
;
assignment_expr :unary_expr '=' expr
;
unary_expr :postfix_expr
|INC_OP unary_expr
|DEC_OP unary_expr
|unary_operator unary_expr
;
binary_expr
:expr '*' expr
|expr '/' expr
|expr '+' expr
|expr '-' expr
|expr AND_OP expr
|expr OR_OP expr
;
unary_operator :'&'
|'*'
|'-'
|'!'
|'~'
;
postfix_expr :primary_expr
;
primary_expr : IDENTIFIER
| CONSTANT
| '(' expr ')'
;
declaration_list: declaration declaration_list
;
declaration : declaration_specifier declarator_list ';'
;
declarator_list : declarator ',' declarator_list
| declarator
;
declarator :var_declarator
|function_declarator
;
var_declarator :var_declarator2
|pointer var_declarator2
;
var_declarator2 :'(' var_declarator ')'
|var_declarator2 '[' ']'
|var_declarator2 '[' const_expr ']'
;
const_expr :CONSTANT
;
function_declarator: function_declarator2
pointer function_declarator2
;
function_declarator2: IDENTIFIER '(' parameter_declaration_list ')'
|IDENTIFIER '(' ')'
;
parameter_declaration_list: parameter_declaration ','
parameter_declaration_list
|parameter_declaration
;
//reduce shift conflict
parameter_declaration : declaration_specifier pointer
|declaration_specifier
|declaration_specifier var_declarator
;
pointer :'*'
|'*' pointer
;
declaration_specifier : INT
| DOUBLE
| FLOAT
| VOID
;
/*
xx.output
*/
Nonterminals useless in grammar
statement_list
statement
iteration_statement
select_statement
jump_statement
expression_statement
expr
assignment_expr
unary_expr
binary_expr
unary_operator
postfix_expr
primary_expr
declaration_list
var_declarator
var_declarator2
const_expr
Terminals unused in grammar
CONSTANT
FOR
BREAK
CONTINUE
RETURN
IF
ELSE
INC_OP
DEC_OP
AND_OP
OR_OP
'+'
'-'
'/'
'='
'&'
'!'
'~'
'['
']'
Rules useless in grammar
26 compound_statement: '{' statement_list '}'
27 | '{' declaration_list '}'
28 | '{' declaration_list statement_list '}'
29 statement_list: statement statement_list
30 statement: compound_statement
31 | iteration_statement
32 | expression_statement
33 | select_statement
34 | jump_statement
35 iteration_statement: FOR '(' expression_statement
expression_statement expr ')' statement
36 select_statement: IF '(' expr ')' statement
37 | IF '(' expr ')' statement ELSE statement
38 jump_statement: BREAK ';'
39 | CONTINUE ';'
40 | RETURN ';'
41 | RETURN expr ';'
42 expression_statement: ';'
43 | expr ';'
44 expr: assignment_expr
45 | unary_expr
46 | binary_expr
47 assignment_expr: unary_expr '=' expr
48 unary_expr: postfix_expr
49 | INC_OP unary_expr
50 | DEC_OP unary_expr
51 | unary_operator unary_expr
52 binary_expr: expr '*' expr
53 | expr '/' expr
54 | expr '+' expr
55 | expr '-' expr
56 | expr AND_OP expr
57 | expr OR_OP expr
58 unary_operator: '&'
59 | '*'
60 | '-'
61 | '!'
62 | '~'
63 postfix_expr: primary_expr
64 primary_expr: IDENTIFIER
65 | CONSTANT
66 | '(' expr ')'
67 declaration_list: declaration declaration_list
68 declarator: var_declarator
69 var_declarator: var_declarator2
70 | pointer var_declarator2
71 var_declarator2: '(' var_declarator ')'
72 | var_declarator2 '[' ']'
73 | var_declarator2 '[' const_expr ']'
74 const_expr: CONSTANT
75 parameter_declaration: declaration_specifier var_declarator
Grammar
0 $accept: file END
1 file: /* empty */
2 | declaration file
3 | function_define file
4 function_define: declaration_specifier pointer IDENTIFIER '('
parameter_declaration_list ')' compound_statement
5 | declaration_specifier IDENTIFIER '('
parameter_declaration_list ')' compound_statement
6 | declaration_specifier pointer IDENTIFIER '('
')' compound_statement
7 | declaration_specifier IDENTIFIER '(' ')'
compound_statement
8 compound_statement: '{' '}'
9 declaration: declaration_specifier declarator_list ';'
10 declarator_list: declarator ',' declarator_list
11 | declarator
12 declarator: function_declarator
13 function_declarator: function_declarator2 pointer function_declarator2
14 function_declarator2: IDENTIFIER '(' parameter_declaration_list ')'
15 | IDENTIFIER '(' ')'
16 parameter_declaration_list: parameter_declaration ','
parameter_declaration_list
17 | parameter_declaration
18 parameter_declaration: declaration_specifier pointer
19 | declaration_specifier
20 pointer: '*'
21 | '*' pointer
22 declaration_specifier: INT
23 | DOUBLE
24 | FLOAT
25 | VOID
Terminals, with rules where they appear
END (0) 0
'!' (33)
'&' (38)
'(' (40) 4 5 6 7 14 15
')' (41) 4 5 6 7 14 15
'*' (42) 20 21
'+' (43)
',' (44) 10 16
'-' (45)
'/' (47)
';' (59) 9
'=' (61)
'[' (91)
']' (93)
'{' (123) 8
'}' (125) 8
'~' (126)
error (256)
IDENTIFIER (258) 4 5 6 7 14 15
CONSTANT (259)
FOR (260)
BREAK (261)
CONTINUE (262)
RETURN (263)
IF (264)
ELSE (265)
INC_OP (266)
DEC_OP (267)
AND_OP (268)
OR_OP (269)
INT (270) 22
DOUBLE (271) 23
FLOAT (272) 24
VOID (273) 25
Nonterminals, with rules where they appear
$accept (35)
on left: 0
file (36)
on left: 1 2 3, on right: 0 2 3
function_define (37)
on left: 4 5 6 7, on right: 3
compound_statement (38)
on left: 8, on right: 4 5 6 7
declaration (39)
on left: 9, on right: 2
declarator_list (40)
on left: 10 11, on right: 9 10
declarator (41)
on left: 12, on right: 10 11
function_declarator (42)
on left: 13, on right: 12
function_declarator2 (43)
on left: 14 15, on right: 13
parameter_declaration_list (44)
on left: 16 17, on right: 4 5 14 16
parameter_declaration (45)
on left: 18 19, on right: 16 17
pointer (46)
on left: 20 21, on right: 4 6 13 18 21
declaration_specifier (47)
on left: 22 23 24 25, on right: 4 5 6 7 9 18 19
state 0
0 $accept: . file END
1 file: . [END]
2 | . declaration file
3 | . function_define file
4 function_define: . declaration_specifier pointer IDENTIFIER '('
parameter_declaration_list ')' compound_statement
5 | . declaration_specifier IDENTIFIER '('
parameter_declaration_list ')' compound_statement
6 | . declaration_specifier pointer IDENTIFIER '('
')' compound_statement
7 | . declaration_specifier IDENTIFIER '(' ')'
compound_statement
9 declaration: . declaration_specifier declarator_list ';'
22 declaration_specifier: . INT
23 | . DOUBLE
24 | . FLOAT
25 | . VOID
INT shift, and go to state 1
DOUBLE shift, and go to state 2
FLOAT shift, and go to state 3
VOID shift, and go to state 4
$default reduce using rule 1 (file)
file go to state 5
function_define go to state 6
declaration go to state 7
declaration_specifier go to state 8
state 1
22 declaration_specifier: INT .
$default reduce using rule 22 (declaration_specifier)
state 2
23 declaration_specifier: DOUBLE .
$default reduce using rule 23 (declaration_specifier)
state 3
24 declaration_specifier: FLOAT .
$default reduce using rule 24 (declaration_specifier)
state 4
25 declaration_specifier: VOID .
$default reduce using rule 25 (declaration_specifier)
state 5
0 $accept: file . END
END shift, and go to state 9
state 6
1 file: . [END]
2 | . declaration file
3 | . function_define file
3 | function_define . file
4 function_define: . declaration_specifier pointer IDENTIFIER '('
parameter_declaration_list ')' compound_statement
5 | . declaration_specifier IDENTIFIER '('
parameter_declaration_list ')' compound_statement
6 | . declaration_specifier pointer IDENTIFIER '('
')' compound_statement
7 | . declaration_specifier IDENTIFIER '(' ')'
compound_statement
9 declaration: . declaration_specifier declarator_list ';'
22 declaration_specifier: . INT
23 | . DOUBLE
24 | . FLOAT
25 | . VOID
INT shift, and go to state 1
DOUBLE shift, and go to state 2
FLOAT shift, and go to state 3
VOID shift, and go to state 4
$default reduce using rule 1 (file)
file go to state 10
function_define go to state 6
declaration go to state 7
declaration_specifier go to state 8
state 7
1 file: . [END]
2 | . declaration file
2 | declaration . file
3 | . function_define file
4 function_define: . declaration_specifier pointer IDENTIFIER '('
parameter_declaration_list ')' compound_statement
5 | . declaration_specifier IDENTIFIER '('
parameter_declaration_list ')' compound_statement
6 | . declaration_specifier pointer IDENTIFIER '('
')' compound_statement
7 | . declaration_specifier IDENTIFIER '(' ')'
compound_statement
9 declaration: . declaration_specifier declarator_list ';'
22 declaration_specifier: . INT
23 | . DOUBLE
24 | . FLOAT
25 | . VOID
INT shift, and go to state 1
DOUBLE shift, and go to state 2
FLOAT shift, and go to state 3
VOID shift, and go to state 4
$default reduce using rule 1 (file)
file go to state 11
function_define go to state 6
declaration go to state 7
declaration_specifier go to state 8
state 8
4 function_define: declaration_specifier . pointer IDENTIFIER '('
parameter_declaration_list ')' compound_statement
5 | declaration_specifier . IDENTIFIER '('
parameter_declaration_list ')' compound_statement
6 | declaration_specifier . pointer IDENTIFIER '('
')' compound_statement
7 | declaration_specifier . IDENTIFIER '(' ')'
compound_statement
9 declaration: declaration_specifier . declarator_list ';'
10 declarator_list: . declarator ',' declarator_list
11 | . declarator
12 declarator: . function_declarator
13 function_declarator: . function_declarator2 pointer function_declarator2
14 function_declarator2: . IDENTIFIER '(' parameter_declaration_list ')'
15 | . IDENTIFIER '(' ')'
20 pointer: . '*'
21 | . '*' pointer
IDENTIFIER shift, and go to state 12
'*' shift, and go to state 13
declarator_list go to state 14
declarator go to state 15
function_declarator go to state 16
function_declarator2 go to state 17
pointer go to state 18
state 9
0 $accept: file END .
$default accept
state 10
3 file: function_define file .
$default reduce using rule 3 (file)
state 11
2 file: declaration file .
$default reduce using rule 2 (file)
state 12
5 function_define: declaration_specifier IDENTIFIER . '('
parameter_declaration_list ')' compound_statement
7 | declaration_specifier IDENTIFIER . '(' ')'
compound_statement
14 function_declarator2: IDENTIFIER . '(' parameter_declaration_list ')'
15 | IDENTIFIER . '(' ')'
'(' shift, and go to state 19
state 13
20 pointer: . '*'
20 | '*' . [IDENTIFIER, ')', ',']
21 | . '*' pointer
21 | '*' . pointer
'*' shift, and go to state 13
$default reduce using rule 20 (pointer)
pointer go to state 20
state 14
9 declaration: declaration_specifier declarator_list . ';'
';' shift, and go to state 21
state 15
10 declarator_list: declarator . ',' declarator_list
11 | declarator . [';']
',' shift, and go to state 22
$default reduce using rule 11 (declarator_list)
state 16
12 declarator: function_declarator .
$default reduce using rule 12 (declarator)
state 17
13 function_declarator: function_declarator2 . pointer function_declarator2
20 pointer: . '*'
21 | . '*' pointer
'*' shift, and go to state 13
pointer go to state 23
state 18
4 function_define: declaration_specifier pointer . IDENTIFIER '('
parameter_declaration_list ')' compound_statement
6 | declaration_specifier pointer . IDENTIFIER '('
')' compound_statement
IDENTIFIER shift, and go to state 24
state 19
5 function_define: declaration_specifier IDENTIFIER '(' .
parameter_declaration_list ')' compound_statement
7 | declaration_specifier IDENTIFIER '(' . ')'
compound_statement
14 function_declarator2: IDENTIFIER '(' . parameter_declaration_list ')'
15 | IDENTIFIER '(' . ')'
16 parameter_declaration_list: . parameter_declaration ','
parameter_declaration_list
17 | . parameter_declaration
18 parameter_declaration: . declaration_specifier pointer
19 | . declaration_specifier
22 declaration_specifier: . INT
23 | . DOUBLE
24 | . FLOAT
25 | . VOID
INT shift, and go to state 1
DOUBLE shift, and go to state 2
FLOAT shift, and go to state 3
VOID shift, and go to state 4
')' shift, and go to state 25
parameter_declaration_list go to state 26
parameter_declaration go to state 27
declaration_specifier go to state 28
state 20
21 pointer: '*' pointer .
$default reduce using rule 21 (pointer)
state 21
9 declaration: declaration_specifier declarator_list ';' .
$default reduce using rule 9 (declaration)
state 22
10 declarator_list: . declarator ',' declarator_list
10 | declarator ',' . declarator_list
11 | . declarator
12 declarator: . function_declarator
13 function_declarator: . function_declarator2 pointer function_declarator2
14 function_declarator2: . IDENTIFIER '(' parameter_declaration_list ')'
15 | . IDENTIFIER '(' ')'
IDENTIFIER shift, and go to state 29
declarator_list go to state 30
declarator go to state 15
function_declarator go to state 16
function_declarator2 go to state 17
state 23
13 function_declarator: function_declarator2 pointer . function_declarator2
14 function_declarator2: . IDENTIFIER '(' parameter_declaration_list ')'
15 | . IDENTIFIER '(' ')'
IDENTIFIER shift, and go to state 29
function_declarator2 go to state 31
state 24
4 function_define: declaration_specifier pointer IDENTIFIER . '('
parameter_declaration_list ')' compound_statement
6 | declaration_specifier pointer IDENTIFIER . '('
')' compound_statement
'(' shift, and go to state 32
state 25
7 function_define: declaration_specifier IDENTIFIER '(' ')' .
compound_statement
8 compound_statement: . '{' '}'
15 function_declarator2: IDENTIFIER '(' ')' . ['*']
'{' shift, and go to state 33
$default reduce using rule 15 (function_declarator2)
compound_statement go to state 34
state 26
5 function_define: declaration_specifier IDENTIFIER '('
parameter_declaration_list . ')' compound_statement
14 function_declarator2: IDENTIFIER '(' parameter_declaration_list . ')'
')' shift, and go to state 35
state 27
16 parameter_declaration_list: parameter_declaration . ','
parameter_declaration_list
17 | parameter_declaration . [')']
',' shift, and go to state 36
$default reduce using rule 17 (parameter_declaration_list)
state 28
18 parameter_declaration: declaration_specifier . pointer
19 | declaration_specifier . [')', ',']
20 pointer: . '*'
21 | . '*' pointer
'*' shift, and go to state 13
$default reduce using rule 19 (parameter_declaration)
pointer go to state 37
state 29
14 function_declarator2: IDENTIFIER . '(' parameter_declaration_list ')'
15 | IDENTIFIER . '(' ')'
'(' shift, and go to state 38
state 30
10 declarator_list: declarator ',' declarator_list .
$default reduce using rule 10 (declarator_list)
state 31
13 function_declarator: function_declarator2 pointer function_declarator2 .
$default reduce using rule 13 (function_declarator)
state 32
4 function_define: declaration_specifier pointer IDENTIFIER '(' .
parameter_declaration_list ')' compound_statement
6 | declaration_specifier pointer IDENTIFIER '(' .
')' compound_statement
16 parameter_declaration_list: . parameter_declaration ','
parameter_declaration_list
17 | . parameter_declaration
18 parameter_declaration: . declaration_specifier pointer
19 | . declaration_specifier
22 declaration_specifier: . INT
23 | . DOUBLE
24 | . FLOAT
25 | . VOID
INT shift, and go to state 1
DOUBLE shift, and go to state 2
FLOAT shift, and go to state 3
VOID shift, and go to state 4
')' shift, and go to state 39
parameter_declaration_list go to state 40
parameter_declaration go to state 27
declaration_specifier go to state 28
state 33
8 compound_statement: '{' . '}'
'}' shift, and go to state 41
state 34
7 function_define: declaration_specifier IDENTIFIER '(' ')'
compound_statement .
$default reduce using rule 7 (function_define)
state 35
5 function_define: declaration_specifier IDENTIFIER '('
parameter_declaration_list ')' . compound_statement
8 compound_statement: . '{' '}'
14 function_declarator2: IDENTIFIER '(' parameter_declaration_list
')' . ['*']
'{' shift, and go to state 33
$default reduce using rule 14 (function_declarator2)
compound_statement go to state 42
state 36
16 parameter_declaration_list: . parameter_declaration ','
parameter_declaration_list
16 | parameter_declaration ',' .
parameter_declaration_list
17 | . parameter_declaration
18 parameter_declaration: . declaration_specifier pointer
19 | . declaration_specifier
22 declaration_specifier: . INT
23 | . DOUBLE
24 | . FLOAT
25 | . VOID
INT shift, and go to state 1
DOUBLE shift, and go to state 2
FLOAT shift, and go to state 3
VOID shift, and go to state 4
parameter_declaration_list go to state 43
parameter_declaration go to state 27
declaration_specifier go to state 28
state 37
18 parameter_declaration: declaration_specifier pointer .
$default reduce using rule 18 (parameter_declaration)
state 38
14 function_declarator2: IDENTIFIER '(' . parameter_declaration_list ')'
15 | IDENTIFIER '(' . ')'
16 parameter_declaration_list: . parameter_declaration ','
parameter_declaration_list
17 | . parameter_declaration
18 parameter_declaration: . declaration_specifier pointer
19 | . declaration_specifier
22 declaration_specifier: . INT
23 | . DOUBLE
24 | . FLOAT
25 | . VOID
INT shift, and go to state 1
DOUBLE shift, and go to state 2
FLOAT shift, and go to state 3
VOID shift, and go to state 4
')' shift, and go to state 44
parameter_declaration_list go to state 45
parameter_declaration go to state 27
declaration_specifier go to state 28
state 39
6 function_define: declaration_specifier pointer IDENTIFIER '('
')' . compound_statement
8 compound_statement: . '{' '}'
'{' shift, and go to state 33
compound_statement go to state 46
state 40
4 function_define: declaration_specifier pointer IDENTIFIER '('
parameter_declaration_list . ')' compound_statement
')' shift, and go to state 47
state 41
8 compound_statement: '{' '}' .
$default reduce using rule 8 (compound_statement)
state 42
5 function_define: declaration_specifier IDENTIFIER '('
parameter_declaration_list ')' compound_statement .
$default reduce using rule 5 (function_define)
state 43
16 parameter_declaration_list: parameter_declaration ','
parameter_declaration_list .
$default reduce using rule 16 (parameter_declaration_list)
state 44
15 function_declarator2: IDENTIFIER '(' ')' .
$default reduce using rule 15 (function_declarator2)
state 45
14 function_declarator2: IDENTIFIER '(' parameter_declaration_list . ')'
')' shift, and go to state 48
state 46
6 function_define: declaration_specifier pointer IDENTIFIER '('
')' compound_statement .
$default reduce using rule 6 (function_define)
state 47
4 function_define: declaration_specifier pointer IDENTIFIER '('
parameter_declaration_list ')' . compound_statement
8 compound_statement: . '{' '}'
'{' shift, and go to state 33
compound_statement go to state 49
state 48
14 function_declarator2: IDENTIFIER '(' parameter_declaration_list ')' .
$default reduce using rule 14 (function_declarator2)
state 49
4 function_define: declaration_specifier pointer IDENTIFIER '('
parameter_declaration_list ')' compound_statement .
$default reduce using rule 4 (function_define)
when I use bison :
bison -r all -d -o xx.cpp xx.ypp
there is all waring , no shift/reduce or reduce/reduce conflict !!!
I want to know , Why bison think the "comound_statement" as
useless noterminater ???
why I have so many useless rule and no-terminator ???
please Help Me !!
_______________________________________________
help-bison@gnu.org http://lists.gnu.org/mailman/listinfo/help-bison