📄 ll1_eval.t.svn-base
字号:
# LL1_eval.t# Test LL1::Evaluse Test::Base;use LL1_parser;use LL1_eval;plan tests => 2 * blocks() + 14;my $Ast;#$::LL1_TRACE = 1;#$::LL1::Table::Trace = 1;$::LL1_QUIET = 1;filters { offset => ['chomp'], error => ['chomp'],};run { my $block = shift; my $name = $block->name; my $parser = LL1::Parser->new; if ($block->grammar) { $Ast = $parser->parse($block->grammar); ok defined $Ast, "$name - grammar parsing okay"; } my $input = $block->input; #warn "BBB @$X::tokens"; my $match = LL1::Eval->eval($Ast, $input); #warn "!!! @$X::tokens"; if (defined $block->error) { ok !defined, "$name - input parsing failed as expected"; is( LL1::Eval->error, $block->error, "$name - input parsing diagnostics" ); is( LL1::Eval->offset(), $block->offset, "$name - input parsing offset" ); } else { ok defined $match, "$name - input parsing okay"; if (!defined $match and !defined $block->error) { warn "$name - input parsing error:\n ", LL1::Eval->error, "\n"; } is $X::pos, length($input), "$name - input buffer consumed"; if (defined $block->match) { is $match, $block->match, "$name - match object okay"; } }};__DATA__=== TEST 1: basic--- grammar# This is an identifieridentifier: /[A-Za-z]\w*/--- input foo32=== TEST 2:--- input 12--- errorWas expecting identifier, but found '12' instead--- offset0=== TEST 3:--- grammarS: '(' S ')' S | '' # empty token--- input()=== TEST 4:--- input ( )=== TEST 5:--- input(--- errorWas expecting ')', but found EOF instead--- offset1=== TEST 6:--- input() ( )=== TEST 7:--- input(( ) )=== TEST 8:--- input(()())()=== TEST 9: if statement--- grammar # rule for statement:statement: if_stmt | /\w+/ # other # rule for if_stmt:if_stmt : 'if' '(' exp ')' statement else_part # rule for else_part:else_part: 'else' statement | # rule for exp:exp : '0' | "1"--- inputif (0) other=== TEST 10:--- inputif (0) if (1) cry else laugh=== TEST 11: if statement grammar with bogus production order--- grammarstatement: /\w+/ | if_stmtif_stmt : 'if' '(' exp ')' statement else_partelse_part: "else" statement |exp : '0' | '1'--- inputif (0) other=== TEST 12: if statement grammar with bogus production order--- grammarstatement: /\w+/ | if_stmtif_stmt : 'if' '(' exp ')' statement else_partelse_part: "else" statement |exp : '0' | '1'<token: 'if' '(' ')' "else" '0' '1' /\w+/>--- inputif (0) other=== TEST 13: Logical expressions--- grammarroot: exprexpr: and_expr expr_expr_: 'OR' expr |and_expr: not_expr and_expr_and_expr_: 'AND' and_expr |not_expr: 'NOT' brack_expr | brack_exprbrack_expr: '(' expr ')' | atomatom: 'T' | 'F'--- inputF OR (T AND (F OR F)) OR F=== TEST 14:--- inputT=== TEST 15:--- inputF AND (T OR F--- errorWas expecting ')', but found EOF instead--- offset13=== TEST 16:--- inputNOT 32--- errorWas expecting brack_expr, but found '32' instead--- offset3=== TEST 17:--- inputNOT F=== TEST 18: equivalent regex conflicts--- grammarfloat: /\d+/ '.' /[0-9]+/--- input3.14=== TEST 19: equivalent regex conflicts (II)--- grammarassignment: var ':=' expvar: /[A-Za-z]\w*/exp: /\d+/ | /[a-zA-Z]\w*/--- inputa := b=== TEST 20: strings of common prefix--- grammarstmt: 'if' | varvar: /[A-Za-z]\w*/--- inputif_stmt=== TEST 21: lexer bug--- grammarif_stmt: var ':=' expr 'if' expr ';'var: /[A-Za-z]\w*/expr: /\d+/--- inputfoo := 32 if 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -