📄 first_follow.t.svn-base
字号:
# first_follow.t# Test First/Follow sets generatorsuse Test::Base;use t::Util qw/ parse_grammar dump_fsets /;use LL1_table;plan tests => 2 * blocks();#$LL1::Table::Trace = 1;run { my $block = shift; my $name = $block->name; my $ast = parse_grammar($block->grammar); my $fi_sets = LL1::Table::first_sets($ast); is dump_fsets($fi_sets), $block->first_sets, "$name - First sets"; my $fo_sets = LL1::Table::follow_sets($ast, $fi_sets); is dump_fsets($fo_sets), $block->follow_sets, "$name - Follow sets";};__DATA__=== TEST 1: all items nullable--- grammarA: B C DB: '1' | ''C: '2' | ''D: '3' | ''--- first_setsA: '' '1' '2' '3'B: '' '1'C: '' '2'D: '' '3'--- follow_setsA: $B: $ '2' '3'C: $ '3'D: $=== TEST 2: Only the first 2 items nullable--- grammarA: B C DB: '1' | ''C: '2' | ''D: '3'--- first_setsA: '1' '2' '3'B: '' '1'C: '' '2'D: '3'--- follow_setsA: $B: '2' '3'C: '3'D: $=== TEST 3: ditto (antoher form of grammar)--- grammarA: B C DB: '1' |C: '2' |D: '3'--- first_setsA: '1' '2' '3'B: '' '1'C: '' '2'D: '3'--- follow_setsA: $B: '2' '3'C: '3'D: $=== TEST 4: Only the first item nullable--- grammarA: B C DB: '1' | ''C: '2'D: '3'--- first_setsA: '1' '2'B: '' '1'C: '2'D: '3'--- follow_setsA: $B: '2'C: '3'D: $=== TEST 5: no item is nullable--- grammarA: B C DB: '1'C: '2'D: '3'--- first_setsA: '1'B: '1'C: '2'D: '3'--- follow_setsA: $B: '2'C: '3'D: $=== TEST 6: simple integer expression grammar--- grammarexp : exp addop term | termaddop : '+' | '-'term : term mulop factor | factormulop : '*'factor: '(' exp ')' | /\d+/--- first_setsaddop: '+' '-'exp: '(' /\d+/factor: '(' /\d+/mulop: '*'term: '(' /\d+/--- follow_setsaddop: '(' /\d+/exp: $ ')' '+' '-'factor: $ ')' '*' '+' '-'mulop: '(' /\d+/term: $ ')' '*' '+' '-'=== TEST 7: grammar for if-statements--- grammarstatement : if_stmt | 'other'if_stmt : 'if' '(' exp ')' statement else_partelse_part : 'else' statement | ''exp : '0' | '1'--- first_setselse_part: '' 'else'exp: '0' '1'if_stmt: 'if'statement: 'if' 'other'--- follow_setselse_part: $ 'else'exp: ')'if_stmt: $ 'else'statement: $ 'else'=== TEST 8: grammar for statement sequences--- grammarstmt_sequence : stmt stmt_seqstmt_seq : ';' stmt_sequence | ''stmt : 's'--- first_setsstmt: 's'stmt_seq: '' ';'stmt_sequence: 's'--- follow_setsstmt: $ ';'stmt_seq: $stmt_sequence: $=== TEST 9: simple integer expression grammar w/o left recursion--- grammarexp: term exp_exp_: addop term exp_ | ''addop: '+' | '-'term: factor term_term_: mulop factor term_ | ''mulop: '*'factor: '(' exp ')' | /\d+/--- first_setsaddop: '+' '-'exp: '(' /\d+/exp_: '' '+' '-'factor: '(' /\d+/mulop: '*'term: '(' /\d+/term_: '' '*'--- follow_setsaddop: '(' /\d+/exp: $ ')'exp_: $ ')'factor: $ ')' '*' '+' '-'mulop: '(' /\d+/term: $ ')' '+' '-'term_: $ ')' '+' '-'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -