如何开启bison调式方式

当我们的文法设计的有问题的时候,就需要开启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文件的内容,可以知道我们设计的语法错在哪里。

猜你喜欢

转载自blog.csdn.net/u011711997/article/details/52461802
今日推荐