当我们的文法设计的有问题的时候,就需要开启bison的调试方式来检测文法错在哪里,那么如何开启bison的调试方式呢?
bison调式需要做的事情如下:
1 )在语法文件*.y定义段开启yydebug,最终如下:
%{
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int yydebug=1;
%}
2)在编译语法文件*.y的时候,使用-v参数,生成output文件,这个文件中的内容可以帮助我们分析语法分析过程,使用--debug参数,生成的C代码包含调试信息。
命令如下:
bison a.y -d -v --debug
-d是用来生成头文件的,与调试无关。
-v生成output文件,描述了我们创建的自动机,可以帮助我们分析调试内容。
output内容大致如下:
Grammar
0 $accept: S $end
1 S: '<' NAME PROPLIST '>' '<' '/' NAME '>'
2 PROPLIST: PROPNAME '=' PROPVAL
3 | PROPLIST PROPNAME '=' PROPVAL
4 PROPNAME: BASECLASS
5 | BKIMG
6 PROPVAL: STRING
7 | NUM
Terminals, with rules where they appear
$end (0) 0
'/' (47) 1
'<' (60) 1
'=' (61) 2 3
'>' (62) 1
error (256)
NAME (258) 1
STRING (259) 6
BASECLASS (260) 4
BKIMG (261) 5
NUM (262) 7
Nonterminals, with rules where they appear
$accept (12)
on left: 0
S (13)
on left: 1, on right: 0
PROPLIST (14)
on left: 2 3, on right: 1 3
PROPNAME (15)
on left: 4 5, on right: 2 3
PROPVAL (16)
on left: 6 7, on right: 2 3
State 0
0 $accept: . S $end
'<' shift, and go to state 1
S go to state 2
State 1
1 S: '<' . NAME PROPLIST '>' '<' '/' NAME '>'
NAME shift, and go to state 3
State 2
0 $accept: S . $end
$end shift, and go to state 4
State 3
1 S: '<' NAME . PROPLIST '>' '<' '/' NAME '>'
BASECLASS shift, and go to state 5
BKIMG shift, and go to state 6
PROPLIST go to state 7
PROPNAME go to state 8
State 4
0 $accept: S $end .
$default accept
State 5
4 PROPNAME: BASECLASS .
$default reduce using rule 4 (PROPNAME)
State 6
5 PROPNAME: BKIMG .
$default reduce using rule 5 (PROPNAME)
State 7
1 S: '<' NAME PROPLIST . '>' '<' '/' NAME '>'
3 PROPLIST: PROPLIST . PROPNAME '=' PROPVAL
BASECLASS shift, and go to state 5
BKIMG shift, and go to state 6
'>' shift, and go to state 9
PROPNAME go to state 10
State 8
2 PROPLIST: PROPNAME . '=' PROPVAL
'=' shift, and go to state 11
State 9
1 S: '<' NAME PROPLIST '>' . '<' '/' NAME '>'
'<' shift, and go to state 12
State 10
3 PROPLIST: PROPLIST PROPNAME . '=' PROPVAL
'=' shift, and go to state 13
State 11
2 PROPLIST: PROPNAME '=' . PROPVAL
STRING shift, and go to state 14
NUM shift, and go to state 15
PROPVAL go to state 16
State 12
1 S: '<' NAME PROPLIST '>' '<' . '/' NAME '>'
'/' shift, and go to state 17
State 13
3 PROPLIST: PROPLIST PROPNAME '=' . PROPVAL
STRING shift, and go to state 14
NUM shift, and go to state 15
PROPVAL go to state 18
State 14
6 PROPVAL: STRING .
$default reduce using rule 6 (PROPVAL)
State 15
7 PROPVAL: NUM .
$default reduce using rule 7 (PROPVAL)
State 16
2 PROPLIST: PROPNAME '=' PROPVAL .
$default reduce using rule 2 (PROPLIST)
State 17
1 S: '<' NAME PROPLIST '>' '<' '/' . NAME '>'
NAME shift, and go to state 19
State 18
3 PROPLIST: PROPLIST PROPNAME '=' PROPVAL .
$default reduce using rule 3 (PROPLIST)
State 19
1 S: '<' NAME PROPLIST '>' '<' '/' NAME . '>'
'>' shift, and go to state 20
State 20
1 S: '<' NAME PROPLIST '>' '<' '/' NAME '>' .
$default reduce using rule 1 (S)
--debug使得生成的C代码包含更多的调试信息输出
3)编译目标代码,如下:
gcc -o test lex.yy.c a.tab.c -lfl -ly
4)运行test
5)结合程序输出信息和output文件的内容,可以知道我们设计的语法错在哪里。