Seis
view release on metacpan or search on metacpan
pvip/src/pvip.y view on Meta::CPAN
N Terms 42 3.14 "eek" qq["foo"] $x :!verbose @$array
L Method postfix .meth .+ .? .* .() .[] .{} .<> .«» .:: .= .^ .:
N Autoincrement ++ --
R Exponentiation **
L Symbolic unary ! + - ~ ? | || +^ ~^ ?^ ^
L Multiplicative * / % %% +& +< +> ~& ~< ~> ?& div mod gcd lcm
L Additive + - +| +^ ~| ~^ ?| ?^
L Replication x xx
X Concatenation ~
X Junctive and & (&) â©
X Junctive or | ^ (|) (^) ⪠(-)
L Named unary temp let
N Structural infix but does <=> leg cmp .. ..^ ^.. ^..^
C Chaining infix != == < <= > >= eq ne lt le gt ge ~~ === eqv !eqv (<) (elem)
X Tight and &&
X Tight or || ^^ // min max
R Conditional ?? !! ff fff
R Item assignment = => += -= **= xx= .=
L Loose unary so not
X Comma operator , :
X List infix Z minmax X X~ X* Xeqv ...
R List prefix print push say die map substr ... [+] [*] any Z=
X Loose and and andthen
X Loose or or xor orelse
X Sequencer <== ==> <<== ==>>
N Terminator ; {...} unless extra ) ] }
*/
static int node_all_children_are(PVIPNode * node, PVIP_node_type_t type) {
int i;
for (i=0; i<node->children.size; ++i) {
if (node->children.nodes[i]->type != type) {
return 0;
}
}
return 1;
}
static char PVIP_input(char *buf, YY_XTYPE D) {
if (D.is_string) {
if (D.str->len == D.str->pos) {
return 0;
} else {
*buf = D.str->buf[D.str->pos];
D.str->pos = D.str->pos+1;
return 1;
}
} else {
char c = fgetc(D.fp);
*buf = c;
return (c==EOF) ? 0 : 1;
}
}
#define YY_INPUT(buf, result, max_size, D) \
result = PVIP_input(buf, D);
%}
comp_init = BOM? pod? e:statementlist - end-of-file {
$$ = (G->data.root = e);
}
| BOM? pod? ws* end-of-file { $$ = (G->data.root = PVIP_node_new_children(&(G->data), PVIP_NODE_NOP)); }
BOM='\357' '\273' '\277'
statementlist =
(
s1:statement {
$$ = PVIP_node_new_children(&(G->data), PVIP_NODE_STATEMENTS);
PVIP_node_push_child($$, s1);
s1 = $$;
}
(
- s2:statement {
PVIP_node_push_child(s1, s2);
$$=s1;
}
)* eat_terminator?
)
| ws+ { $$=NOP(); }
# TODO
statement =
- (
while_stmt
| use_stmt
| enum_stmt
| if_stmt
| for_stmt
| unless_stmt
| module_stmt
| multi_method_stmt
| die_stmt
| package_stmt
| has_stmt
| '...' { $$ = PVIP_node_new_children(&(G->data), PVIP_NODE_STUB); }
| funcdef - ';'*
| bl:block ';'*
| 'END' - b:block { $$ = PVIP_node_new_children1(&(G->data), PVIP_NODE_END, b) }
| 'BEGIN' - b:block { $$ = PVIP_node_new_children1(&(G->data), PVIP_NODE_BEGIN, b) }
| 'KEEP' ![-a-zA-Z0-9_] - e:expr { $$ = PVIP_node_new_children1(&(G->data), PVIP_NODE_KEEP, e); }
| 'UNDO' ![-a-zA-Z0-9_] - e:expr { $$ = PVIP_node_new_children1(&(G->data), PVIP_NODE_UNDO, e); }
| b:normal_or_postfix_stmt { $$ = b; }
| ';'+ {
$$ = PVIP_node_new_children(&(G->data), PVIP_NODE_NOP);
}
)
normal_or_postfix_stmt =
n:normal_stmt (
( ' '+ 'if' - cond_if:expr - eat_terminator ) { $$ = PVIP_node_new_children2(&(G->data), PVIP_NODE_IF, cond_if, n); }
| ( ' '+ 'unless' - cond_unless:expr - eat_terminator ) { $$ = PVIP_node_new_children2(&(G->data), PVIP_NODE_UNLESS, cond_unless, n); }
| ( ' '+ 'for' - cond_for:expr - eat_terminator ) { $$ = PVIP_node_new_children2(&(G->data), PVIP_NODE_FOR, cond_for, n); }
| ( ' '+ 'while' - cond_for:expr - eat_terminator ) { $$ = PVIP_node_new_children2(&(G->data), PVIP_NODE_WHILE, cond_for, n); }
| ( ' '+ 'until' - cond_for:expr - eat_terminator ) { $$ = PVIP_node_new_children2(&(G->data), PVIP_NODE_UNTIL, cond_for, n); }
| ( - eat_terminator ) { $$=n; }
)
package_stmt =
'package' ws+ pkg:pkg_name - blk:block {
$$ = CHILDREN2(PVIP_NODE_PACKAGE, pkg, blk);
}
enum_stmt =
( run in 1.297 second using v1.01-cache-2.11-cpan-99c4e6809bf )